問題タブ [cyclicbarrier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
189 参照

java - CyclicBarriers の使用中にスレッドを適切に停止する方法

多くのスレッドを使用してキャッシュ上で操作を行う必要があるため、Thread から拡張する 3 つのクラスを作成しました (これらは Runnables でも​​ある、またはそうあるべきであることがわかりました)。注意してください、これらはこれらのスレッドの1つのインスタンスを複数実行していますが、同時には実行していません。次のように:

したがって、これを終了した後、2 番目の操作用に新しいスレッドを (ランダムに) 作成します。以下は、私の run メソッドの作成方法です。
循環バリアを使用して、スレッドが同時に機能するのを待ちます。

メインスレッドは、これらを実行する時間に焦点を当てており、その時間の終わりに、2番目の操作に取り組む前にスレッドを停止しようとします. しかし、私のスレッドは実際には停止していないようです。

編集:スレッドを直接中断しようとしたことに注意してください。そして、バリアをリセットしようとしましたが、どちらも他のスレッドで見つかった回答からの悪い習慣であると思われました。

ExecutorService を使用して、これらの操作を順番に管理します。

しかし、executorservice は次のサービスに進みません。

0 投票する
2 に答える
65 参照

events - 3 つのキュー + すべてのキューの 1 つの終了またはデバイス側チェックポイント

デバイス側で同時に 3 つのキューを待機できる特別な「イベント待機」機能があるので、ホスト側からすべてのキューを順番に待機しませんか?

コマンド キューに送信するチェックポイント コマンドはありますか? 他のコマンド キューが同じ (垂直方向に) バリア/チェックポイントに到達するのを待機して、デバイス側から待機して続行する必要があるため、ホスト側のラウンドトリップは必要ありませんか?

今のところ、2 つの異なるバージョンを試しました。

2つ目は少し速く(他の人から見ました)、両方とも3回のフラッシュコマンドの後に実行されます。

CodeXL プロファイラーの結果を見ると、最初の 1 つは終了ポイント間でより長く待機し、一部の操作は重複していないように見えます。2 つ目は、3 つの終了ポイントがすべて 3 ミリ秒以内であることを示しているため、より高速で、より長い部分がオーバーラップしています (読み取り + 書き込み + 同時計算)。

ホスト側から 1 つの待機コマンドだけでこれを実現する方法がある場合は、その「フラッシュ」バージョンも必要ですが、見つかりませんでした。

各パイプラインステップ間にフラッシュを追加する代わりに、下の図を達成する方法はありますか?

すべてのチェックポイントは垂直方向に同期する必要があり、これらすべてのアクションは信号が与えられるまで開始してはなりません。そのような:

チェックポイントはすべてデバイス側で処理され、ホスト側から必要な終了コマンドは 3 つだけです (さらに良いことに、すべてのキューに対して 1 つの終了だけですか?)

「clWaitForEvents(3, evt_);」で 3 つのキューを 3 つのイベントにバインドする方法 今のところは:

この「エンキューバリア」が他のキューと通信できる場合、どうすればそれを達成できますか? すべてのキューが終了するまでホスト側のイベントを有効にしておく必要がありますか?それとも後で削除したり再利用したりできますか? ドキュメントから、最初のバリアのイベントを 2 番目のキューに入れることができ、2 番目のバリア イベントを最初のイベントと一緒に 3 番目のキューに入れることができるように見えるので、おそらく次のようになります。

誰かがこれを試しましたか?すべてのキューをバリアで開始して、ホスト側から何らかのイベントを発生させるまで開始しないようにするか、または「エンキュー」の遅延実行が「フラッシュ/終了するまで開始しない」と信頼できる %100 になるようにする必要がありますか? ホストからデバイスにイベントを発生させるにはどうすればよいですか (sameEvt には「発生」機能がありません。clCreateUserEvent ですか?)

3 つのキューはすべてインオーダー タイプであり、同じコンテキストにあります。アウトオブオーダー タイプは、すべてのグラフィックス カードでサポートされているわけではありません。C++ バインディングが使用されています。

また、enqueueWaitList(これは非推奨ですか?) と clEnqueueMarker がありますが、それらの使用方法がわかりません。ドキュメントには、Khronos の Web サイトに例がありません。

0 投票する
0 に答える
219 参照

java - CyclicBarrier を使用した並行ライフ ゲーム

Game of Life ボードを表す 2D 配列があります。Nスレッドは配列の独自の部分で動作し、次世代を作成します。

すべてのNロックが完了したら、現在の世代を出力し、次の世代に進む前にしばらくスリープします。を使用することで実現されCyclicBarrierます。

プログラムは動作しますが、配列への書き込みが同期されていないため、印刷スレッドが古い配列セルを参照する可能性があると思います。内部的CyclicBarrierにはロックを使っているので、トリガーhappens-beforeになるのかもしれませんが、よくわかりません。

私が見る唯一の解決策は、Boardメソッドをロックすることです。しかし、各スレッドには配列の専用の部分があり、ロックで不要な競合が発生するため、ロックを使用したくありません。

0 投票する
1 に答える
5861 参照

multithreading - CountDownLatch の await() の目的は何ですか?

私が使用している次のプログラムがあり、メソッドjava.util.concurrent.CountDownLatchを使用せずに正常に動作しています。await()

私は同時実行に不慣れで、の目的を知りたいですawait()。が必要な理由は理解できますが、なぜCyclicBarrierですか?await()CountDownLatch

クラスCountDownLatchSimple:

クラスのRunner実装Runnable:

出力

2 は待っています。
3 は待っています。
1つは待っています。
1つは完了です。
2つが完成しました。
3つ完成です。