CUDA:将相同的内存位置传输到所有线程

时间:2011-10-31 21:11:31

标签: cuda broadcast

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

1 个答案:

答案 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(或者可能更多整数因素)元素上迭代地“滑动”窗口以消耗整个事物。当您希望以同步方式存储数据时,也适用相同的技术。