为什么我得到"错误预期表达"而编译cilk程序

时间:2015-06-09 04:57:38

标签: c++ intel cilk

我正在使用Linux,Eclipse和Intel编译器V14。

我试图编译基本的斐波那契例子:

#include <iostream>
#include <cilk/cilk.h>

using namespace std;

int fib(int n) {

    if (n < 2) return 1;
    else {

        int rst = 0;
        rst += cilk_spawn fib(n-1);
        rst += cilk_spawn fib(n-2);
        cilk_sync;
        return rst;
    }
}

int main() {

    int res = fib(9);
    return 0;
}

收到编译错误:

error expected an expression

我试图使用:

cilk_spawn
Cilk_spawn
_cilk_spawn
_Cilk_spawn

但同样的错误..

2 个答案:

答案 0 :(得分:0)

不确定是否可以将cilk_spawn与+ =运算符一起使用。 以下代码是否有效?

        int rst = 0;
        int temp = 0;
        temp = cilk_spawn fib(n-1);
        rst += temp;
        temp = cilk_spawn fib(n-2);
        rst += temp;
        cilk_sync;
        return rst;

答案 1 :(得分:0)

英特尔编译器自动启用Cilk Plus。消息“符号_Cilk_spawn无法解析”表示您没有使用英特尔编译器。检查你的编译命令,确保它调用icc而不是gcc。

此外,您的原始示例包含一个种族。 Cilk Plus中经典斐波纳契的正确实现是:

int fib(int n) {
    if (n < 2)
        return n;
    int x = cilk_spawn fib(n-1);
    int y = fib(n-2);
    cilk_sync;
    return x+y;
}

您需要使用两个独立变量,这些变量仅在同步后求和以避免竞争。

你还应该在第二次递归调用fib()时避免使用cilk_spawn。请记住,Cilk运行时实现了 continuation 的窃取。那么如果你使用了第二个cilk_spawn会被盗的是什么呢?第二个fib()调用直到同步。它只会减慢您的程序速度。 MIT Cilk要求生成对Cilk函数的所有调用。英特尔Cilk Plus删除了该要求。