1

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

しかし、同じエラー..

4

2 に答える 2

0

Intel コンパイラは、Cilk Plus を自動的に有効にします。「シンボル _Cilk_spawn を解決できませんでした」というメッセージは、Intel コンパイラを使用していないことを示しています。コンパイル コマンドを調べて、gcc ではなく icc を呼び出していることを確認してください。

また、元の例には人種が含まれています。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;
}

競合を避けるために、同期後にのみ合計される 2 つの独立変数を使用する必要があります。

また、fib() への 2 回目の再帰呼び出しで cilk_spawn を避ける必要があります。Cilk ランタイムは継続のスチールを実装することに注意してください。したがって、2 番目の cilk_spawn を使用した場合に盗まれるのは ; からのコードです。同期までの 2 番目の fib() 呼び出しの。それはあなたのプログラムを遅くするだけです。MIT Cilk では、Cilk 関数へのすべての呼び出しが生成される必要がありました。インテル® Cilk™ Plus では、その要件が取り除かれました。

于 2015-06-10T00:20:16.043 に答える
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;
于 2015-06-09T10:50:43.257 に答える