CUDA中的二维线程
我尝试在CUDA中使用2D线程CUDA中的二维线程,cuda,gpu,Cuda,Gpu,我尝试在CUDA中使用2D线程threadIDx.x和blockIdx.x工作正常,但threadIDx.y和blockIdx.y不工作。.y的值总是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
threadIDx.x
和blockIdx.x
工作正常,但threadIDx.y
和blockIdx.y
不工作。.y的值总是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;
}
结果是一样的:.x个可以,但是.y个都是0。有人能帮我修一下吗?谢谢您将块和线程与尺寸混淆了
add
被解释为add
,其中M
是块数,N
是每个内核的线程数
如果您想让MxN
块具有MxN
线程,请调用add
我向初学者推荐,它对初学者非常友好
我想要M个块,每个块有N个线程
那么,add
是正确的,但是它是一维的,没有y
。如果要定位线程,请使用此代码
int index = threadIdx.x + blockDim.x * blockIdx.x
里面没有
y
。整个东西是1D。每个块只能有有限数量的线程(通常为64或128个),这就是线程和块分开的原因。它有很多细微差别。我会推荐Udacity课程,它对我帮助很大。谢谢,我会选择Udacity课程。但是我不希望使用MxN
线程的MxN
块。我想要M个块,每个块有N个线程。那么第一种类型的添加呢?我只是不明白为什么threadIdx.y
总是0,因为当第一个数字是标量时,您将启动1D网格。对于每个块,1D网格始终具有blockIdx.y
==0。当第二个数字是标量时,将启动1D threadblock。对于块中的每个线程,1D线程块始终具有threadIdx.y
==0。它是一维的,所以第二个线程维度始终为零。谢谢@RobertCrovella@RobertCrovella您的评论对我帮助很大
int index = threadIdx.x + blockDim.x * blockIdx.x