Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
CUDA共享引擎盖下的记忆问题_Cuda - Fatal编程技术网

CUDA共享引擎盖下的记忆问题

CUDA共享引擎盖下的记忆问题,cuda,Cuda,关于CUDA共享内存,我有几个问题 首先,共享内存可能以两种不同的方式声明: 动态分配共享内存,如下所示 // Lunch the kernel dynamicReverse<<<1, n, n*sizeof(int)>>>(d_d, n); 或静态共享内存,可在内核调用中使用,如下所示: __shared__ int s[64]; 两者的使用原因不同,但哪一个更好,为什么 其次,我正在运行一个多块内核,每个块内核有256个线程。我在全

关于CUDA共享内存,我有几个问题

首先,共享内存可能以两种不同的方式声明:

动态分配共享内存,如下所示

   // Lunch the kernel 
   dynamicReverse<<<1, n, n*sizeof(int)>>>(d_d, n);
或静态共享内存,可在内核调用中使用,如下所示:

   __shared__ int s[64];
两者的使用原因不同,但哪一个更好,为什么

其次,我正在运行一个多块内核,每个块内核有256个线程。我在全局内核和设备内核中使用静态共享内存,它们都使用共享内存。举例如下:

 __global__ void startKernel(float* p_d_array) 
 {
    __shared double matA[3*3];

    float a1 =0 ; 
    float a2 = 0;
    float a3 = 0; 
    float b = p_d_array[threadidx.x]; 

    a1 += reduce( b, threadidx.x); 
    a2 += reduce( b, threadidx.x); 
    a3 += reduce( b, threadidx.x); 

    // continue... 
  }

  __device__ reduce ( float data , unsigned int tid) 
 {
     __shared__ float data[256]; 
      // do reduce ...   
 }
我想知道在这种情况下如何分配共享内存。我假设每个块都有自己的共享内存

当块0进入reduce函数时会发生什么

共享内存是否提前分配给函数调用

我调用了三个不同的reduce设备函数,在这种情况下,理论上在块#0中,线程#[0127]仍然可以在第一次reduce调用时执行(“延迟由于硬字”),而线程#[128255]可以在第二次reduce调用时操作。在这种情况下,我想知道两个reduce函数是否使用相同的共享内存

即使它们是从两个不同的函数调用中调用的

另一方面,单个块是否可能为两个函数调用分配3*256*sizeof(float)共享内存?这在CUDA的礼仪中似乎是多余的,但我仍然想知道CUDA在这种情况下是如何运作的

第三,由于使用了编译器优化,是否有可能在共享内存中获得更高的性能

  const float* p_shared ; 

或者在数据分配部分之后限制关键字?

AFAIR,无论是“动态”还是“静态”请求共享内存,都没有什么区别——在这两种情况下,它都只是一个内核启动参数,可以由您的代码设置,也可以由编译器生成的代码设置


Re:2,编译器将对内核函数和内核调用的函数的共享内存需求求和。

在编译时已知所需共享内存的大小时,使用静态声明的共享内存。当所需共享内存的大小在运行时已知时,可以使用随机分配的共享内存。
  const float* p_shared ;