gforth の Cilk は、 同じ名前のプログラミング言語からインスピレーションを得た、
複数のコアで実行される複数のタスク間で作業を分割するためのフレームワークです。 Cilk を使用する場合は、 require
cilk.fs
としてください。
考え方としては、 並行して解決できる部分問題(subproblems)を特定し、
フレームワークがワーカー・タスクをこれらの部分問題に割り当てるというものです。 特に、 各サブ・タスクに対して spawn
ワードの 1
つを使用します。 最終的には、 部分問題が解決されるまで cilk-sync
で待つ必要があります。
現在、 すべての生成は 1 つのタスクから発生する必要があり、 cilk-sync
はすべての部分問題(subproblems)が完了するまで待機するため、 再帰アルゴリズムに現在の gforth Cilk
を使用するのは簡単ではありません。
オーバーヘッドを避けるために、 部分問題を細かく分割しすぎないでください。 どのくらい細かいかは、
部分問題の実行時間がどの程度均一であるかによって決まりますが、 かなりの実行時間の問題の場合は、 5*cores
個の部分問題(subproblems)にするのが、 おそらく良い出発点となります。
cores
( – u ) cilk “cores”
使用するワーカー・タスクの数を含む値。 デフォルトでは、 これはハードウェア・スレッドの数(SMT/HT の場合)です。
(決定できれば、)それ以外の場合は 1 になります。 別の数を使用したい場合は、 cilk-init
を呼び出す前に
cores
を変更します。
cilk-init
( – ) cilk “cilk-init”
ワーカー・タスクがまだ実行されていない場合は開始します。
spawn
( xt – ) cilk “spawn”
ワーカー・タスクで xt ( – ) を execute します。 使い捨て実行可能クロージャ(one-time
executable closures)を使用して、 ヒープに割り当てられたクロージャを渡し、 spawn
呼び出し側から、
ワーカーで実行されているコードに任意のデータを渡すことができます。
例: ( n r ) [{: n f: r :}h1 code
;] spawn
spawn1
( x xt – ) cilk “spawn1”
Execute xt ( x – ) in a worker task.
spawn2
( x1 x2 xt – ) cilk “spawn2”
Execute xt ( x1 x2 – ) in a worker task.
cilk-sync
( – ) cilk “cilk-sync”
すべての部分問題が完了(complete)するまで待ちます(wait)。
cilk-bye
( – ) cilk “cilk-bye”
すべてのワーカーを終了(terminate)します。