2013-03-16 85 views
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 
+0

这可能取决于你下一步要做什么。 – 2013-03-16 21:19:44

回答

1

总之,第二个应该总体上更快。该理由是如下:

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

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

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

-3

解决方案之一是faster.Cause 1000线程是操作系统的1000个任务其实巫共享一个任务地址space.The进程调度必须花费CPU.So的多少资源的CPU总是被打断。

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

+0

这是一个CUDA编程问题。你的答案完全不相关。 – talonmies 2013-03-16 09:04:28

+0

@talonmies对不起,我的英语不够好。 – philip 2013-03-16 09:38:09