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

Другие вопросы по тегам