GCC не может векторизовать 64-битное умножение. Может 64-битный х 64-битный — & gt; 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?

4

Решение

Нет. Здесь нет 64 х 64 -> 128-битной арифметики в виде векторной инструкции. Также нет вектора mulhi инструкция типа (высокий результат результата умножения).

[V] PMULUDQ может выполнять 32 x 32 -> 64 бита, рассматривая только каждый второй 32-битный беззнаковый элемент или двойное слово без знака в качестве источника и расширяя каждый 64-битный результат на два результирующих элемента, объединенных как четырехзначное без знака.

Лучшее, на что вы, вероятно, можете надеяться сейчас, — это инструкция Haswell MULX, которая имеет более гибкое использование регистров и не влияет на регистр флагов — устраняя некоторые задержки.

3

Другие решения


По вопросам рекламы [email protected]