【问题标题】:Why do I get this compile error with GCC 5 and cilk-plus?为什么使用 GCC 5 和 cilk-plus 时会出现此编译错误?
【发布时间】:2015-10-29 01:09:52
【问题描述】:

由于某些原因 cilk_spawn 不适用于 x86 内部函数。每次尝试将两者组合到同一函数的主体中时,都会出现错误。 (请注意 cilk_for 工作正常)。如果我删除所有 SIMD 指令,它会编译并运行良好。

#include <stdio.h>
#include <x86intrin.h>
#include <math.h>
#include <cilk/cilk.h>

int main()
{
    int w = cilk_spawn sqrt(10);
    __m128i x = _mm_set_epi64x(1, 1);
    x = _mm_add_epi64(x, x);
    cilk_sync;
    printf("%d\n", w);
    return 0;
}

这里是 gcc 输出:

gcc-4.9 -std=c99 -march=native -fcilkplus -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.c"
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/xmmintrin.h:1258:0,
                 from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/x86intrin.h:31,
                 from ../main.c:2:
../main.c: In function ‘main’:
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h:581:1: error: inlining failed in call to always_inline ‘_mm_set_epi64x’: function not inlinable
 _mm_set_epi64x (long long __q1, long long __q0)
 ^
../main.c:9:10: error: called from here
  __m128i x = _mm_set_epi64x(1, 1);
          ^
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/xmmintrin.h:1258:0,
                 from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/x86intrin.h:31,
                 from ../main.c:2:
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h:1025:1: error: inlining failed in call to always_inline ‘_mm_add_epi64’: function not inlinable
 _mm_add_epi64 (__m128i __A, __m128i __B)
 ^
subdir.mk:18: recipe for target 'main.o' failed
../main.c:10:4: error: called from here
  x = _mm_add_epi64(x, x);
    ^
make: *** [main.o] Error 1

我刚刚注意到这是 GCC 4.9,但错误消息与 GCC 5 相同。

【问题讨论】:

  • 你可以尝试使用 gnu99 而不是 c99 作为语言吗?
  • 没有区别同样的错误。
  • 它在 Intel 15.0.3 上编译得很好。您应该向 GCC 人员提交错误。
  • 我似乎想起了一些关于 mm* 函数只能与其他 mm* 函数并行运行的情况。使用 -march=native 标志,ICC 可能能够更好地确定哪些处理器允许不同的同时上下文。
  • 您找到解决方案了吗?我在 gcc 6.2 上遇到了同样的问题。不允许内在函数:(

标签: c gcc simd cilk-plus


【解决方案1】:

通过指定-msse-msse2 标志,我能够编译因相同错误而失败的代码。

https://www.mail-archive.com/blfs-dev@lists.linuxfromscratch.org/msg00033.html


godbolt link referred to by the following commentcurrent SO "best practice" 需要。

【讨论】:

  • 即使启用了-msse2(即使使用 gcc6-snapshot),CILK 也会出现此问题。 OP 使用-march=native。这并不能解决 Cilk 的问题,仅适用于该错误消息的正常情况(使用没有正确 -m 选项的内在函数来告诉 gcc 这些insn 是可以的。)我必须编辑证明继续存在的 godbolt 链接这个问题放到你的帖子里,因为SO broke comments
  • 不错的网站。我不知道 gcc 存在这样的事情。现在我发现它确实没有帮助。
【解决方案2】:

我猜 cilk 创建了两个函数(sqrt 和 main 的包装器),以便在需要/可能的情况下将它们安排在不同的线程中。问题在于,在这些条件下,现在会间接调用 mm* 函数,因此不能内联,至少在没有来自您已关闭的优化分析阶段的额外信息的情况下不能内联。

我注意到您使用 -O0 进行编译。我怀疑如果您编译 -O2 它可能会起作用,因为额外的优化通道将为编译器提供内联这些函数所需的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多