Здесь есть небольшое недоразумение.
Слияние с умножением не означает меньшую точность.Это может означать немного другое число, чем если бы вы применили умножение, а затем добавили 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.