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

时间:2017-02-26 08:59:41

标签: cuda

想想我有一个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'留在当地记忆?

1 个答案:

答案 0 :(得分:2)

我认为你混合了一些东西。

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

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

这样所有本地数据,例如tr可以留在记忆中。

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

相关问题