关于全局内存访问方法
问题描述:
一般来说,对于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
答
总之,第二个应该总体上更快。该理由是如下:
有两种并行:线程级并行(TLP )和指令级并行(ILP )。你的第一个代码(循环)以ILP和第二个漏洞利用TLP为目标。
当TLP被利用,许多内存发出请求同时没有任何控制流的依赖性。在这种情况下,硬件可以利用线程间的局部性来减少总内存事务(如果可能的话)。而且,硬件可以通过L2高速缓存存储体并行机制,存储器控制器并行机制,DRAM存储体并行机制以及许多其他级别的并行机制同时处理并发请求。
然而,在ILP情况下,现有的控制依赖性限制了并发发出的存储器请求的数目。即使在循环展开的情况下(记分板尺寸和指令窗口大小等硬件资源限制了总体未完成指令),情况也是如此。所以,许多内存请求实际上是不必要的序列化。此外,内存访问合并中的硬件功能未被利用。
这可能取决于你下一步要做什么。 – 2013-03-16 21:19:44