初学CUDA问几个简单的问题


为b[10][8]开辟2维的数组空间这样写对不对:
cudaMallocPitch((void**)&dev_b,&pitch, 8 * sizeof(int),10);

将数组b[10][8]从主机复制到设备这样写对不对:
cudaMemcpy2D(dev_b,pitch, b,8* sizeof(int) ,8* sizeof(int),10,cudaMemcpyHostToDevice);

将数组dev_b[10][8]从主机复制到设备这样写对不对:
cudaMemcpy2D(b,sizeof(int)*8, dev_b,pitch,sizeof(int)*8,10,cudaMemcpyDeviceToHost);

目测第三句有问题。
cudaError_t cudaMemcpy2D (void *dst, size_t dpitch,
const void *src, size_t spitch, size_t width, size_t
height, cudaMemcpyKind kind)

Copies data between host and device.

Parameters
dst

  • Destination memory address

dpitch

  • Pitch of destination memory

src

  • Source memory address

spitch

  • Pitch of source memory

width

  • Width of matrix transfer (columns in bytes)

height

  • Height of matrix transfer (rows)

kind

  • Type of transfer

LZ您好:

1:您上述三条如果是对应使用的,并保证各参数是合适的,那么用法是正确的。(其中第三条是从device到host,您应该是笔误)

2:cudaMallocPitch会引入强制的对齐机制,这样不免会浪费一些存储空间,以及按照您每行只放8个int的用量,这样浪费的空间较多。对于现在主流的GPU(计算能力2.0及以上),对对齐的要求已经大为降低,所以您也可以直接申请一段连续的存储空间,并将您的二维数组一维化存储。

大致如此,各函数详情请您参阅手册。

祝您好运~