Я пытаюсь реализовать статью Числа с плавающей запятой расширенной точности для вычислений на GPU Эндрю Таллом, Алма-колледж в вычислительном шейдере GLSL Vulkan. Мне это нужно, потому что некоторые из моих устройств не поддерживают двойную точность.
Моя проблема в функции 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. На моем процессоре это работает так, как должно.
И я нашел кого-то, кто реализовал это для OpenGL https://www.thasler.com/blog/blog/glsl-part2-emu. Так что это должно работать и на GPU.
Было бы неплохо, если бы кто-нибудь мне помог.
ОБНОВЛЕНИЕ :
Вот мои программные файлы
cb c .com : glsl shader
glsl_compiler_output.txt : вывод glslangValidator
cbc_comp.spv : шейдер, скомпилированный в SPIR-V
main. cpp: был пример вычисления Мандельброта Вулкана, который я изменил для своих нужд
vulkantest_output.txt : вывод моей программы