2011-05-05 65 views
1

我知道GPU通常具有较高的内存访问时间。然而,由于在等待内存访问时执行其他指令而导致访问时间“隐藏”,性能不会受到很大阻碍。GPU隐藏内存访问时间

我只是想知道,如果您有一个具有64个工作项目和16个处理器内核的波阵面,则每个处理器内核将拥有64/16 = 4工作项目。而且,所有内核必须并行执行所有工作项目。

因此,如果工作项需要内存访问,会发生什么?当然,因为所有的指令都是相同的,你将有16个内存访问来计算(或者只是1?)。那么是否每个核心的4个工作项目中的另一个被替换开始执行?这是否意味着所有16个处理器内核现在都在执行相同的新工作项目。

回答

4

你的问题相当以AMD为中心,这是一个我不那么流利的体系结构,但是NVIDIA架构采用了一种内存控制器设计,可以将DRAM访问请求融合为单个事务(NVIDIA的“内存合并”), 。

其基本思想是内存控制器会将位于小地址范围I内的请求融合到单个加载或存储中,以便为执行加载的SIMD组中的每个线程提供服务。最新的硬件支持32,64,128和256字节的事务大小,并且内存控制器也足够聪明,可以在访问的内存区域不与事务大小的边界对齐的情况下,将额外的单个字大小的ansaction添加到大型事务中。

0

你的问题很难回答,因为你混合的东西。有理论(抽象)实体,例如工作项和波前(据我所知,“Wavefront”= NVIDIA的术语中的“Warp”)以及诸如处理器和多处理器(nvidia)等物理部分。

理论抽象是为了使您的程序独立于底层硬件配置而发明的。因此,您不会为处理器的计算索引感到烦恼,该处理器将完成16处理器GPU的工作,然后为32处理器GPU执行新计算, 您只需考虑具有恒定大小的波前(warps) 。

让我们回到你的问题:

“我知道,一般的GPU具有高内存访问时间。然而,性能没有很大的访问时间是由执行其它指令‘隐藏’的阻碍。同时等待内存访问。“

实施例(它不是技术上是正确的,但作为一个例证):

假设我们正在做100个算术指令,然后遇到的存储器请求。在物理层面上,由warp/wavefront完成的指令执行是在几个硬件周期内完成的。这里的存储器操作是如何发:

Requested address : a, b, c, d, -, -, -, -, -, -, -, -, -, -, -, - 
Abstract WorkItems : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 
SIMD Hardware cores : 0, 1, 2, 3, -, -, -, -, -, -, -, -, -, -, -, - 

NVIDIA的经线需要4个周期来计算:

Requested address : a, b, c, d, e, f, g, h, -, -, -, -, -, -, -, - 
Abstract WorkItems : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 
SIMD Hardware cores : *, *, *, *, 0, 1, 2, 3, -, -, -, -, -, -, -, - 

允许跳过3-RD周期。

Requested address : a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p 
Abstract WorkItems : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 
SIMD Hardware cores : *, *, *, *, *, *, *, *, *, *, *, *, 0, 1, 2, 3 

在这4个周期内存储请求被累计。

根据请求的地址和硬件的智能程度,根据硬件规格合并这些请求。假设a..p0xFFF0..0xFFFF范围内按顺序排序,则所有请求将在一个合并内存操作中提供服务。如果硬件遇到不喜欢的地址(根据规格),它会将内存访问限制在几个内存操作中。

由于当前warp请求的内存操作,它暂停并且硬件将物理处理器切换到下一个warp。新的扭曲从100条指令开始,与前面的扭曲/波前完成相同。在遇到并发出记忆操作后,第二个warp/wavefront也会暂停。此时,根据您的工作组大小和其他参数,硬件可能会恢复之前的扭曲或继续下一个扭曲。

在内核执行期间warp的数量是恒定的,并且在主机开始执行之前计算,这意味着如果在内存请求之前没有这100条有用的指令,那么最终会让所有的warp处于暂停状态状态,这将导致硬件暂停和性能损失。