c++ - cuda 将大于线程数的数组复制到共享内存

标签 c++ cuda shared-memory

如果内核出于某些其他原因需要 y 线程,那么某人将如何复制大小为 x 的数组。我找到的所有示例都是复制线程数大小的数组,例如:

__global__ void staticReverse(int *d, int n)
{
  __shared__ int s[64];
  int t = threadIdx.x;

  s[t] = d[t];
  __syncthreads();
  1. 如果我需要我的 s[100000] 并且我需要仅使用 1 个 640 线程 block 来启动我的内核,它会是什么样子?

  2. 如果我需要我的 s[100000] 并且我需要用 10 个 64 线程 block 启动我的内核,它会是什么样子?在这里我也很困惑,因为共享内存只用于 1 个 block ,所以我不明白其他 block 的线程如何复制到哪个 block 的共享内存?

最佳答案

How would it look If I need my s[100000] and I need to launch my kernel with just 1 block of 640 threads?

不会的。目前支持的 CUDA 硬件有一个 limit每 block 48kb 或 96kb,因此具有 100000 个元素的整数共享数组是非法的。

但一般来说,如果您有一种设计模式,其中有必要将每个线程的多个数据点加载到共享内存中,那么您会做这样的事情

__global__ void staticReverse(int *d, int n)
{
  __shared__ int s[2048];
  int t = threadIdx.x;

  for(; t < 2048; t += blockDim.x) s[t] = d[t];
  __syncthreads();

因为共享内存是严格的 block 范围,所以您必须使用类似上述设计模式的东西来将数据加载到共享存储。显然,来自其他 block 的线程永远无法访问除它们自己的 block 之外的任何共享内存。

关于c++ - cuda 将大于线程数的数组复制到共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47025523/

相关文章:

c++ - 当存在多个相同名称的类型时,在 gdb 中按名称指定正确的类型

c++ - 用wcout打印char*可以吗?

c++ - nvidia cuda访问gpu共享内存

opencv - EmguCV - 找不到 nvcuda.dll

linux - mmap 文件通过 nfs 共享?

c++ - 平移和缩放后更新 OpenGL 立方体?

c++ - 在 windows 中使用互斥量进行进程间同步(win32 或 C++)

CUDA 寄存器使用

c++ - 共享内存 STL 映射

haskell - 何时/为何使用 MVar 而不是 TVar