想想我有一个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'留在当地记忆?
答案 0 :(得分:2)
我认为你混合了一些东西。
首先,具有192个CUDA核心的GPU是总核心数。然而,每个块都映射到单个流式多处理器(SM),它可能具有较低的核心数(取决于GPU生成)。
让我们假设你拥有一个Pascal GPU,每个SM有64个核心,你有3个 短信。 单个块映射到单个SM。因此,您将有64个核心同时处理1024个线程 。这样的SM有足够的寄存器来保存1024个线程的所有必要数据,但它只有64个内核,可以快速交换它们正在处理的线程。
这样所有本地数据,例如tr
可以留在记忆中。
现在,由于这种快速交换和并发执行,可能会发生 - 完全是偶然的 - 某些线程先于其他线程。如果您想确保在某一点上所有线程都位于同一位置,请使用__syncthreads()
。所有这些功能都是指示调度程序正确地将工作分配给CUDA核心,以便它们在某个时刻都在程序中的那个位置。