2017-04-18 5 views
2

いくつかの情報を並列に計算し、その結果をcobeginの外で使用したいとします。 Cobegin - Chapel内から非プリミティブ変数を取得する

は、より正確には、私の要件は、私が sync/single種類を認識していますが、ドメインには対応していません。この

var a,b: domain(1,stridable=true); 
cobegin{ 
    a = foo1(); 
    b = foo2(); 
} 
foo3(a,b); 

様ドメイン(および他の非プリミティブ型)を取得することです。

注: プロシージャのパラメータでoutを使用することも機能しません。

答えて

4

競合条件をより明示的にするために、並列構成で使用される変数は、blankインテントの関数に渡されたかのように扱われます。ほとんどのタイプでは、これは読み込み可能だが書き込みはできないことを意味します。

パラレル文で変数を変更可能にするには、タスクのインテント句を使用して、refのインテントを与えることができます。

cobegin with (ref a, ref b) { 
    a = foo1(); 
    b = foo2(); 
} 

法的タスクインテントはrefinconstconst inconst refです。 outinoutインテントは、タスクインテントとしてサポートされていません。タスクは、不特定の順序で値をコピーして競合状態になるためです。

詳細については、Chapel language specの「タスクの並列処理と同期」のサブセクション「タスクの意図」を参照してください。

関連する問題