GCC не может векторизовать 64-битное умножение. Можно ли векторизовать умножение с 64-битным x 64-битным -> 128-битным расширением на AVX2?
Я пытаюсь векторизовать CBRNG, который использует 64-битное умножение с расширением.
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t* hip) {
__uint128_t product = ((__uint128_t)a)*((__uint128_t)b);
*hip = product>>64;
return (uint64_t)product;
}
Существует ли такое умножение в векторизованном виде в AVX2?
1 ответ
Нет. Здесь нет 64 х 64 -> 128-битной арифметики в виде векторной инструкции. Также нет вектора mulhi
инструкция типа (высокий результат результата умножения).
[V] PMULUDQ может выполнять 32 x 32 -> 64 бита, рассматривая только каждый второй 32-битный беззнаковый элемент или двойное слово без знака в качестве источника и расширяя каждый 64-битный результат на два результирующих элемента, объединенных как беззнаковое четырехзначное слово.
Лучшее, на что вы можете надеяться сейчас, - это инструкция Haswell MULX, которая имеет более гибкое использование регистров и не влияет на регистр флагов - устраняя некоторые задержки.