Кастинг с внутренностями AVX - PullRequest
0 голосов
/ 01 мая 2018

Существует два способа приведения в AVX2:

__m256i b = ...set register...
auto c = (__m256d)b; // version 1
auto d = _mm256_castsi256_pd(b); // version 2

Я предполагаю, что оба они должны давать одинаковые результаты. В официальном руководстве от Intel говорится, что для версии 2 существует нулевая задержка времени выполнения. Можно ли использовать версию 1 с предположением о нулевой задержке? Кроме того, я могу предположить, что приведение от любого к любому типу регистра с версией 1 имеет нулевую задержку.

1 Ответ

0 голосов
/ 10 мая 2018

По крайней мере, в gcc, «версия 1» - это именно то, как реализована «версия 2»:

extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm256_castsi256_pd (__m256i __A)
{
  return (__m256d) __A;
}

https://github.com/gcc-mirror/gcc/blob/gcc-8_1_0-release/gcc/config/i386/avxintrin.h#L1440

Clang по сути тот же: https://github.com/llvm-mirror/clang/blob/release_60/lib/Headers/avxintrin.h#L4449

Я не искал другие компиляторы, но я не предполагаю, что там тоже происходит какое-то волшебство.

Тем не менее, для переносимости и читабельности я бы предложил использовать _mm256_castsi256_pd или, если это слишком много написано, инкапсулировать это в вашу собственную (встроенную) функцию. Кастинги в стиле C относительно трудно найти в исходном коде, если вам когда-либо понадобится их рефакторинг.

...