10

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

使用适用于 Linux 的 Intel Intrinsics Guide 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 的一部分实现的。

4

2 回答 2

11

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

如果您想使用非英特尔编译器但想要快速实现对数,您可以查看使用 AVX的和函数的开源实现sin()cos()exp()log()。它们基于相同功能的早期SSE2 版本

于 2013-09-11T19:21:55.297 回答
2

我在_mm256_log_pd(__m256d)这里发布了我的实现:https ://stackoverflow.com/a/45898937/1915854 。通过一些努力,您应该能够将其扩展到 8 个 packed floats 而不是 4 doubles,尽管您需要修改位操作。有些部分很容易,因为您不需要将奇数/偶数 32 位组件重新打包__m256i__m128i.

于 2017-08-26T19:32:16.170 回答