我想在GPU共享内存中加载一个大数组。 当我雇用那个就像吼叫:
1:int index = threadidx.x;
2:共享unsigned char x [1000];
3:x [i] = array [i];
然后,如果我们调用一个包含1000个线程和一个块的内核代码,那么每个线程都会发生内存访问? 是否可以通过一次内存访问加载此数组并将其加载到共享内存?
任何建议都将不胜感激。
答案 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();