我正在尝试在CUDA中使用2D线程。 threadIDx.x和blockIdx.x工作正常,但threadIdx.y和blockIdx.y不起作用。 .y的是allaws 0.这是我的简单代码:
#define N 16
__global__ void add(int* a) {
int i=threadIdx.x;
int j=threadIdx.y;
a[i] = j;
}
int main(int argc, char **argv)
{
int a[N];
const int size = N*sizeof(int);
int *da;
cudaMalloc((void**)&da, size);
add<<<1, N>>>(da);
cudaMemcpy(a, da, size, cudaMemcpyDeviceToHost);
printf("Thread indices:\n");
for(int i=0;i<N;i++)
{
printf("%d ", a[i]);
}
cudaFree(da);
return 0;
}
a[i] = j;
或a[j] = j;
的结果
线程索引:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
并为a[i] = i;
线程索引:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
我试过用
#define M 4
#define N 4
...
int i = (blockDim.x * blockIdx.x) + threadIdx.x;
int j = (blockDim.y * blockIdx.y) + threadIdx.y;
...
add<<<M, N>>>(da);
...
结果是一样的:.x的很好但是.y都是0.任何人都可以帮我解决这个问题吗?谢谢
您将块和线程与尺寸混淆。
add <<<M,N>>>
被解释为add<<<dim3(M,1,1),dim3(N,1,1)>>>
,其中M
是块的数量,N
是每个内核的线程数。
如果你想让MxN
块与MxN
线程调用add<<<dim3(M,N),dim3(M,N)>>>
我会为初学者推荐Udacity CUDA course,它非常适合初学者。
我想要M块,每块有N个线程。
那么add<<<M,N>>>
是正确的,但它是1维,没有y
它。如果要查找线程,请使用此代码。
int index = threadIdx.x + blockDim.x * blockIdx.x
其中没有y
。整个事情是1D。每个块只能有有限数量的线程(通常为64或128),这就是线程和块分离的原因。它有很多细微差别。我会推荐Udacity课程,它帮助了我很多。