为什么我在编译 cilk 程序时会"error expected an expression"



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

我正在尝试编译基本的fibonacci示例:

#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

不确定是否可以使用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;

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

同样,您的原始示例包含一个race。在Cilk Plus中经典fibonacci的正确实现是:

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运行时实现了对延续的窃取。所以,如果你使用第二个cilk_spawn,会被窃取的是;的第二个fib()调用,直到同步。它只会拖慢你的程序。MIT Cilk要求所有对Cilk函数的调用都被生成。英特尔Cilk Plus取消了这个要求。

相关内容

  • 没有找到相关文章