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