2011-10-31 75 views
2

这里是我的问题:我有一大堆双打(它是77.500双打数组)存储在cuda的某处。现在,我需要一大组线程来按顺序对该数组执行一堆操作。每个线程必须读取该数组的SAME元素,执行任务,将结果存储在共享内存中,并读取数组的下一个元素。请注意,每个线程将同时从同一个内存位置读取(只读)。所以我想知道:是否有任何方法只用一个内存读取就可以向所有线程广播同一个double?多次阅读将是无用的...任何想法?CUDA:将相同的内存位置传输到所有线程

回答

3

这是一个常见的优化。这样做是为了使与它blockmates每个线程合作,要读取的数据:

// 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窗口(或者一些整数因子更多)在一个时间元素消耗整个东西。当你想以同步的方式存储数据时,同样的技术也适用。

+2

另外:从共享内存广播(即让块中的所有线程读取相同的内存位置)是一种快速的情况。 N-body问题的CUDA实现将广播与Jared在此描述的惯用语结合使用。 – ArchaeaSoftware

相关问题