GPU 上整数和按位运算的性能

Posted

技术标签:

【中文标题】GPU 上整数和按位运算的性能【英文标题】:Performance of integer and bitwise operations on GPU 【发布时间】:2012-01-30 19:23:00 【问题描述】:

虽然 GPU 应该用于浮点数据类型,但我对 GPU 处理按位运算的速度感兴趣。这些是 CPU 上最快的,但 GPU 是模拟按位运算还是完全在硬件上计算?我打算在用 GLSL 编写的着色器程序中使用它们。另外我想如果按位运算具有完整的性能,整数数据类型也应该具有,但我需要对此进行确认。

更准确地说,目标版本是 OpenGL 3.2 和 GLSL 1.5。应该运行它的硬件是任何 Radeon HD 显卡和 GeForce 系列 8 及更高版本。如果新版本的 OpenGL 和 GLSL 有一些与按位运算/整数处理速度相关的重大变化,我会很高兴你我会指出来的。

【问题讨论】:

您需要指定特定的 GPU 架构,或至少指定 OpenGL 版本。现在这个问题非常模糊。 @BenVoigt 已更新,是否足够精确,或者您需要特定的架构代号(它们会像每张新卡一样更改它们) Raven:Radeon HD 1xxx 和 HD 7xxx 之间有一些巨大的变化,但额外的信息是一个很大的改进。假设您正在查看宣传 OpenGL 3.2 支持(或更高版本)的卡片,这可能已经足够清楚了。 【参考方案1】:

此问题已部分回答 Integer calculations on GPU

简而言之,现代 GPU 对 32 位数据具有同等的 INT 和 FP 性能。因此,您的逻辑操作将以相同的速度运行。

从编程的角度来看,如果您正在处理 SCALAR 整数数据,您将失去性能。 GPU 喜欢使用 PARALLEL 和 PACKED 操作。

for(int i=0; i<LEN_VEC4; i++)
    VEC4[i] = VEC4[i] * VEC4[i]; // (x,y,z,w) * (x,y,z,w)

如果你正在做类似...

for(int i=0; i<LEN_VEC4; i++)
    VEC4[i].w = (VEC4[i].x & 0xF0F0F0F0) | (VEC4[i].z ^ 0x0F0F0F0F) ^ VEC4[i].w;

...对同一向量的元素执行许多不同的操作会遇到性能问题。

【讨论】:

感谢您的回答。结合链接的帖子就足够了,但我还有一个问题。如前所述,INT 和 FP 性能应该相同。但是对于 FP 来说,没有什么能像按位运算(或者至少这样做会很奇怪)。那么他们在说什么是平等的......添加等等?如果是这种情况,对于 INT 数据类型,按位运算(例如移位)是否比数学运算(添加..)更快,或者性能也相同。 “X bit shift left by 1”是否比“x + x”快是相当依赖于架构的。我希望在编译您的 shadar 时会发生一些优化(除非您在 GPU 程序集中编写它)。 "X 除以 2" 比 "X 位移右 1" 慢,只是因为除法涉及的逻辑比位移多。 “GPU 喜欢使用 PARALLEL 和 PACKED 操作。” NVidia 和 AMD 的最新 GPU 是标量架构。因此,纯标量运算的性能实际上高于向量运算。 @datenwolf 很高兴知道,但我可以支持这样一个事实,即至少在 openGL 3.2 中,他们正在使用打包格式。我在构建大量变量时注意到这一点,并且标量和 4D 向量的最大大小相同。我唯一能得出的结论是所有数据都存储在向量中。正如您所说,对于最现代的 GPU,这应该有所不同。 GPU 不是标量 - 它们在所有可能执行的操作上进行矢量化。使用向量不会获得任何额外的向量化收益,除了非常非常少的不包含一般浮点操作的指令;因为 GPU 上的每个“线程”实际上都是一个 SIMD 通道。

以上是关于GPU 上整数和按位运算的性能的主要内容,如果未能解决你的问题,请参考以下文章

HSQL 和按位运算?

非负整数的基数排序(按位)

python-opencv-图像的按位运算

java位运算

有没有办法在 AVX 上模拟 _m256 类型的整数按位运算?

128 位整数之间的按位运算