~llamerada/memo/スマートフォン用の表示で見る~llamerada/memo/この広告は、90日以上更新していないブログに表示しています。WARPでは、今マルチスレッドプログラムの分散処理機能を作っています。同機能の実現には複数デバイスでメモリを同調、シンクロさせる必要があります。Reduceや関数型言語でない普通のプログラムを実行するVMを作ろうとしているため、この点が複雑になります。メモリのシンクロのタイミングは分散処理のナイーブな部分です。メモリのシンクロ部分の設計にあたり、C/C++のメモリのシンクロがどのようになっているか調べました。スレッド間で授受する値はatomic(原子)操作を行う以下の様な単一の命令であっても、実はaの値は不定のタイミングが存在する可能性があり、C/C++はソレを許容しています。次の処理〜普通のシングルスレッドのプログラムの場合は次の処理が行われるまでに変数aの値が確定するので問題になりませんが、マルチスレッドの場合、変更途中のaの値を取得すると変更前の値とも変更後の値とも異なる値が取得される場合があります。そんな事にならないように安全に値を書き換える、値を取得するのがatomic操作です。d.hatena.ne.jpスレッド間で値の操作に順序性を持たせる場合はメモリバリア操作を行うC/C++コンパイラやCPUの命令デコーダはシングルスレッドで問題にならない範囲で最適化のために命令実行順序を変更します。変数書き換えがアトミックだとしても以下のコードを実行した場合、aとb、CPUがどちらを先に書き換えるかは分かりません。条件分岐など、変数を利用する処理が実行される前までに書き換えられます。変数cに至っては条件分岐に利用されないため、if文実行時の値が0のままの可能性もあります。値の書き換え順序を、「ここまでには変数aを書き換えておく」「変数bの書き換えはここ以降で行う」のように保証するのがメモリバリアです。ミューテックス)、semaphore(セマフォ)を使うメモリバリアは数値の書き換えに限定していましたが、一連の処理(クリティカルセクション)を同時に実行しないよう保証する機能があります。セマフォは、処理を同時にn個のスレッドしかできないようにするという仕組みです。同時に1つのスレッドしか処理しない場合をミューテクスと呼びます。EntriesArchiveはてなブログをはじめよう!llamerad-jpさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。