В идеале вы можете разместить свои входные данные, чтобы вы могли просто выполнять 16x FMA с источником широковещательной памяти (из каждого элемента вектора), то есть матрицу, уже транспонированную. Тогда результатом будет вектор скалярных произведений строки x столбца между вашими входами 16x16 и 16x1.
(На самом деле 1 vmulps и 15x FMA. Или, возможно, лучше, проявите некоторый параллелизм на уровне инструкций, начав с 2 или 4 простых умножений, и объедините только эти цепочки зависимостей FMA в конце. Это потребует дополнительно vaddps
для каждого дополнительного векторного аккумулятора, но сократит задержку критического пути и снизит нагрузку на выполнение вне очереди за счет отсутствия цепочки зависимостей задержки 16 * 4 цикла, которую он мог бы попытаться скрыть.)
При использовании только AVX, а не AVX512, широковещательная загрузка не может использоваться в качестве операнда источника памяти для инструкции FMA, но по-прежнему стоит всего 1 однократную инструкцию (vbroadcastss ymm, [mem]
). Но на самом деле это не имеет значения, если оба операнда все равно берутся из памяти; компилятор может просто выбрать выполнение широковещательной загрузки отдельно и использовать полный вектор строки в качестве операнда источника памяти.
В противном случае вы не хотите отдельно _mm512_reduce_add_ps
каждый вектор; вместо этого транспонируйте и складывайте пары векторов с 2x _mm512_hadd_ps
(с 2 разными векторами каждый раз), а затем вручную перемешивайте и складывайте, пока вы не уменьшите 16x __m512
до одного __m512
, где каждый элемент является горизонтальной суммой одного из исходных 16 векторов.
Во втором случае, я думаю, вам просто нужно прямо _mm512_mul_ps
между вашим вектором и строкой матрицы; не к чему добавить.
_mm512_reduce_add_ps
не является отдельной машинной инструкцией; обычно он компилируется в 4x перемешивание + 4x vaddps
.
Для сравнения, 2 перемешивания для подачи каждого добавления для уменьшения при перемешивании должны объединить 16 векторов до 1 из 8 + 4 + 2 + 1 = 15 всего сложений (и Всего 30 перемешиваний) вместо 16 * (4,4)
person
Peter Cordes
schedule
17.07.2020