CUDA中的2D线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CUDA中的2D线程相关的知识,希望对你有一定的参考价值。

我正在尝试在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:
");
    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课程,它帮助了我很多。

以上是关于CUDA中的2D线程的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 估计每个块的线程数和 2D 网格数据的块数

CUDA 小核 2d 卷积 - 怎么做

弄清楚一个 cuda 内核有多少块和线程,以及如何使用它们

cuda-sdk 的 nbody 代码中的线程管理

CUDA中的几种并行计算模型

CUDA中的几种并行计算模型