【问题标题】:C: x86 Intel Intrinsics usage of _mm_log2_ps() -> error: incompatible type 'int'?C: x86 Intel Intrinsics 使用 _mm_log2_ps() -> 错误:不兼容的类型'int'?
【发布时间】:2013-12-06 02:05:33
【问题描述】:

我正在尝试将 log2 应用于 __m128 变量。像这样:

#include <immintrin.h>
int main (void) {
    __m128 two_v = {2.0, 2.0, 2.0, 2.0};
    __m128 log2_v = _mm_log2_ps(two_v); // log_2 := log(2)

    return 0;
}

尝试编译它会返回此错误:

error: initializing '__m128' with an expression of
      incompatible type 'int'
                __m128 log2_v = _mm_log2_ps(two_v); // log_2 := log(2)
                       ^        ~~~~~~~~~~~~~~~~~~

我该如何解决?

【问题讨论】:

  • 这是一个 SVML 内在函数。 .h 文件中的声明是错误的,请告诉我们它的样子。
  • @HansPassant 对不起,我不明白。你想看看我的 immintrin.h 文件吗?
  • 我没有指定任何头文件。你已经可以看到我所有的代码了。
  • @tmuecksch 例如,通过使用给定的 SSE-instrinsics,如 _mm_set_ps 等。但似乎您的编译器无论如何都理解该语法(即使这不是与平台无关的),因为错误似乎确实在 log2 行中。 Hans 的意思是,您应该在其头文件中查找 _mm_log2_ps 内在函数的声明,以检查它是否真的接受并返回 __m128,而不是以某种方式错误地声明。
  • @ChristianRau 感谢您的建议。

标签: c++ compiler-errors sse intrinsics sse2


【解决方案1】:

您查看的 immintrin.h 和用于编译的 immintrin.h 是不同的。 很可能,您正在查看特定于 Intel 的标头(例如 /opt/intel/include/immintrin.h),而您的编译器使用默认的 immintrin.h

正如正确所说,extern __m128 _mm_log2_ps(__m128 v1)SVML routine,所以 我看到的第一个解决方案是使用Intel Compiler。对于非商业开发,它在 Linux 上是免费的。

虽然您可以在使用不同编译器进行编译期间将自定义 immintrin.h 文件的包含路径指定为第一个参数,但我认为您会得到太多错误 - 只是因为这个头文件是 Intel 特定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多