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

cuda如何在内核中处理uuu syncthreads()?,cuda,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”

假设我有一个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。因此,您将有64个内核同时处理1024个线程。这样的SM有足够的寄存器来保存1024个线程的所有必要数据,但它只有64个内核,可以快速交换正在处理的线程

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


现在,由于这种快速交换和并发执行,一些线程可能会超过其他线程,这完全是偶然的。如果要确保在某一点上所有线程都在同一点上,可以使用
\uuu syncthreads()
。该功能所做的只是指示调度程序正确地将工作分配给CUDA内核,以便它们在某个时刻都在程序中的某个位置。

我认为您在混合一些东西

首先,拥有192个CUDA内核的GPU是内核总数。但是,每个块都映射到一个流式多处理器(SM),该处理器可能具有较低的内核计数(取决于GPU的生成)

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

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

现在,由于这种快速交换和并发执行,一些线程可能会超过其他线程,这完全是偶然的。如果要确保在某一点上所有线程都在同一点上,可以使用
\uuu syncthreads()
。该函数所做的只是指示调度器正确地将工作分配给CUDA内核,以便它们在某个时刻都位于程序中的该位置