当前位置: 首页 > article >正文

cuda的3DArray和TextureObject

  • cudaArray_t:数据存储的对象,用于存储 2D 或 3D 数据;不涉及纹理的采样(即读取数据时的插值、过滤等操作)。
     cudaExtent ca_extent;//定义三维内存区域的结构体
     ca_extent.width = vol_in->dim[0];
     ca_extent.height = vol_in->dim[1];
     ca_extent.depth = vol_in->dim[2];
     cudaChannelFormatDesc ca_descriptor = cudaCreateChannelDesc<float>();//定义cudaArray的数据格式,shape和type
     cudaMalloc3DArray(&state->dev_vol, &ca_descriptor, ca_extent);//分配三维数据块
 cudaMemcpy3DParms cpy_params = { 0 };//三维内存拷贝操作参数的结构体
 cpy_params.extent = ca_extent; //定义三维内存区域的结构体
 cpy_params.kind = cudaMemcpyHostToDevice; // 拷贝类型(主机到设备、设备到设备等)
 cpy_params.dstArray = state->dev_vol;// 目标数组,和 dstPtr 互斥使用

 //http://sites.google.com/site/cudaiap2009/cookbook-1#TOC-CUDA-3D-Texture-Example-Gerald-Dall
 // The pitched pointer is really tricky to get right. We give the
 // pitch of a row, then the number of elements in a row, then the
 // height, and we omit the 3rd dimension.
 cpy_params.srcPtr = make_cudaPitchedPtr((void*)vol_in->data, ca_extent.width * sizeof(float), ca_extent.width, ca_extent.height);// 源指针,和 srcArray 互斥使用

 cudaMemcpy3D(&cpy_params);//把vol数据拷贝到显存
  • cudaTextureObject_t:纹理对象;包含数据的地址信息,还包括了如何访问这些数据的元数据(如过滤模式、边界处理、坐标转换等)。高效的图像处理支持自动插值,只读操作
 // Specify texture
 struct cudaResourceDesc resDesc;//描述资源(如数组、纹理、表面等)的结构体
 memset(&resDesc, 0, sizeof(resDesc));
 resDesc.resType = cudaResourceTypeArray;//资源是一个 3D 数组。
 resDesc.res.array.array = state->dev_vol;// 3D 数组资源

 // Specify texture object parameters
 struct cudaTextureDesc texDesc;//描述纹理(texture)对象属性的结构体
 memset(&texDesc, 0, sizeof(texDesc));
 texDesc.addressMode[0] = cudaAddressModeWrap;//当坐标超出边界时,纹理坐标会循环回到起始位置。
 texDesc.addressMode[1] = cudaAddressModeWrap;//当坐标超出边界时,纹理坐标会循环回到起始位置。
 texDesc.filterMode = cudaFilterModeLinear;//当纹理坐标落在两个像素之间时使用最近邻插值。
 texDesc.readMode = cudaReadModeElementType;//按纹理的元素类型读取
 texDesc.normalizedCoords = 0;//纹理坐标范围通常是像素索引

 state->tex_vol = 0;//只读纹理内存
 cudaCreateTextureObject(&state->tex_vol, &resDesc, &texDesc, NULL);
  • cudaSurfaceObject_t。适合需要频繁修改数据,适合需要频繁修改数据,读写操作
 // Specify texture
 struct cudaResourceDesc resDesc;//描述资源(如数组、纹理、表面等)的结构体
 memset(&resDesc, 0, sizeof(resDesc));
 resDesc.resType = cudaResourceTypeArray;//资源是一个 3D 数组。
 resDesc.res.array.array = state->dev_vol;// 3D 数组资源

 cudaCreateSurfaceObject(&surfObj, &resDesc);
    __global__ void cuda_clear_3d_array_kernel(cudaSurfaceObject_t surf, dim3 kdim)
    {
        // calculate surface coordinates
        unsigned int x = blockIdx.x * blockDim.x + threadIdx.x;
        unsigned int y = blockIdx.y * blockDim.y + threadIdx.y;
        unsigned int z = blockIdx.z * blockDim.z + threadIdx.z;

        // write to memeory
        if (x < kdim.x && y < kdim.y && z < kdim.z) {
            surf3Dwrite<float>(0.f, surf, x * 4, y, z, cudaBoundaryModeTrap);
        }
    }


http://www.kler.cn/a/392704.html

相关文章:

  • NodeMCU驱动28BYJ-48型步进电机(Arduino)
  • 【我的世界】起床战争攻略
  • 百度千帆平台构建AI APP的基础概念梳理
  • 实现点击表格中的邀请码并复制到剪贴板的功能
  • CTF MISC 简单的脚本的撰写 -- 进制转换篇
  • 层序遍历练习
  • PHP搭建开发环境(Windows系统)
  • 代码随想录算法训练营第二十九天| 134. 加油站 、135. 分发糖果 、860.柠檬水找零、406.根据身高重建队列。c++转java
  • 本地权限提升漏洞分析
  • Bootstrap 5 轮播
  • Proteus中数码管动态扫描显示不全(已解决)
  • 微积分复习笔记 Calculus Volume 1 - 5.3 The Fundamental Theorem of Calculus
  • 【ChatGPT】通过Prompt技巧优化ChatGPT的营销文案输出
  • 【优选算法篇】化繁为简,见素抱朴:从乱象中重构秩序的艺术
  • 用于在 .NET 中构建 Web API 的 FastEndpoints 入门
  • python私有化get和set的使用
  • 【实用教程】使用思维导图增强 JavaScript甘特图项目工作流程的可见性
  • 如何制作代购系统的用户管理模块
  • 免费白嫖:数据分析常用软件安装视频
  • http(s)接口设计注意事项
  • 【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据
  • 下载并安装Cmake3.29.5 windows安装包
  • HTTP常见的请求头有哪些?都有什么作用?在 Web 应用中使用这些请求头?
  • cmake生成器表达式
  • WordPress 6.7 “Rollins”发布
  • 成本400元,DIY一个高刷新率热成像相机