Исходные данные журнала 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
.