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, которая имеет более гибкое использование регистров и не влияет на регистр флагов - устраняя некоторые задержки.

Другие вопросы по тегам