問題タブ [barrier]
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.
opencl - OpenCL では、バリア() とは対照的に、mem_fence() は何をしますか?
barrier()
(私は理解していると思います) とは異なりmem_fence()
、ワーク グループ内のすべての項目に影響を与えるわけではありません。OpenCL の仕様には、(セクション 6.11.10) と記載されていmem_fence()
ます。
カーネルを実行するワークアイテムのロードとストアを命令します。
(したがって、単一の作業項目に適用されます)。
しかし、同時に、セクション 3.3.1 では次のように述べています。
ワークアイテム メモリ内では、ロード/ストアの一貫性があります。
そのため、作業項目内でメモリは一貫しています。
では、どんなことにmem_fence()
役立つのでしょうか。アイテム間では機能しませんが、アイテム内では必要ありません...
アトミック操作を使用していないことに注意してください (セクション 9.5 など)。mem_fence()
それらと組み合わせて使用するという考え方ですか?もしそうなら、私は例を見てみたいです。
ありがとう。
更新: で使用すると どのように役立つかがわかりますbarrier()
(暗黙的に、バリアが呼び出すためmem_fence()
) - しかし、それは別々に存在するので、確かにもっとあるはずですか?
c - MPI との競合状態
MPI を使用してトーナメント バリアを実装しようとしています。ここに、私が書いたコードがあります。到着フェーズと起床フェーズのみ書いています
競合状態が発生する理由がわかりません。MPI_Send と MPI_Recv はブロック機能だと思います。しかし、時々、そのように動作しないことがあります
編集: これは、競合状態が発生するサンプル出力です。ご覧のとおり、1 がメッセージを送信する前であっても、0 は 1 からメッセージ ("1 がバリアに到着しました") を受信しました。
0 がラウンド 1 の勝者
0 受信: 1 がバリーに到着
0 はラウンド 2 の勝者です
1はラウンド1の敗者です
1送信リーチメッセージ
2人がラウンド1の勝者
2 受信: 3 がバリーに到着
2 ラウンド 2 の敗者
2 到達メッセージの送信
3 がラウンド 1 の敗者
3 到達メッセージの送信
0 受信: 2 がバリーに到着
0 ウェイクアップ メッセージを送信中
0 ウェイクアップ メッセージを送信中
1 受信: ラウンド 1 でタグ付きの 0 からのウェイクアップ メッセージ
2 受信: ラウンド 2 でタグ付きの 0 からのウェイクアップ メッセージ
2 ウェイクアップ メッセージの送信
3 受信: ラウンド 1 でタグ付きの 2 からのウェイクアップ メッセージ
multithreading - バイナリセマフォを使用したバリア(同期構造)の実装
バリアは、プロセスのセットがグローバルに同期する同期構造です。つまり、セット内の各プロセスがバリアに到着し、他のすべてのプロセスが到着するのを待ってから、すべてのプロセスがバリアを離れます。セット内のプロセスの数を3とし、Sを通常のPおよびV関数を持つバイナリセマフォとします。左側に行番号が示されているバリアの次のC実装について考えてみます。
変数process_arrivedとprocess_leftはすべてのプロセスで共有され、ゼロに初期化されます。並行プログラムでは、3つのプロセスすべてが、グローバルに同期する必要があるときにバリア関数を呼び出します。
上記の実装は機能しますか?2つのバリア呼び出しがすぐに連続して使用されると、デッドロックにつながる可能性があると思います。バリアに入る最初のプロセスは、process_arrivedがゼロになるまで待機してからP(S)の実行に進むためです。
c - スレッドの終了でバリアを処理する方法
擬似コード:
バリアに関する私の問題は、他のスレッドの前に終了するスレッドをどのように処理するかです。
バリアとは、すべてのスレッドが他のすべてのスレッドを待たなければならないことを意味します。
すべてのスレッドが同時に終了することを保証するための手法は何ですか?
ループを続けようとしましたが、「スレッド作業」を無視しましたが、この場合、8 つのスレッドすべてが終了し、スレッドに「すべて完了しました。今すぐ終了できます」と伝える賢明な方法はありません。
編集:
アルゴリズム:
- データのセグメントに対して操作を実行する
- スレッドのデータのセグメントが終了した場合は終了します。
- バリア待ち。
- 1 つのスレッドがデータの一部を新しいデータに置き換えます
- 1を繰り返します。
編集2:
バリアを 1 サイズ小さいバリアで上書きするエレガントな方法はありますか? (バリアの周りにミューテックスを配置せずに)
c - pthread_cond_broadcast 呼び出しのスレッドを同期する
10 個の単純な「ワーカー」スレッドを生成する「マネージャー」スレッドを持つ単純なアプリケーションがあります。すべての「ワーカー」スレッドを同じ条件変数 (つまり、condvar) でブロックし、pthread_cond_broadcast 呼び出しで 10 個のスレッドすべてに同時にウェイクアップするように手動で信号を送りたいです。
私のアプリケーションの場合、スレッドがエラー状態になり、早期に終了する可能性があるため、10 個のスレッドすべてが同期ポイントに到達しない可能性があります。
簡単なメカニズムの 1 つは、pthread_barrier_t を作成し、10 個のスレッドすべてに pthread_barrier_wait を呼び出させることです。10 個のスレッドすべてがこの呼び出しを完了すると、すべてのスレッドが自由に実行を継続できます。ただし、これには、バリアがブロック解除するために必要なスレッドの数をスレッドが変更できる必要があります。これを安全に変更できるかどうかはわかりません。
さらに、まだ動作しているすべてのスレッドが、バリアの場合のように自動的に開始されないことを保証したいので、代わりに pthread_cond_broadcast 呼び出しを使用して手動で開始したいと考えています。ブロードキャスト呼び出しを行う前に、まだ生きているすべてのスレッド (理想的には 10 個) が condvar でブロックされていることをどのように保証しますか?
ありがとう!
mpi - MPI_Type_commit は、MPI_COMM_WORLD 内のすべてのプロセスで暗黙的にバリアを呼び出しますか?
私のコードでは、新しい MPI ユーザー定義データ型を定義しています。MPI_Barrier 関数は MPI_Commit に従う必要があるのか、それとも新しいデータ型の最初の使用が表示される場所に配置して、すべてのプロセスが新しいデータ型の定義を認識して同意する必要があるのか 疑問に思っていました。
ありがとう。
java - Javaの動的なパーティ数を持つバリア
Java でパーティ数が動的なバリアが必要です。Phaserに出くわしましたが、このソリューションは Java 7 用であり、残念ながら使用できません。
Java 6の解決策はありますか.可変数のウェイターを持つバリアを持つ必要性をどのように満たす必要がありますか?
deadlock - Reusable Barrier ソリューションにデッドロックがありますか?
私は「The Little Book of Semaphores」を読んでいて、41 ページに Reusable Barrier 問題の解決策があります。私が抱えている問題は、デッドロック状況が発生しない理由です。
このソリューションでは、15 行目と 20 行目の間で、デッドロックを引き起こすミューテックスを保持している間にセマフォ (18 行目) で wait() を呼び出すのは悪い習慣ではありませんか? 説明してください。ありがとうございました。
webserver - MPI_BARRIERの後でMPI_SENDが動作を停止します
C / MPIで分散Webサーバーを構築していますが、コードの最初のMPI_BARRIERの後で、ポイントツーポイント通信が完全に機能しなくなったようです。標準のCコードはバリアの後で機能するので、各スレッドがバリアを通過することを知っています。ポイントツーポイント通信も、バリアの前で問題なく機能します。ただし、バリアの前の行で機能していたのと同じコードをコピーして、バリアの後の行に貼り付けると、完全に機能しなくなります。SENDは永遠に待ちます。代わりにISENDを使用しようとすると、回線を通過しますが、メッセージが受信されません。私はこの問題をよく調べており、MPI_BARRIERに問題がある人は誰でも、バリアが正しく機能し、コードが間違っていると言われていますが、私のコードが間違っている理由を一生理解することはできません。
これを示すサンプルプログラムは次のとおりです。
バリアの前に2つのステートメントを移動するif
と、このプログラムが正しく実行されます。
編集-タイプに関係なく、最初の通信は機能し、その後のすべての通信は失敗するようです。これは私が最初に思ったよりはるかに一般的です。最初の通信が障壁であるか他のメッセージであるかは関係ありません。将来の通信は適切に機能しません。
c - Cでミューテックスとバリアを使用したスレッド同期
プログラムの出力を同期するためにpthreadmutex変数とバリアを使用しようとしていますが、希望どおりに機能していません。各スレッドは(forループからの)20の値ごとに最終値を確認していますが、これはすべて同じ最終値になるようにしようとしています(5つのスレッドを使用する場合、すべてのスレッドが最終値として100を確認する必要があります) 、4スレッド、80など)
どんな提案や助けも大歓迎です!よろしくお願いします!