如果内核由于其他原因需要有y个线程,那么如何复制x大小的数组呢?我发现的所有示例都是复制线程数大小的数组,例如:
__global__ void staticReverse(int *d, int n)
{
__shared__ int s[64];
int t = threadIdx.x;
s[t] = d[t];
__syncthreads();
它看起来如何我需要我的[100000]而我需要用一个640个线程的块来启动我的内核?
它看起来如何我需要我的[100000]而我需要用10个64个线程的块启动我的内核?在这里我也很困惑,因为共享内存仅适用于1个块,所以我不明白其他块的线程如何复制到哪个块的共享内存中?
答案 0 :(得分:0)
它看起来如何我需要我的[100000]并且我需要用一个640个线程的块来启动我的内核?
不会。目前支持的CUDA硬件每个块的limit为48kb或96kb,因此具有100000个元素的整数共享阵列是非法的。
但总的来说,如果你有一个设计模式,每个线程需要加载一个以上数据点到共享内存,那么你会做这样的事情
__global__ void staticReverse(int *d, int n)
{
__shared__ int s[2048];
int t = threadIdx.x;
for(; t < 2048; t += blockDim.x) s[t] = d[t];
__syncthreads();
由于共享内存严格是块范围,因此必须使用类似上述设计模式的内容将数据加载到共享存储。显然,来自其他块的线程永远不能访问除了它们自己的块之外的任何共享内存。