首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GCC 5和cilk-plus会出现这个编译错误?

为什么GCC 5和cilk-plus会出现这个编译错误?
EN

Stack Overflow用户
提问于 2015-08-06 03:37:01
回答 2查看 1.1K关注 0票数 12

由于某些原因,cilk_spawn不适用于x86本质。每当我试图将两者组合在同一个函数的主体中时,我就会得到一个错误。(注意,cilk_for工作得很好)。如果我删除所有SIMD指令,它会编译并运行良好。

代码语言:javascript
复制
#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的作品:

代码语言:javascript
复制
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的错误信息一样。

EN

回答 2

Stack Overflow用户

发布于 2015-08-09 06:21:00

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-03-24 03:52:38

通过指定-msse-msse2标志,我能够编译同样错误的代码。

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

以下评论所指的“天栓”链接,是当前的“最佳做法”要求的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31846389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档