Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance GPU上整数和位运算的性能_Performance_Opengl_Bit Manipulation_Glsl_Gpu - Fatal编程技术网

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

Performance GPU上整数和位运算的性能,performance,opengl,bit-manipulation,glsl,gpu,Performance,Opengl,Bit Manipulation,Glsl,Gpu,虽然GPU应该与浮点数据类型一起使用,但我对GPU处理逐位运算的速度感兴趣。这些是CPU上最快的,但GPU是模拟按位操作还是完全在硬件上计算?我计划在用GLSL编写的着色器程序中使用它们。我还假设,如果按位操作具有完整的性能,则整数数据类型也应该具有完整的性能,但我需要对此进行确认 更准确地说,目标版本是OpenGL 3.2和GLSL 1.5。应运行此功能的硬件是任何Radeon HD图形卡和GeForce系列8及更新版本。。如果OpenGL和GLSL的较新版本在位运算/整数的处理速度方面有一些

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


更准确地说,目标版本是OpenGL 3.2和GLSL 1.5。应运行此功能的硬件是任何Radeon HD图形卡和GeForce系列8及更新版本。。如果OpenGL和GLSL的较新版本在位运算/整数的处理速度方面有一些重大变化,我很高兴您能指出这些变化。

这个问题得到了部分回答

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


从编程的角度来看,如果处理标量整数数据,您将失去性能。GPU喜欢处理并行和打包操作

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您需要指定一个特定的GPU体系结构,或者至少是OpenGL版本。现在这个问题非常模糊。@BenVoigt更新了,它是否足够精确,或者您需要体系结构的特定代码名(它们会像每一张新卡一样更改它们)瑞文:Radeon HD 1xxx和HD 7xxx之间有一些巨大的变化,但这些额外的信息是一个很大的改进。假设您正在寻找宣传OpenGL 3.2支持(或更高版本)的卡,这可能已经足够清楚了。谢谢你的回答。结合linked post就足够了,但我还有一个问题。如前所述,INT和FP的性能应该是相同的。但是FP没有什么比按位操作更好的了(或者至少做起来会很奇怪).那么他们说什么是相等的..相加等等?如果是这样的话,INT数据类型的按位运算(例如移位)是否比数学运算(相加..)快,或者性能也相等。“X位左移1”是否比“X+X”快非常依赖于体系结构。我希望编译着色器时会出现一些优化(除非在GPU汇编中编写)。“X除以2”比“X位右移1”在源代码中要慢,因为除法比位移位涉及的逻辑更多。“GPU喜欢使用并行和压缩操作。”NVidia和AMD最新的GPU是标量架构。因此纯标量操作的性能实际上高于向量操作。@datenwolf很高兴知道,但我可以支持这样一个事实,即至少在openGL 3.2中,它们使用的是压缩格式。我在构建大量变量和最大ize对于标量和4D向量是一样的。我能得出的唯一结论是,所有数据都存储在向量中。正如你所说,对于大多数现代GPU来说,这应该是不同的。GPU不是标量的——它们在所有可能的操作上都是向量化的。除了非常,v之外,使用向量不会获得任何额外的向量化收益很少有指令不包括一般的浮点操作;因为gpu上的每个“线程”实际上都是一个SIMD通道。
for(int i=0; i<LEN_VEC4; i++)
    VEC4[i].w = (VEC4[i].x & 0xF0F0F0F0) | (VEC4[i].z ^ 0x0F0F0F0F) ^ VEC4[i].w;