Я использую 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
но та же ошибка ..
Не уверен, что вы можете использовать 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;
Компилятор Intel автоматически включает Cilk Plus. Сообщение «Символ _Cilk_spawn не может быть разрешен» означает, что вы не используете компилятор Intel. Проверьте команду компиляции и убедитесь, что она вызывает 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;
}
Вам нужно использовать две независимые переменные, которые суммируются только после синхронизации, чтобы избежать гонки.
Вам также следует избегать cilk_spawn при втором рекурсивном вызове fib (). Помните, что среда выполнения Cilk реализует кражу продолжение. Итак, что будет украдено, если вы используете второе cilk_spawn — это код из; второго вызова fib () до синхронизации. Это просто замедлит вашу программу. MIT Cilk требовал, чтобы все вызовы функций Cilk создавались. Intel Cilk Plus снял это требование.