OpenCL:NVIDIA 的向量寄存器 (float4,float8,..) VS Intel 的向量寄存器
Posted
技术标签:
【中文标题】OpenCL:NVIDIA 的向量寄存器 (float4,float8,..) VS Intel 的向量寄存器【英文标题】:OpenCL: NVIDIA's vector registers (float4,float8,..) VS Intel's vector registers 【发布时间】:2012-03-03 17:36:20 【问题描述】:我知道对于 Intel,向量寄存器已经过优化,例如SandyBridge 微架构 (SSE+AVX),但 NVIDIA 的 GPU 怎么样?
我在某处读到的一些资料(我忘了在哪里)说使用向量寄存器对 NVIDIA 的 GPU 毫无用处。但是我有一个测试运行在 GPU 上运行一个带有向量寄存器的程序,并与没有它们的程序进行比较,他们确实给了我apx。 1.7 倍加速。
仅供参考,英特尔的 CPU 仅对同一程序提供 1.25 倍的加速。
如果 NVIDIA 确实优化了这些向量寄存器,有人可以给我一个解释或阅读来源吗?我需要它作为文档。谢谢。
【问题讨论】:
NVIDIA GPU 性能改进的可能来源是内存吞吐量。硬件可以在每个多处理器上的单个事务中对 64 位和 128 位类型进行存储和加载,从而减少总体延迟并提高有效吞吐量。 感谢您的回复。你的意思是 16 个装载/存储单元?每个单元可以在每个扭曲中加载/存储 128 位类型吗? (因此使其成为 16x128)。如果不是,我认为情况并非如此。因为隐式向量寄存器的使用(convert_floatn、vloadn 等)确实有所作为。它提供了更好的加速。 是的。每个 warp 硬件可以处理 256 和 512 字节的事务大小。这可以在任何给定的占用水平下导致更高的带宽利用率。请参阅these slides(note pdf) 的幻灯片 35,了解 CUDA 中的 memcpy 内核示例,该示例说明了效果。 太棒了!感谢您的帮助和参考!这正是我需要的 好的,如果你愿意接受的话,我会用我的 cmets 来回答。 【参考方案1】:NVIDIA GPU 性能改进的可能来源是内存吞吐量。硬件可以在每个多处理器上的单个事务中对 32、64 和 128 位类型进行存储和加载,从而减少总体延迟并提高有效吞吐量。硬件可以为每个 warp 处理 128、256 和 512 字节的事务大小,因此可以在单个事务中处理适当对齐的 float2
对 warp 的加载/存储请求,并在两个事务中处理 float4
加载/存储请求。这可以在任何给定的占用级别上导致更高的全局内存带宽利用率。请参阅来自加州大学伯克利分校的 Vasily Volkov 的 this presentation 幻灯片 35,了解 CUDA 中的 memcpy 内核示例,该示例说明了类型大小(以及生成的事务大小)对内存吞吐量的影响。
【讨论】:
您是否建议 GPU 实际上没有在 float4/... 上使用 SIMD 指令进行计算? @eudoxos:NVIDIA 的 DX10/DX11 硬件(可以运行 CUDA 和 OpenCL)上的 ALU 没有 SIMD 算术指令来操作像float4
这样的向量类型。它们是纯标量设备。唯一可以直接对矢量类型执行的操作是通过纹理硬件加载/存储和过滤。以上是关于OpenCL:NVIDIA 的向量寄存器 (float4,float8,..) VS Intel 的向量寄存器的主要内容,如果未能解决你的问题,请参考以下文章