我使用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取消了这个要求。