Skip to content

Instantly share code, notes, and snippets.

@yohhoy
Last active August 29, 2015 14:04
Show Gist options
  • Save yohhoy/e7e3a6ad81264c39aa7a to your computer and use it in GitHub Desktop.
Save yohhoy/e7e3a6ad81264c39aa7a to your computer and use it in GitHub Desktop.
term of C++11(n3337) memory model
  • byte(1.7/p1): 一意なアドレスを持つ, 少なくとも8ビット幅を持つ基本ストレージ単位.
  • memory location(1.7/p3): スカラ型オブジェクト or 隣接する非0幅ビットフィールドの最大列
  • conflict(1.10/p4): 同一memory locationに対する, 少なくとも一方が変更を行う, 2つのアクションにより生じる.
  • data race(1.10/p21): 少なくとも一方が非atomicで, それぞれ他方に先行(hb)しない, 異なるスレッド上での2つのconflictするアクションで生じる. あらゆるdata raceは未定義の動作(undefined behavior)を引き起こす.

アクション

  • evaluation(1.9/p12): 値の計算(value computation) or side effectの開始 (本文書中では"アクション"と表記)
  • side effect(1.9/p12): 実行環境の状態を変化させるアクション. オブジェクトの更新 or volatile変数へのアクセス or I/Oライブラリ関数の呼出
  • visible side effect(1.10/p13): スカラ型オブジェクトM上の値の計算(value computation)Bに対するM上のvisible side effect Aは, (A hb B) かつ (A hb X かつ X hb Bを満たすM上のside effect Xが存在しない) とき, アクションBはアクションAでM上へ書込まれた値を読出す.

二項関係

  • sb - sequenced before(1.9/p13): 単一スレッド上での2つのアクション同士の関係. A sb B = 実行Aは実行Bに先行(hb)する.
  • sw - synchronize with(1.10/p8): 異なるスレッド上での2つの特定ライブラリ呼出間の関係(release/acquire操作のペア). A sw B = 呼出Aは呼出Bに先行(hb)する.
  • cad - carries a dependency(1.10/p9): 単一スレッド上でのsb関係のサブセット. A cad B = (Aがスカラ型オブジェクトMに書込 かつ BがMから読出 かつ A sb B) or (A cad X => X cad B) or (Aの値がBのオペランドとして使われる かつ NOT(Bがstd::kill_dependency呼出 or Aが組込論理和積演算子||,&&の左辺 or Aが条件演算子?:の左辺 or Aが組込コンマ演算子,の左辺))
  • dob - dependency-ordered before(1.10/p10): 異なるスレッド上での2つのアクション同士の関係(release/consume操作のペア). A dob B = (AがatomicオブジェクトM上のrelease操作 かつ Bが異なるスレッドからM上のconsume操作 かつ Aに続くrelease sequence内のいずれかのside effect書込をBが読出) or (A dob X => X cad B)
  • ithb - inter-thread happens before(1.10/p11): 異なるスレッド上での2つのアクション同士の関係. A ithb B = (A sw B) or (A dob B) or (A sw X => X sb B) or (A sb X => X ithb B) or (A ithb X => X ithb B)
  • hb - happens before(1.10/p12): 2つのアクション同士の関係. A hb B = (A sb B) or (A ithb B) = (A sb B) or (A sw B) or (release/consume操作による二項関係)

凡例:"あるアクションXに対してA (r1) X かつ X (r2) Bを満たす"とき, "A (r1) X => X (r2) B"と表記する.

シーケンス

  • modification order(1.10/p6): ある1つのatomicオブジェクトに対して, ある全順序で生じた, 全ての変更の列.
  • visible sequence of side effects(1.10/p14): atomicオブジェクトM上の値の計算(value computation)Bに対するM上のvisible sequence of side effectsは, アクションBに対して最初に可視となるside effectから, Bが該当side effectに先行(hb)しない, Mのmodification order上で最大限連続するside effectの部分列.
  • release sequence(1.10/p7): atomicオブジェクトM上のrelease操作Aを先頭とする, Mのmodification order上で (Aと同一スレッド上で行われるside effect) or (atomic RMW操作) から構成される最大限連続するside effectの部分列.
  • SC操作の全順序(29.3/p3): 全てのSC操作上ではある全順序Sが成り立つ. atomicオブジェクトMから値を読出すSC操作Bは, (S上でBに先行するM上で直近のSC変更A) or (SC変更Aが存在するとき, Bに対するvisible sequence of side effects上でのM上のSC操作でなく かつ Aに先行(hb)しない変更) or (SC変更Aが存在しないとき, Bに対するvisible sequence of side effects上でのM上のSC操作でない変更) いずれかの結果を観測する.
  • hypothetical release sequence(29.8): release fence操作Aのsw関係記述において, A sb Xのとき, atomic操作Xを先頭とする仮想的なrelease sequence.

凡例:SC=std::memory_order_seq_cst

コヒーレンス要件

  • write-write coherence(1.10/p15): atomicオブジェクトM上で変更操作A hb 変更操作Bならば, memory order上でAはBより前にあるべき.
  • read-read coherence(1.10/p16): atomicオブジェクトM上で(vc-A hb vc-B かつ vc-Aがse-Xから値を読み取る)ならば, vc-Bは(Xで格納された値 or memory order上でse-Xに続くse-Yで格納された値)のいずれかを読み取るべき.
  • read-write coherence(1.10/p17):
  • write-read coherence(1.10/p18):

凡例:vc-X=値の計算(value computation)X, se-X=side effect X

SC関連

  • 29.3/p3: se(SC) → vc-B(SC)
  • 29.3/p4: se(SC) → fence-X(SC) sb vc-B
  • 29.3/p5: se-A sb fence-X(SC) → vc-B(SC)
  • 29.3/p6: se-A sb fence-X(SC) → fence-Y(SC) sb vc-B
  • 29.3/p7: RMW-A sb fence-X(SC) → fence-Y(SC) sb RMW-B
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment