在CUDA中有效初始化共享内存数组

Efficiently Initializing Shared Memory Array in CUDA

本文关键字:共享 内存 数组 初始化 有效 CUDA      更新时间:2023-10-16

请注意,这个共享内存数组永远不会被写入,只会被读取。

当我拥有它时,我的共享内存被初始化为:

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

(TM从内核启动传递到所有线程)

你可能已经注意到,这是非常低效的,因为没有并行化,并且同一块内的线程都在写相同的位置。

有人可以推荐一个更有效的方法/评论,如果这个问题真的需要优化,因为所讨论的共享数组相对较小?

谢谢!

使用所有线程来写独立的位置,这样可能会更快。

示例假设一维threadblock/grid:

#define SSIZE 2592
__shared__ float TMshared[SSIZE]; 
  int lidx = threadIdx.x;
  while (lidx < SSIZE){
    TMShared[lidx] = TM[lidx];
    lidx += blockDim.x;}
__syncthreads();