使用宽度(以字节为单位)的cudaMemcpy3D中的参数无效?

pQB*_*pQB 5 cuda

我做了一个简单的texture3D测试,并在将数据复制到设备时发现了一种奇怪的行为.函数cudaMemcpy3D返回'无效参数'.

我发现问题与cudaExtent有关.根据CUDA工具包参考手册4.0,cudaExtent参数如下:

  • w - 以字节为单位的宽度
  • h - 元素的高度
  • d - 元素的深度

所以,我准备了如下纹理:

// prepare texture 
cudaChannelFormatDesc t_desc = cudaCreateChannelDesc<baseType>();
// CUDA extent parameters w - Width in bytes, h - Height in elements, d - Depth in elements
cudaExtent t_extent = make_cudaExtent(NCOLS*sizeof(baseType), NROWS, DEPTH);
// CUDA arrays are opaque memory layouts optimized for texture fetching
cudaArray *i_ArrayPtr = NULL;
// allocate 3D
status = cudaMalloc3DArray(&i_ArrayPtr, &t_desc, t_extent);
Run Code Online (Sandbox Code Playgroud)

并配置3D参数如下:

// prepare input data
cudaMemcpy3DParms i_3DParms = { 0 };
i_3DParms.srcPtr   = make_cudaPitchedPtr( (void*)h_idata, NCOLS*sizeof(baseType), NCOLS, NROWS);
i_3DParms.dstArray = i_ArrayPtr;
i_3DParms.extent   = t_extent;
i_3DParms.kind     = cudaMemcpyHostToDevice;
Run Code Online (Sandbox Code Playgroud)

最后将数据复制到设备内存:

// copy input data from host to device
status = cudaMemcpy3D( &i_3DParms );
Run Code Online (Sandbox Code Playgroud)

如果我只将x维度中的元素数量指定为:

cudaExtent t_extent = make_cudaExtent(NCOLS, NROWS, DEPTH);
Run Code Online (Sandbox Code Playgroud)

不会产生任何错误,测试工作符合预期.

我想知道我是否错过了cudaExtent函数或其他东西.为什么width参数不需要以字节表示

tal*_*ies 6

对于CUDA数组,使用数组元素中给定的宽度指定范围.对于分配线性内存,使用以字节为单位指定的宽度指定范围.因为要分配数组cudaMalloc3DArray,所以使用元素中的宽度.如果您使用cudaMalloc3D,范围将具有以字节为单位的宽度.