CUDA中的二维线程

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

我尝试在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 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