1

一般来说,对于 GPU,哪种访问模式更快(从连续的全局内存块中读取数据)?

(1) 具有单个或非常少线程数的for循环从全局内存块中读取数据;

(2) 让很多线程,可能来自不同的块,同时从全局内存中读取数据。

例如

if (threadIdx.x==0)
{
  for (int i=0; i<1000; ++i)

     buffer[i]=data[i];//data is stored in global memory
}

OR:

buffer[threadIdx.x]=data[threadIdx.x];//there are 1000 threads in this thread block
4

2 回答 2

1

简而言之,第二个通常应该更快。理由如下:

有两种并行:线程级并行(TLP)和指令级并行(ILP)。您的第一个代码(循环)针对 ILP,第二个利用 TLP。

当 TLP 被利用时,许多内存请求同时发出,没有任何控制流依赖性。在这种情况下,硬件可以利用线程之间的局部性来减少总内存事务(在可能的情况下)。此外,硬件可以通过 L2-cache bank 并行、内存控制器并行、DRAM bank 并行和许多其他级别的并行来同时处理并发请求。

然而,在 ILP 的情况下,现有的控制依赖限制了并发发出的内存请求的数量。即使在循环展开的情况下也是如此(计分板大小和指令窗口大小等硬件资源限制了未完成的指令总数)。因此,许多内存请求实际上是不必要的序列化。此外,没有利用内存访问合并中的硬件能力。

于 2013-03-16T08:41:33.560 回答
-3

解决方案一更快。因为1000个线程实际上是1000个任务共享一个任务地址空间。操作系统的进程调度必须消耗大量CPU资源。所以CPU总是被中断。

如果你在一个任务中做这件事,CPU 总是处理一个任务。而且多核CPU可以处理得更好,但是1000线程太大了。

于 2013-03-16T08:44:42.527 回答