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

CUDA:将相同的内存位置流式传输到所有线程,cuda,broadcast,Cuda,Broadcast,这里是我的问题:我有一个相当大的双打集(它是一个77.500双打的数组)要存储在cuda的某个地方。现在,我需要一大组线程来顺序地使用该数组执行一系列操作。每个线程都必须读取该数组的相同元素,执行任务,将结果存储在共享内存中,并读取该数组的下一个元素。请注意,每个线程都必须同时从同一内存位置读取(仅读取)。所以我想知道:有没有办法只读取一次内存就向所有线程广播相同的双线程?读很多遍都没用。。。有什么想法吗???这是一个常见的优化。这样做的目的是让每个线程与其块伙伴协作来读取数据: // choo

这里是我的问题:我有一个相当大的双打集(它是一个77.500双打的数组)要存储在cuda的某个地方。现在,我需要一大组线程来顺序地使用该数组执行一系列操作。每个线程都必须读取该数组的相同元素,执行任务,将结果存储在共享内存中,并读取该数组的下一个元素。请注意,每个线程都必须同时从同一内存位置读取(仅读取)。所以我想知道:有没有办法只读取一次内存就向所有线程广播相同的双线程?读很多遍都没用。。。有什么想法吗???

这是一个常见的优化。这样做的目的是让每个线程与其块伙伴协作来读取数据:

// 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
  ...
}

您可以一次迭代地将窗口“滑动”到数组
块大小
(或者某个整数因子以上)元素上,以消耗整个内容。当您希望以同步方式存储数据时,同样的技术也适用。

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