1

我正在使用 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

但同样的错误..

4

2 回答 2

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;
于 2015-06-09T10:50:43.257 回答
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 删除了该要求。

于 2015-06-10T00:20:16.043 回答