我尝试构建一个2D块,并将所有x,y存储在一个二维数组中并将其转回主机。我的代码是:
#include <iostream>
#define N 95
__global__ void add(int *ch) {
int idx = (blockIdx.x * N) + (blockIdx.y * 2);
*(ch + idx) = blockIdx.x;
*(ch + ++idx) = blockIdx.y;
}
int main(void) {
int h_ch[N*N][2];
int *dev_ch;
cudaMalloc((void**)&dev_ch, sizeof(int[N*N][2]));
dim3 numBlocks(N,N);
add << <numBlocks, 1 >> > (dev_ch);
cudaMemcpy(h_ch, dev_ch, sizeof(int[N*N][2]), cudaMemcpyDeviceToHost);
for (int i = 0; i < N*N; i++) {
printf("%d-%d\n", h_ch[i][0], h_ch[i][1]);
}
cudaFree(dev_ch);
return 0;
}
据我所知,结果应该从0-0开始,最后到94-94,输出应该是95 * 95 = 9025行,但是,我只有大约4500行。 我改变了我的代码,看看x,y是如何改变的,x在0到94之间变化,并且每个数字按预期重复94次。 但是,y从51开始,最后到94,每个数字循环94次。你有什么问题?不应该像x一样变化吗?
答案 0 :(得分:2)
内核中的索引计算不正确。它应该是这样的:
__global__ void add(int *ch) {
int idx = (blockIdx.x * 2 * N) + 2 * blockIdx.y;
*(ch + idx) = blockIdx.x;
*(ch + ++idx) = blockIdx.y;
}