关于全局内存访问方法

时间:2013-03-16 08:15:44

标签: c cuda gpu nvidia

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

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

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

e.g。

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

2 个答案:

答案 0 :(得分:1)

简而言之,第二个应该更快一般。遵循理由:

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

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

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

答案 1 :(得分:-3)

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

如果您在一项任务中执行该操作,则CPU始终处理一项任务。 并且多核CPU可以更好地处理,但是1000个线程太大了。