【问题标题】:AVX log intrinsics (_mm256_log_ps) missing in g++-4.8?g++-4.8 中缺少 AVX 日志内在函数 (_mm256_log_ps)?
【发布时间】:2013-09-15 20:47:05
【问题描述】:

我正在尝试在我的代码中使用一些 AVX 内在函数,但遇到了对数内在函数的障碍。

使用适用于 Linux 的英特尔内部指南 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 的一部分实现的。

【问题讨论】:

  • 你能看到那个函数,或者immintrin.h中的任何类似名称的函数吗?
  • 我不相信数学函数是 SSE/AVX 内在集的正式一部分。这些可能是英特尔编译器中包含的 MKL 扩展。
  • @nneonneo 否,并且在任何相关的 gcc 标头中都没有。
  • @Mysticial 我担心可能是这种情况。
  • @Mystical 它们实际上是 SVML 函数。 SVML(短向量数学库)是英特尔编译器提供的一个微型库。

标签: c++ g++ intrinsics avx


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2016-04-26
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多