这是我的问题:我有很多双打(它是一个77.500双打的阵列)存放在cuda的某个地方。现在,我需要一大组线程来顺序对该数组执行一系列操作。每个线程都必须读取该数组的SAME元素,执行任务,将结果存储在共享内存中并读取数组的下一个元素。请注意,每个线程都必须同时从同一个内存位置读取(只读取)。所以我想知道:有没有办法只用一个内存读取广播相同的双线程到所有线程?多次阅读会毫无用处......任何想法?
答案 0 :(得分:4)
这是一种常见的优化方式。我们的想法是让每个线程与其囚犯合作来读取数据:
// choose some reasonable block size
const unsigned int block_size = 256;
__global__ void kernel(double *ptr)
{
__shared__ double window[block_size];
// cooperate with my block to load block_size elements
window[threadIdx.x] = ptr[threadIdx.x];
// wait until the window is full
__syncthreads();
// operate on the data
...
}
您可以一次在数组block_size
(或者可能更多整数因素)元素上迭代地“滑动”窗口以消耗整个事物。当您希望以同步方式存储数据时,也适用相同的技术。