проблема с вулканским поведением с плавающей точкой - PullRequest
9 голосов
/ 05 февраля 2020

Я пытаюсь реализовать статью Числа с плавающей запятой расширенной точности для вычислений на 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 : вывод моей программы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...