3章メモリオーダリング

「2章 アトミック操作」で、メモリオーダリングの概念について簡単に説明した。本章では、このトピックについて解説する。利用可能なメモリオーダリングの選択肢について説明し、最も重要な、それぞれを使うべき場合を詳述する。

3.1 リオーダと最適化

プロセッサやコンパイラは、プログラムを可能な限り速く実行するためにあらゆるトリックを使う。例えば、プログラム中の2つの命令が互いに影響せず、順序を入れ替えたほうが速く実行できるなら、プロセッサはそれらをアウトオブオーダ†1で実行するかもしれない。つまり、ある命令がメインメモリから何らかのデータを読み込むために短時間ブロックするなら、プログラムの挙動に影響しない限り、後続する命令のうちいくつかが、その命令よりも先に実行され先に終了するかもしれない。同様にコンパイラも、そうした方がプログラムの実行が早くなると信じる理由があれば、プログラムの一部をリオーダ(並び替え)し書き換えるかもれしれない。ただし、プログラムの挙動に影響しない場合に限られる。

[†1] 訳注:アウトオブオーダ(out-of-order)とは、命令列を並んだ通りの順番でなく、追い越しを許して実行すること。

例として次の関数を見てみよう。

fn f(a: &mut i32, b: &mut i32) {
    *a += 1;
    *b += 1;
    *a += 1;
}

コンパイラはほぼ間違いなく、これらの操作の順番は結果に影響しないことを理解する。これら3つの加算操作の間で、*a*bの値に依存するようなことは何も起こらないからだ(オーバフローチェックが無効になっているとする)。したがって、コンパイラは2番目と3番目の操作の順番を入れ替え、さらに最初の2つの操作を1つの加算に統合するかもしれない。 ...

Get 詳解 Rustアトミック操作とロック ―並行処理実装のための低レイヤプログラミング now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.