如何有效地将大数组加载到GPU共享内存?

时间:2014-09-22 14:25:35

标签: c cuda shared-memory memory-access

我想在GPU共享内存中加载一个大数组。 当我雇用那个就像吼叫:

1:int index = threadidx.x;

2:共享unsigned char x [1000];

3:x [i] = array [i];

然后,如果我们调用一个包含1000个线程和一个块的内核代码,那么每个线程都会发生内存访问? 是否可以通过一次内存访问加载此数组并将其加载到共享内存?

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

不能通过一次访问完成。

正如您所示,并行使用线程加载共享内存是最快的方法。共享内存可以由CUDA内核中的线程执行的内存操作加载。没有用于加载共享内存的API函数。

如果您的数组大于线程块中的线程数,则可以使用类似于here概述的循环方法。

答案 1 :(得分:0)

通常,范例是在块上使用for循环。请记住,共享内存仅在块之间共享,因此如果共享内存大于块数,则需要有一个奇特的循环。

在内核的开头,有类似的东西。

//loadbuff is a T*, T is whatever type you want
//sharedmemsize is some (compile time) constant
__shared__ T sharedmem[sharedmemsize]; 
int index = threadidx.x;
int blocksize = blockDim.x;

for (int i = index; i < sharedmemsize; i+=blocksize)
{
   sharedmem[i]=loadbuff[i];
}
__syncthreads();