C++ 在CUDA中高效初始化共享内存阵列

C++ 在CUDA中高效初始化共享内存阵列,c++,memory,cuda,shared,C++,Memory,Cuda,Shared,请注意,此共享内存阵列从不写入,只从中读取 正如我所拥有的,我的共享内存初始化如下: __shared__ float TMshared[2592]; for (int i = 0; i< 2592; i++) { TMshared[i] = TM[i]; } __syncthreads(); \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu; 对于(int i=0;i

请注意,此共享内存阵列从不写入,只从中读取

正如我所拥有的,我的共享内存初始化如下:

__shared__ float TMshared[2592]; 
for (int i = 0; i< 2592; i++)
{
TMshared[i] = TM[i];

}
__syncthreads();
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
对于(int i=0;i<2592;i++)
{
TMshared[i]=TM[i];
}
__同步线程();
(TM从内核启动传递到所有线程)

您可能已经注意到,这是非常低效的,因为没有并行化,同一块中的线程正在写入同一位置

鉴于所讨论的共享阵列相对较小,是否有人可以推荐一种更有效的方法/评论,说明此问题是否真的需要优化


谢谢

使用所有线程写入独立位置,可能会更快

示例假定1D螺纹块/网格:

#define SSIZE 2592

__shared__ float TMshared[SSIZE]; 

  int lidx = threadIdx.x;
  while (lidx < SSIZE){
    TMShared[lidx] = TM[lidx];
    lidx += blockDim.x;}

__syncthreads();
#定义SSIZE 2592
__共享浮点数共享[SSIZE];
int lidx=threadIdx.x;
而(lidx
使用所有线程编写独立的位置,可能会更快

示例假定1D螺纹块/网格:

#define SSIZE 2592

__shared__ float TMshared[SSIZE]; 

  int lidx = threadIdx.x;
  while (lidx < SSIZE){
    TMShared[lidx] = TM[lidx];
    lidx += blockDim.x;}

__syncthreads();
#定义SSIZE 2592
__共享浮点数共享[SSIZE];
int lidx=threadIdx.x;
而(lidx
不错。“#define SSIZE 2592”的确切位置在哪里?在cu文件的顶部,在全局内核之外?另外,使用#define有什么意义?与只在适当的位置显式编码数字2592相比,它是否具有优势?是的,定义通常位于文件的顶部,尽管我很确定您可以将其放在任何位置(在代码中使用之前的任何位置)。与2592相比,define没有明确的代码或性能优势。但是,如果我更改共享内存阵列的大小,我只需要在一个地方更改它。很好。“#define SSIZE 2592”的确切位置在哪里?在cu文件的顶部,在全局内核之外?另外,使用#define有什么意义?与只在适当的位置显式编码数字2592相比,它是否具有优势?是的,定义通常位于文件的顶部,尽管我很确定您可以将其放在任何位置(在代码中使用之前的任何位置)。与2592相比,define没有明确的代码或性能优势。但是,如果我更改共享内存阵列的大小,我只需要在一个地方更改它。