Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cuda将大于线程数的数组复制到共享内存_C++_Cuda_Shared Memory - Fatal编程技术网

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

C++ cuda将大于线程数的数组复制到共享内存,c++,cuda,shared-memory,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(); 如果我需要我的s[100000],并且只需要一块640个线程就可以启动我的内核,那会是什么样子 如果我需要我的s[10000

如果内核出于其他原因需要有y个线程,那么如何复制大小为x的数组呢。我发现的所有示例都是复制线程数大小的数组,例如:

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

  s[t] = d[t];
  __syncthreads();
  • 如果我需要我的s[100000],并且只需要一块640个线程就可以启动我的内核,那会是什么样子

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

  • 如果我需要我的s[100000],并且只需要一块640个线程就可以启动我的内核,那会是什么样子

    不会的。当前支持的CUDA硬件每个块的大小为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();
    
    \uuuu全局\uuuuu无效静态反转(int*d,int n)
    {
    __共享_____;int s[2048];
    int t=threadIdx.x;
    对于(;t<2048;t+=blockDim.x)s[t]=d[t];
    __同步线程();
    

    因为共享内存是严格的块作用域,所以必须使用类似于上述设计模式的方式将数据加载到共享存储。显然,来自其他块的线程除了自己的块之外,永远无法访问任何其他块的共享内存。

    谢谢您的回答。我仍然不明白的是,在上面的示例中(如果我使用64个线程,那么blockDim.x是32)我使用32块64向共享内存写入2048个整数。这个“实例”会共享内存的大小将被创建32次,这样每个块都会有自己的2048数组?如果我只使用2048个线程来基本复制32*2048个整数,我该怎么做?@user3338991:我完全不理解你的评论。如果你有一个1D线程块,它有64个线程,那么blockDim.x将是64。每个块都有自己的独立sha红色内存分配,只能由同一块中的其他线程访问。如果我需要复制2048 int,并且有一个包含64个线程的1D线程块,那么我需要blockDim.x 32?(2048/64=32)。“每个块都有自己的独立共享内存分配,只能由同一块中的其他线程访问。”-所以我基本上有32个块,所有块在它的独立共享内存中都有自己的2048大数组,因此总共有32个共享内存,2048个整数。如果我只复制了32*64=2048次,并且在32个共享内存中得到32*2048,那怎么可能呢?似乎我误解了一些基本原则。