GPU隐藏内存访问时间

时间:2011-05-05 15:02:41

标签: cuda opencl gpu gpu-programming

我知道GPU通常具有较高的内存访问时间。但是,由于在等待内存访问时执行其他指令“隐藏”访问时间,因此性能不会受到很大影响。

我只是想知道,如果你有一个64个工作项的wavefront和16个处理器内核,每个处理器内核将有64/16 = 4个工作项。此外,所有核心必须并行执行所有工作项。

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

2 个答案:

答案 0 :(得分:4)

你的问题是以AMD为中心,这是一个我不太流利的架构,但NVIDIA架构使用的内存控制器设计可以将DRAM访问请求融合到单个事务中(NVIDIA中的“内存合并”)。

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

答案 1 :(得分:0)

你的问题很难回答,因为你混合了一些东西。有理论(抽象)实体,如工作项和波前(据我所知,“Wavefront”= NVpIA术语中的“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的warp需要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个周期。

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..p在范围0xFFF0..0xFFFF内按顺序排序,则所有请求将在一个合并的内存操作中提供。如果硬件遇到它不喜欢的地址(根据规范),它会将内存访问权限制成几个内存操作。

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

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