CUDA-将二维数组从主机传输到设备
Posted
技术标签:
【中文标题】CUDA-将二维数组从主机传输到设备【英文标题】:CUDA-transfer 2D array from host to device 【发布时间】:2012-02-21 07:49:42 【问题描述】:我主要有一个二维矩阵。我想从主机转移到设备。您能告诉我如何为它分配内存并将其传输到设备内存吗?
#define N 5
__global__ void kernel(int a[N][N])
int main(void)
int a[N][N];
cudaMalloc(?);
cudaMemcpy(?);
kernel<<<N,N>>>(?);
【问题讨论】:
【参考方案1】:也许你真正想到的是这样的:
#define N 5
__global__ void kernel(int *a)
// Thread indexing within Grid - note these are
// in column major order.
int tidx = threadIdx.x + blockIdx.x * blockDim.x;
int tidy = threadIdx.y + blockIdx.y * blockDim.y;
// a_ij = a[i][j], where a is in row major order
int a_ij = a[tidy + tidx*N];
int main(void)
int a[N][N], *a_device;
const size_t a_size = sizeof(int) * size_t(N*N);
cudaMalloc((void **)&a_device, a_size);
cudaMemcpy(a_device, a, a_size, cudaMemcpyHostToDevice);
kernel<<<N,N>>>(a_device);
你可能错过的一点是,当你静态声明一个像A[N][N]
这样的数组时,它实际上只是一个row major ordered 线性内存。编译器在发出代码时会自动在a[i][j]
和a[j + i*N]
之间进行转换。在 GPU 上,您必须使用第二种访问形式来读取您从主机复制的内存。
【讨论】:
感谢 Mark 的错字修复。没有仔细看就从原始帖子中复制它们。 您不应该在cudaMemcpy
通话中从主机复制到设备吗?以上是关于CUDA-将二维数组从主机传输到设备的主要内容,如果未能解决你的问题,请参考以下文章