认为我有一个 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”如何保留在本地内存中?
我认为你正在混合一些东西。
首先,拥有 192 个 CUDA 核心的 GPU 是总核心数。然而,每个块都映射到单个流式多处理器(SM),它的核心数可能较少(取决于 GPU 代)。
让我们假设您拥有一个 Pascal GPU,每个 SM 有 64 个内核,并且您有 3 个 SM。单个块映射到单个 SM。因此,您将有 64 个内核同时处理 1024 个线程。这样的 SM 有足够的寄存器来保存 1024 个线程所需的所有数据,但它只有 64 个内核,可以快速交换它们正在处理的线程。
这样,所有本地数据(例如)tr
都可以保留在内存中。
现在,由于这种快速交换和并发执行,可能会发生——完全是偶然的——某些线程领先于其他线程。如果您想确保在某个时刻所有线程都在同一位置,您可以使用__syncthreads()
. 该函数所做的只是指示调度程序将工作正确分配给 CUDA 内核,以便它们在某个时刻都在程序中的那个位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句