Почему я получаю & quot; ошибка ожидала выражения & quot; во время компиляции программы 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

но та же ошибка ..

1

Решение

Не уверен, что вы можете использовать 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;
0

Другие решения

Компилятор 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 снял это требование.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector