我正在使用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
但同样的错误..
答案 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删除了该要求。