アウトオブオーダー実行とコンパイラによる命令順序の最適化
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/01/11 01:18 UTC 版)
「メモリバリア」の記事における「アウトオブオーダー実行とコンパイラによる命令順序の最適化」の解説
メモリバリア命令はハードウェアレベルの命令並べ替えに対するものである。メモリマップドI/Oアクセス時に必要とされる。コンパイラも最適化処理の一環として命令の並べ替えをすることがある。いずれの場合も並列処理では同様の問題を引き起こすので、マルチスレッドで共有されるデータに関わるコードの最適化を抑制する手段を提供する必要がある。なお、そのような手段が必要となるのは、同期プリミティブで保護されていないデータのみである。 C言語のキーワードvolatileを使用すると、その変数に関するメモリ操作の並べ替えや省略といった最適化を抑制することができる。これは、シングルプロセッサシステムでのマルチスレッドやシグナルハンドラといった割り込みに対する一種のバリアを提供するものである。しかし、volatileはコンパイラの最適化に関するものであるため、マルチプロセッサシステムでの並べ替え問題には不十分である。 いくつかの言語はコンパイラの最適化にもアウト・オブ・オーダー実行にも対処する機能を持つものもあるが、そのコンパイラが生成したコードが本当に並べ替えを行っていないか調べるなど、十分注意して使用すべきである。開発者によっては、コンパイラによる並べ替え問題を防ぐ必要があるときにはアセンブリ言語を使用する者もいる。 Java 1.5(バージョン5とも言う)は新たなメモリモデルを採用しており、キーワードvolatileである種のハードウェアによる命令並べ替えとコンパイラによる並べ替えを防ぐことを保証している。C++でも同様の拡張が提案されている。
※この「アウトオブオーダー実行とコンパイラによる命令順序の最適化」の解説は、「メモリバリア」の解説の一部です。
「アウトオブオーダー実行とコンパイラによる命令順序の最適化」を含む「メモリバリア」の記事については、「メモリバリア」の概要を参照ください。
- アウトオブオーダー実行とコンパイラによる命令順序の最適化のページへのリンク