Почему я получаю "ошибка ожидала выражения" во время компиляции программы cilk
Я использую 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
но та же ошибка..
2 ответа
Не уверен, что вы можете использовать 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 снял это требование.