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);
          }
      }
相关推荐
北辰alk17 分钟前
2025:当Vibe Coding成为我的创意画布——一名前端工程师的AI元年记
前端·trae
jump_jump31 分钟前
SaaS 时代已死,SaaS 时代已来
前端·后端·架构
Yanni4Night1 小时前
Parcel 作者:如何用静态Hermes把JavaScript编译成C语言
前端·javascript·rust
hellokatewj1 小时前
前端 Promise 全解:从原理到面试
前端
天意pt1 小时前
Blog-SSR 系统操作手册(v1.0.0)
前端·vue.js·redis·mysql·docker·node.js·express
遗憾随她而去.1 小时前
Webpack5 高级篇(一)
前端
疯狂踩坑人2 小时前
【React 19 尝鲜】第一篇:use和useActionState
前端·react.js
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于VUE的打车系统的设计与实现为例,包含答辩的问题和答案
前端·javascript·vue.js
用户39051332192882 小时前
JS判断空值只知道“||”?不如来试试这个操作符
前端·javascript
海云前端12 小时前
前端面试必问 asyncawait 到底要不要加 trycatch 90% 人踩坑 求职加分技巧揭秘
前端