cuda 如何处理内核中的 __syncthreads()?

阿里·莫塔梅尼

认为我有一个 1024 大小的块,并假设我的 gpu 有 192 个 cuda 核心。当cuda核心大小小于块大小时,cuda如何处理内核中的__syncthreads()?

__global__ void staticReverse(int *d, int n)
{
  __shared__ int s[1024];
  int t = threadIdx.x;
  int tr = n-t-1;
  s[t] = d[t];
  __syncthreads();
  d[t] = s[tr];
}

“tr”如何保留在本地内存中?

天鹅座X1

我认为你正在混合一些东西。

首先,拥有 192 个 CUDA 核心的 GPU 是核心数。然而,每个块都映射到单个流式多处理器(SM),它的核心数可能较少(取决于 GPU 代)。

让我们假设您拥有一个 Pascal GPU,每个 SM 有 64 个内核,并且您有 3 个 SM。单个块映射到单个 SM。因此,您将有 64 个内核同时处理 1024 个线程这样的 SM 有足够的寄存器来保存 1024 个线程所需的所有数据,但它只有 64 个内核,可以快速交换它们正在处理的线程。

这样,所有本地数据(例如)tr都可以保留在内存中。

现在,由于这种快速交换和并发执行,可能会发生——完全是偶然的——某些线程领先于其他线程。如果您想确保在某个时刻所有线程都在同一位置,您可以使用__syncthreads(). 该函数所做的只是指示调度程序将工作正确分配给 CUDA 内核,以便它们在某个时刻都在程序中的那个位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章