【发布时间】:2013-09-02 05:03:06
【问题描述】:
我正在尝试将二维数组传递给内核,以便每个线程都可以访问 index = threadIdx.x + (blockIdx.x * blockDim.x) 但我无法弄清楚如何执行此操作如何将数据复制回来。
size_t pitch;
cudaMallocPitch(&d_array, &pitch, block_size * sizeof(int), num_blocks);
cudaMemset2D(d_array, pitch, 0, block_size * sizeof(int), num_blocks * sizeof(int));
kernel<<<grid_size, block_size>>>(d_array, pitch);
cudaMemcpy2D(h_array, pitch, d_array, pitch, block_size, num_blocks, cudaMemcpyDeviceToHost);
for (num_blocks)
for(block_size)
h_array[block][thread] should be 1
__global__ void kernel(int *array, int pitch) {
int *row = (int*)((char*)array + blockIdx.x * pitch);
row[threadIdx.x] = 1;
return;
}
我做错了什么,在这里?
【问题讨论】:
-
为什么要将数组转换为 (char*) ?这将导致错误的指针算法
-
@LarryPel:不,不会。间距以字节为单位,需要一个指向字节大小类型的指针才能正确执行指针运算。
-
请提供一个完整的、可编译的程序。不要让我们玩什么是“block_size”,什么是“grid_size”等20个问题。