Vulkan 浮点行为问题

problem with vulkan floating point behavior

提问人:JLo 提问时间:2/5/2020 最后编辑:CommunityJLo 更新时间:2/6/2020 访问量:1100

问:

我尝试实现论文 Extended-Precision Floating-Point Numbers 阿尔玛学院的 Andrew Thall 在 GLSL Vulkan 计算着色器中进行的 GPU 计算。 我需要这个,因为我的某些设备不支持双精度。

我的问题出在quickTwoSum函数中

vec2 quickTwoSum( float a , float b) {
    float s = a + b;
    float t = s - a;
    float e = b - t;
    return vec2(s, e);
}

例如

a = 114251.609
b = -0.00107500004

然后发生这种情况

s = 114251.609 // this is correct because b is to small
t = -0.00107500004 // <= why? (s - a) should be 0 
e = 0.0 // <= this is wrong because t is wrong

为什么 t 不正确?GPU 在后台的存储似乎比 32 位浮点变量实际可以容纳的更精确。

是GPU问题吗?我使用的是 NVIDIA GeForce GT 750M。 在我的 CPU 上,这应该如何工作。

我找到了为 OpenGL https://www.thasler.com/blog/blog/glsl-part2-emu 实现它的人。因此,它也应该在 GPU 上运行。

如果有人能帮助我就好了。

更新

这是我的程序文件

cbc.com:GLSL 着色器

glsl_compiler_output.txt:glslangValidator 的输出

cbc_comp.spv:编译为 SPIR-V 的着色器

main.cpp:是一个曼德布洛特 Vulkan 计算示例,我根据需要进行了更改

vulkantest_output.txt:我的程序的输出

浮点 GLSL 精度 Vulkan

评论

3赞 Eric Postpischil 2/6/2020
你能检查编译器生成的指令吗?也许它正在优化它认为多余的算术。
0赞 Krupip 2/6/2020
你能告诉我们你是如何调试的吗?顺便说一句,非常好的问题。
0赞 Krupip 2/6/2020
另外要澄清一下@EricPostpischil的观点,因为 t 与 a + b -a 相同,因此 fastmath 优化编译器理论上可以将这样的语句编译为 b,但这会违反编译器对非 fastmath 编译的保证。除非您使用的是 spirv 优化器,否则我认为这将在供应商方面(即它甚至可能不会出现在 SPIR-V 中)。
0赞 tigertang 2/6/2020
也许编译器正在优化它。
0赞 JLo 2/6/2020
@whn我已添加文件。

答: 暂无答案