Исходные данные журнала AVX (_mm256_log_ps) отсутствуют в g ​​++ - 4.8?

Я пытаюсь использовать некоторые атрибуты AVX в своем коде и столкнулся с кирпичной стеной с внутренними свойствами логарифма.

Используя Intel Intrinsics Guide v3.0.1 для Linux, я вижу, что встроенный _mm256_log_ps(__m256) указан как часть "immintrin.h", а также поддерживается моей текущей архитектурой.

Однако попытка скомпилировать этот простой тестовый пример завершается ошибкой: "error:" _mm256_log_ps не был объявлен в этой области "

Пример был скомпилирован с g++-4.8 -march=native -mavx test.cpp

#include <immintrin.h>
int main()
{
        __m256 i;
        _mm256_log_ps(i);
}

Я пропустил что-то фундаментальное здесь? Являются ли определенные встроенные функции не поддерживаемыми g++ и доступны только в icc?

SOLVED: эта инструкция не является истинным внутренним, но вместо этого реализована как часть Intel SVML для ICC.

Ответ 1

Как указано в комментариях к вашему вопросу, это внутреннее не отображает фактическую инструкцию AVX; это расширение Intel для встроенного набора. В реализации, вероятно, используются многие основные инструкции, поскольку логарифм не является тривиальной операцией.

Если вы хотите использовать компилятор не Intel, но хотите выполнить быструю логарифмическую реализацию, вы можете проверить эту реализацию с открытым исходным кодом sin(), cos(), exp() и log() с использованием AVX. Они основаны на более ранней версии SSE2 тех же функций.

Ответ 2

Я опубликовал мою реализацию _mm256_log_pd(__m256d) здесь: fooobar.com/info/24095/.... С некоторыми усилиями вы сможете расширить его до 8 упакованных float вместо 4 double s, хотя вам нужно пересмотреть бит-манипуляции. Некоторые части являются упрощенными, потому что вам не нужно переупаковывать 32-битные компоненты с четными/четными номерами __m256i в __m128i.