g ++ - 4.8中缺少AVX日志内在函数(_mm256_log_ps)?

时间:2013-09-11 17:36:35

标签: c++ g++ intrinsics avx

我正在尝试在我的代码中使用一些AVX内在函数,并且遇到了对数内在函数的砖墙。

使用适用于Linux的英特尔intrinsics指南v3.0.1,我看到内部_mm256_log_ps(__m256)被列为“immintrin.h”的一部分,并且在我目前的拱门上也得到了支持。

然而,尝试编译这个简单的测试用例失败了“错误:'_ mm256_log_ps'未在此范围内声明”

该示例是使用g++-4.8 -march=native -mavx test.cpp

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

我错过了一些基本的东西吗?某些内在函数是否不受g ++支持且仅在icc中可用?

已解决:此指令不是真正的内在指令,而是作为ICC的英特尔SVML的一部分实现。

2 个答案:

答案 0 :(得分:9)

如您对问题的评论所示,该内在函数未映射到实际的AVX指令;它是英特尔对内在集的扩展。实现可能使用许多底层指令,因为对数不是一个简单的操作。

如果您想使用非英特尔编译器但需要快速对数实现,则可以查看this open-source implementation of sin(), cos(), exp(), and log() functions using AVX。它们基于相同功能的早期SSE2 version

答案 1 :(得分:1)

我已将_mm256_log_pd(__m256d)的实施方式发布在此处:https://stackoverflow.com/a/45898937/1915854。通过一些努力,您应该能够将其扩展到8个打包float而不是4个double,尽管您需要修改位操作。有些部分是简单的,因为您不需要将__m256i的奇数/偶数32位组件重新打包到__m128i