【问题标题】:_mm_shuffle_ps not declared even though header included_mm_shuffle_ps 未声明,即使包含标头
【发布时间】:2014-09-03 00:30:01
【问题描述】:

有时(并非总是)当我在项目中包含我的数学头文件时,编译器会抱怨(尝试使用 gcc 和 clang)_mm_shuffle_ps_mm_shuffle_pd 未声明,即使所有编译器标志都已设置(-msse -msse2 -msse3)和包含正确的标题 (<x86intrin.h>)。

以下是我如何使用这些功能:

extern "C"{
    #include <x86intrin.h>
}    

template<typename T>
struct sse_type;

template<>
struct sse_type<float>{
    typedef __m128 type;

    constexpr static type(&shuffle)(type, type, int) = _mm_shuffle_ps;

    // other sse functions
};

template<>
struct sse_type<double>{
    typedef __m128d type;

    constexpr static type(&shuffle)(type, type, int) = _mm_shuffle_pd;

    // other sse functions
};

然后我在这些类上定义了一堆运算符重载,以便于使用。

这就是我只使用这些函数的方式,因为编译器不会抱怨在这些类中定义的任何其他 sse 函数。

记住编译器并不总是抱怨这一点,而且有些项目使用这个头文件编译得很好,我到底做错了什么?或者这是一个编译器错误?

【问题讨论】:

  • 使用&lt;immintrin.h&gt; - 不要担心“C”链接。内在函数标头应该是幂等的。
  • @BrettHale 为什么这个标题更可取?

标签: c++ c gcc c++11 clang


【解决方案1】:

在问了这个问题后几乎马上就想通了(尽管我已经尝试了几个小时来解决这个问题)。

如果没有设置优化标志,GCC 将从编译中发出一些 sse 函数。很奇怪。

-O3 添加到我的编译标志中就可以了。

所以我仍然在 clang 中遇到错误,但是在 gcc 4.8 中设置 -O3 可以修复错误:/

【讨论】:

  • 当您使用 (AVX) 或 (SSE2) 而不是 时会发生什么?
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多