Intel AVX :256 -версия скалярного произведения для переменных двойной точности с плавающей запятой

Intel Advanced Vector Extensions (AVX )не предлагает скалярное произведение в 256 -битной версии (регистр YMM )для двойной точности переменные с плавающей запятой . "Почему?" Вопрос был очень кратко рассмотрен на другом форуме(здесь)и в Stack Overflow(здесь). Но вопрос, с которым я сталкиваюсь, заключается в том, как эффективно заменить эту отсутствующую инструкцию другими инструкциями AVX?

Скалярное произведение в 256 -битной версии существует для переменных одинарной точности с плавающей запятой(ссылка здесь):

 __m256 _mm256_dp_ps(__m256 m1, __m256 m2, const int mask);

Идея состоит в том, чтобы найти эффективный эквивалент для этой отсутствующей инструкции:

 __m256d _mm256_dp_pd(__m256d m1, __m256d m2, const int mask);

Чтобы быть более конкретным, код Я хотел бы преобразовать из__m128(четыре числа с плавающей запятой )в__m256d(4 числа с плавающей запятой )использовать следующие инструкции:

   __m128 val0 =...; // Four float values
   __m128 val1 =...; //
   __m128 val2 =...; //
   __m128 val3 =...; //
   __m128 val4 =...; //

   __m128 res = _mm_or_ps( _mm_dp_ps(val1,  val0,   0xF1),
                _mm_or_ps( _mm_dp_ps(val2,  val0,   0xF2),
                _mm_or_ps( _mm_dp_ps(val3,  val0,   0xF4),
                           _mm_dp_ps(val4,  val0,   0xF8) )));

Результатом этого кода является _m128вектор из четырех чисел с плавающей запятой, содержащий результаты точки произведения между val1и val0, val2и val0, val3и val0, val4и val0.

Может быть, это может дать подсказки для предложений?

24
задан Peter Mortensen 17 November 2017 в 23:34
поделиться