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 的向量寄存器的主要内容,如果未能解决你的问题,请参考以下文章

Nvidia GEForce 上的 OpenCL 示例程序问题

OpenCl 寄存器的幻数

OpenCL中的popcnt?

NVIDIA OpenCL 设备版本

NVIDIA 硬件的 OpenCL 1.2 何时可用?

如何让 OpenCl 看到 intel 和 nvidia 设备?