Кажется, я поняла, зачем это сделали. https://www.pcper.com/images/reviews/272/sm2-dgemm.gif
Соревнования процессоров по части скорости арифметики с плавающей точкой обычно происходят на тесте из пакета матричной алгебры, когда вычисляются "бенчмарки", дающие преимущество то одному, то другому процессору. В самом деле, а где еще взять тест на интенсивную арифметику с плавающей точкой? - Только здесь! Тогда как для оценки других параметров производительности существуют другие тесты (например, на популярных компьютерных играх). Ну, а конкретно обычно гоняют тест по функции GEMM (General Matrix Multiplication), которая в своем double-варианте называетcя DGEMM. Типичный пример сравнения процессоров:
https://www.pcper. …iews/272/sm2-dgemm.gif
По той же причине бодание между Intel и AMD тоже идет именно по этому тесту, т.к. прочие тесты производительность по флоат-арифметике правильно оценить не могут, поскольку в прочих программах она используется изредка.
К несчастью, функция GEMM написана вычурно - она не просто перемножает две матрицы, как это обычно требуется:
Result = Matrix1 * Matrix2.
а еще и прибавляет к ней третью матрицу, умноженную на скалярный коэффициент. Вот так:
Result = Matrix1 * Matrix2 + Coeff * Matrix3.
Такая же ерунда имеет место и в функции умножения матрицы на вектор - только там прибавляется не матрица, а вектор, умноженный на коэффициент.
Такова уж особенность алгебраических пакетов, что там многие функции сделаны "на вырост", чтобы минимизировать общее число функций в пакете.
Меня в свое время это ужасно злило, т.к. из-за таких добавок найти нужную функцию было не просто, но потом (когда большинство из них запомнила) привыкла и поняла, что функция GEMM для работы вполне годится, если выставить ей в параметрах нуль вместо коэффициента и нулевой поинтер в качестве третьей матрицы.
Однако если гонять тест GEMM по полной (т.е. вкупе со сложением с третьей матрицей), то тут та самая нелепая FMA4 как раз и даст преимущество, т.к. благодаря 4-м аргументам, способна выполнить умножение сопряженное со сложением третьего члена, одной командой:
Reg0 = Reg0 + Reg1 * Reg2 + Reg3
Т.е. я полагаю, что AMD пошла на вариант FMA4 только затем, чтобы получить избыточные бенчмарки на DGEMM-тесте.