Есть ли способ использовать функцию OpenCL C mad в Vulkan SPIR-V? - PullRequest
1 голос
/ 24 июня 2019

Как мы знаем, есть как минимум 2 способа вычисления a * b + c:

  1. ret := a*b; ret := ret + c;

  2. ret := fma(a, b, c);

Но в OpenCL C есть третья функция, называемая «безумной», которая меняет точность на производительность.

В LunarG sdk компилятор SPIR-V по умолчанию компилирует языки шейдинга GLSL и HLSL, а функция "mad" не упоминается в спецификации GLSL v4.60.

Как мне использовать "безумную" функцию в Vulkan?

1 Ответ

2 голосов
/ 24 июня 2019

Здесь есть небольшое недоразумение.

Слияние с умножением не означает меньшую точность.Это может означать немного другое число, чем если бы вы применили умножение, а затем добавили vs fma, из-за внутренних различий в точности аппаратных средств, сохраняемых между этапами операции.По этой причине в некоторых API / языках автоматический FMA не включен по умолчанию и появляется только тогда, когда в компиляторе используется быстрый математический или специальный флаг.Могут быть системы, в которых это приводит к худшей точности, но это не то, что подразумевается.

Однако в SPIR-V, хотя, похоже, нет особой инструкции для FMA, спецификация явно предсказывает и допускает ее после компиляции сборки SPIR-V -> gpu.Он даже имеет NoContraction украшение на языке.

NoContraction Применить к арифметической инструкции, чтобы указать, что операция не может быть объединена с другой инструкцией для формирования одной операции. Например, при применении к OpFMul это умножение не может быть объединено с добавлением для получения операции слияния с умножением-сложением. Кроме того, таким операциям не разрешается повторно связывать;например, add (a + add (b + c)) не может быть преобразован в add (add (a + b) + c).

Обратите внимание, что SPIR-V - это не конец.вашего шейдера.Это только портативное промежуточное представление вашего шейдера, которое затем дополнительно компилируется вашими продавцами.Ни одна машина не запускает SPIR-V напрямую.Эти виды оптимизаций оставлены для выполнения драйвером, а не для программиста.Обычно можно предположить, что такая оптимизация будет происходить при соответствующих условиях, то же самое относится и к другим языкам программирования, в которых отсутствует явная встроенная функция FMA.

...