你的问题很难回答,因为你混合的东西。有理论(抽象)实体,例如工作项和波前(据我所知,“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..p
在0xFFF0..0xFFFF
范围内按顺序排序,则所有请求将在一个合并内存操作中提供服务。如果硬件遇到不喜欢的地址(根据规格),它会将内存访问限制在几个内存操作中。
由于当前warp请求的内存操作,它暂停并且硬件将物理处理器切换到下一个warp。新的扭曲从100条指令开始,与前面的扭曲/波前完成相同。在遇到并发出记忆操作后,第二个warp/wavefront也会暂停。此时,根据您的工作组大小和其他参数,硬件可能会恢复之前的扭曲或继续下一个扭曲。
在内核执行期间warp的数量是恒定的,并且在主机开始执行之前计算,这意味着如果在内存请求之前没有这100条有用的指令,那么最终会让所有的warp处于暂停状态状态,这将导致硬件暂停和性能损失。