Slide 1

Slide 1 text

Armv8 Consistency Model のふるまいを観察する @shigemi1014

Slide 2

Slide 2 text

早速ですが,クイズです [?] Raspberry Pi 4 Model B (AArch64 Kernel) で,2つのプロセッサP0,P1が共有メモリを経由して 通信を行う.この時,P1がレジスタW0,W2に読み込む値はどうなるか?メモリは0初期化されている とする . P0 | P1 ; MOV W0,#1 | LDR W0,[X3] ; STR W0,[X1] | LDR W2,[X1] ; MOV W2,#1 | ; STR W2,[X3] | ; X1で指定したアドレス先に 1をストア X3で指定したアドレス先に 1をストア 1. X3で指定したアドレスから値をロード 2. X1で指定したアドレスから値をロード P1でとり得る値の組: (W0, W2) = ?

Slide 3

Slide 3 text

P0 | P1 ; | LDR W0,[X3] ; | LDR W2,[X1] ; MOV W0,#1 | ; STR W0,[X1] | ; MOV W2,#1 | ; STR W2,#1 | ; P0 | P1 ; MOV W0,#1 | ; STR W0,[X1] | ; | LDR W0,[X3] ; MOV W2,#1 | ; | LDR W2,[X1] ; STR W2,[X3] | ; P0 | P1 ; MOV W0,#1 | ; STR W0,[X1] | ; MOV W2,#1 | ; STR W2,[X3] | ; | LDR W0,[X3] ; | LDR W2,[X1] ; ケース1: [P1] W0 = 1, W2 = 1 ケース1: [P1] W0 = 0, W2 = 1 ケース1: [P1] W0 = 0, W2 = 0 P1でとり得る値の組: (W0, W2) = (0, 0), (0, 1), (1, 1) ※2値の組み合わせの全パターンを列挙し た場合,(1,0)も考えられるが論理的に起こ りえない

Slide 4

Slide 4 text

P1でとり得る値の組: (W0, W1) = (0, 0), (0, 1), (1, 1), (1,0) 答え

Slide 5

Slide 5 text

ふるまいを観察してみる

Slide 6

Slide 6 text

herdtools7 Consistency Model をテストするためのツール群 主要ツールは,herd7, litmus7, diy7 - herd7: メモリモデルシミュレータ.メモリモデルは catと呼ばれる言語で記述する - arm, x86, linux... - litmus7: litmus test を特定のマシン上で走らせるためのもの - litmus test: 共有メモリを用いた並列処理の動作を観察するために設計された小さな並列プログラムのこと - diy7: litmus test 自動生成ツール - いまから見ていく litmus test はこれで自動生成したもの ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Tips - Arm Architecture Reference Manualのメモリモデルの記述は、 catで記述されたモデルの英語訳に基づいている - An Arm forbidden configuration file: Arm が配布しているハードウェアに対して Armモデルを比較するための litmus test を自動生成 するための設定ファイルとして公開されている - herd7 online Simulator: http://diy.inria.fr/www/?record=aarch64

Slide 7

Slide 7 text

Litmus Test: Message Passing (MP) AArch64 MP { 0:X1=x; 0:X3=y; 1:X1=y; 1:X3=x; } P0 | P1 ; MOV W0,#1 | LDR W0,[X1] ; STR W0,[X1] | LDR W2,[X3] ; MOV W2,#1 | ; STR W2,[X3] | ; exists (1:X0=1 /\ 1:X2=0) P1で「X0=1, X2=0って起こりうるの?」 ということを検査 (assertion) ※XをWと読み替える 最初にみたものと同じ P0: X1にxのアドレス, X3にyのアドレス P1: X1にyのアドレス, X3にxのアドレス ※P0,P1はそれぞれ同名のX1, X3を個別に 持っていることに注意

Slide 8

Slide 8 text

Litmus Test MP - 実機で > ./mp.exe -s 500000 -r 10 Test mp Allowed Histogram (4 states) 2500071:>1:X0=0; 1:X2=0; 3 *>1:X0=1; 1:X2=0; 72 :>1:X0=0; 1:X2=1; 2499854:>1:X0=1; 1:X2=1; Ok Witnesses Positive: 3, Negative: 4999997 Condition exists (1:X0=1 /\ 1:X2=0) is validated 今回の試行では 0.00006 % の確率で発生していた ※Raspberry pi 4 model B で kernel を AArch64 にいれかえたものを使用

Slide 9

Slide 9 text

Litmus Test: MP - シミュレータ上での結果は? > herd7 mp.litmus Test mp Allowed States 4 1:X0=0; 1:X2=0; 1:X0=0; 1:X2=1; 1:X0=1; 1:X2=0; 1:X0=1; 1:X2=1; Ok Witnesses Positive: 1 Negative: 3 Condition exists (1:X0=1 /\ 1:X2=0) Observation mp Sometimes 1 3 Time mp 0.01 Hash=211d5b298572012a0869d4ded6a40b7f 指定したX0=1, X2=0は 起こりうる

Slide 10

Slide 10 text

Litmus Test: MP - シミュレータ上での結果は? > herd7 mp.litmus Test mp Allowed States 4 1:X0=0; 1:X2=0; 1:X0=0; 1:X2=1; 1:X0=1; 1:X2=0; 1:X0=1; 1:X2=1; Ok Witnesses Positive: 1 Negative: 3 Condition exists (1:X0=1 /\ 1:X2=0) Observation mp Sometimes 1 3 Time mp 0.01 Hash=211d5b298572012a0869d4ded6a40b7f 指定したX0=1, X2=0は 起こりうる

Slide 11

Slide 11 text

結果の rf, fr, po について po: po = Program Order スレッド内で起こったイベント遷移につく rf : rf = read from スレッド間で書き込んだ値が,その後に読 み込まれたときに矢印がつく links a write w to a read r taking its value from w fr : fr = from read ...

Slide 12

Slide 12 text

fr と co ※ 画像は A working example of how to use the herd7 Memory Model Tool から https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/how-to-use-the-memory-m odel-tool (2020/7/31時点有効) co : coherence order 同一メモリアドレスへの書き込みの順序につく fr : from read 一つの読み込みから,後に続くすべてのスレッド間の coで遷移する書き込みに対して矢印がつく links a read r to a write w co-after the write w from which r takes its value. co, rf, fr でスレッド間通信を表現する

Slide 13

Slide 13 text

結果について po: po = Program Order スレッド内で起こったイベント遷移につく rf : rf = read from スレッド間で書き込んだ値が,その後に読 み込まれたときに矢印がつく. links a write w to a read r taking its value from w fr : from read 一つの読み込みから,後に続くすべての スレッド間のcoで遷移する書き込みに対 して矢印がつく links a read r to a write w co-after the write w from which r takes its value.

Slide 14

Slide 14 text

Armv8 は Release Consistency Model Model Used in Release consistency Armv8, RISC-V, MIPS, C, and C++ spec Sequential consistency 多くのマシンで optional Total store order or processor consistency IBMS/370, DEC VAX, SPARC Partial store order SPARC Weak ordering PowerPC ※ Computer Architecture: A Quantitative Approach Sixth Edition から

Slide 15

Slide 15 text

Sequential Consistency (SC) モデルの場合 P0 | P1 ; MOV W0,#1 | LDR W0,[X1] ; STR W0,[X1] | LDR W2,[X3] ; MOV W2,#1 | ; STR W2,[X3] | ; X1で指定したアドレス先に 1をストア X3で指定したアドレス先に 1をストア ※P0, P1 は別のコア上で動作するスレッド 1. X1で指定したアドレスから値をロード 2. X3で指定したアドレスから値をロード P1でとり得る値の組: (W0, W1) = (0, 0), (0, 1), (1, 1) P1でとり得ない値の組: (W0, W1) = (1, 0)

Slide 16

Slide 16 text

Barriers - Data Memory Barrier (DMB) - Data Synchronization Barrier (DSB) - Instruction Synchronization Barrier (ISB) - One way barriers (Armv8-a only)

Slide 17

Slide 17 text

DMB (Data Memory Barrier) - DMB命令を跨ぐデータアクセス命令の再順序付けを防止する - DMB命令の前に実行される全てのデータアクセスは指定された共有ドメイン内で 観測可能となる 1: LDR x0, x[1] // STR より必ず先でなければいけない 2: DMB ISH // システム全体でDMB命令前のデータアクセスが観測可能となる ( : DMB OSH // Inner shareableドメイン内でデータアクセスが観測可能となる ) ( : DMB SY // Outer shareableドメイン内でデータアクセスが観測可能となる ) 3: // 1のストアの値は共有ドメイン内において反映され,観測できる 4: ADD x2, #1 // LDR より後でも,先でも良い 5: STR x3, [x4] // LDR より必ず後でなければいけない

Slide 18

Slide 18 text

Shareability attributes ※画像出典: ARM Cortex-A Series Programmer's Guide for ARMv8-A から

Slide 19

Slide 19 text

Litmus Test: MP, Barrierを入れる AArch64 MP { 0:X1=x; 0:X3=y; 1:X1=y; 1:X3=x; } P0 | P1 ; MOV W0,#1 | LDR W0,[X1] ; STR W0,[X1] | LDR W2,[X3] ; MOV W2,#1 | ; STR W2,[X3] | ; exists (1:X0=1 /\ 1:X2=0) AArch64 MP+dmb.sys { 0:X1=x; 0:X3=y; 1:X1=y; 1:X3=x; } P0 | P1 ; MOV W0,#1 | LDR W0,[X1] ; STR W0,[X1] | DMB SY ; DMB SY | LDR W2,[X3] ; MOV W2,#1 | ; STR W2,[X3] | ; exists (1:X0=1 /\ 1:X2=0)

Slide 20

Slide 20 text

Litmus Test: MP, Barrierを入れる AArch64 MP { 0:X1=x; 0:X3=y; 1:X1=y; 1:X3=x; } P0 | P1 ; MOV W0,#1 | LDR W0,[X1] ; STR W0,[X1] | LDR W2,[X3] ; MOV W2,#1 | ; STR W2,[X3] | ; exists (1:X0=1 /\ 1:X2=0) AArch64 MP+dmb.sys { 0:X1=x; 0:X3=y; 1:X1=y; 1:X3=x; } P0 | P1 ; MOV W0,#1 | LDR W0,[X1] ; STR W0,[X1] | DMB SY ; DMB SY | LDR W2,[X3] ; MOV W2,#1 | ; STR W2,[X3] | ; exists (1:X0=1 /\ 1:X2=0)

Slide 21

Slide 21 text

Litmus Test: Barrier 付きMP - 結果(実機) >./mp+dmb.sys.exe -s 5000000 -r 10 Test mp+dmb.sys Allowed Histogram (3 states) 24095388:>1:X0=0; 1:X2=0; 905105:>1:X0=0; 1:X2=1; 24999507:>1:X0=1; 1:X2=1; No Witnesses Positive: 0, Negative: 50000000 Condition exists (1:X0=1 /\ 1:X2=0) is NOT validated Hash=592564b7f5bb278c1fc33861dd44472b Generator=diyone7 (version 7.56+01(dev)) Com=Rf Fr Orig=DMB.SYdWW Rfe DMB.SYdRR Fre Observation mp+dmb.sys Never 0 50000000 Time mp+dmb.sys 12.49 指定したX0=1, X2=0は起こらない 回数増やしてみた

Slide 22

Slide 22 text

Litmus Test: Barrier 付きMP - 結果(シミュレータ) > herd7 mp+dmb+sys.litmus Test MP+dmb.sys Allowed States 3 1:X0=0; 1:X2=0; 1:X0=0; 1:X2=1; 1:X0=1; 1:X2=1; No Witnesses Positive: 0 Negative: 3 Condition exists (1:X0=1 /\ 1:X2=0) Observation MP+dmb.sys Never 0 3 Time MP+dmb.sys 0.18 Hash=592564b7f5bb278c1fc33861dd44472b 指定したX0=1, X2=0は 起こらない

Slide 23

Slide 23 text

Armv8-A: One-way barriers - LDAR - プログラム順にLDARの後にあり、ターゲットアドレスの共有ドメインに一致するすべてのロードとストア は、LDARの後に観察されなければならない。 - STLR - ターゲットアドレスの共有ドメインと一致するSTLRの前のすべてのロードとストアは、STLRの前に観察さ れなければならない。 Sequential Consistency に従うAcquire/Release命令として,Release Consistency Model (※1)を基礎としてサポートされた. C/C++11の acquire/release よりも強く,memory_order_seq_cstの要件を満たすように設計されている(※2,3). - ※1 Adve & Gharachorloo Shared Memory Consistency Models: A Tutorial - ※2 Modelling the ARMv8 Architecture, Operationally: Concurrency and ISA - ※3 C/C++11 mappings to processors LDAR W1, [x0] # x0で指定したアドレスからロード STLR W1, [x0] # x0で指定したアドレス先へストア

Slide 24

Slide 24 text

Armv8-A: One-way barriers - LDAR - プログラム順にLDARの後にあり、ターゲット アドレスの shareability domain に一致する すべてのロードとストアは、LDARの後に観 察されなければならない。 - STLR - ターゲットアドレスの shareability domain と 一致するSTLRの前のすべてのロードとスト アは、STLRの前に観察されなければならな い。 ※画像出展: ARM Cortex-A Series Programmer's Guide for ARMv8-A

Slide 25

Slide 25 text

Litmus Test - MP, One Way barrier で AArch64 MP { 0:X1=x; 0:X3=y; 1:X1=y; 1:X3=x; } P0 | P1 ; MOV W0,#1 | LDR W0,[X1] ; STR W0,[X1] | LDR W2,[X3] ; MOV W2,#1 | ; STR W2,[X3] | ; exists (1:X0=1 /\ 1:X2=0) AArch64 mp+rel+acq { 0:X1=x; 0:X3=y; 1:X1=y; 1:X3=x; } P0 | P1 ; MOV W0,#1 | LDAR W0,[X1] ; STR W0,[X1] | LDR W2,[X3] ; MOV W2,#1 | ; STLR W2,[X3] | ; exists (1:X0=1 /\ 1:X2=0)

Slide 26

Slide 26 text

Litmus Test: One way Barrier MP - 結果(実機) >./mp+dmb.sys.exe -s 5000000 -r 10 Test mp+rel+acq Allowed Histogram (3 states) 24999834:>1:X0=0; 1:X2=0; 1205761:>1:X0=0; 1:X2=1; 23794405:>1:X0=1; 1:X2=1; No Witnesses Positive: 0, Negative: 50000000 Condition exists (1:X0=1 /\ 1:X2=0) is NOT validated Hash=d634f4a4e53b49ec70069a662efe7c5d Generator=diyone7 (version 7.56) Com=Rf Fr Orig=PodWWPL RfeLA PodRRAP Fre Observation mp+rel+acq Never 0 50000000 Time mp+rel+acq 12.48 指定したX0=1, X2=0は起こらない

Slide 27

Slide 27 text

Litmus Test: MP, One Way Barrier - 結果 Test mp+rel+acq Allowed States 3 1:X0=0; 1:X2=0; 1:X0=0; 1:X2=1; 1:X0=1; 1:X2=1; No Witnesses Positive: 0 Negative: 3 Condition exists (1:X0=1 /\ 1:X2=0) Observation mp+rel+acq Never 0 3 Time mp+rel+acq 0.15 Hash=d634f4a4e53b49ec70069a662efe7c5d 指定したX0=1, X2=0を 観測できなかった

Slide 28

Slide 28 text

Multi-Copy Atomicity (MCA) 最初は Non-MCA だったが,MCA に改訂された MCAの性質: - 一つのスレッドからの store は 他のすべてのスレッドに同時に観測可能になる - 例えば,以下はMCAでは禁止となる(litmus test : IRIW+addrs) ※ 画像出展: Christopher Pulte, Shaked Flur, Will Deacon, Jon French, Susmit Sarkar, and Peter Sewell. 2018. Simplifying ARM Concurrency: Multicopy-atomic Axiomatic and Operational Models for ARMv8. In POPL 2018. https://doi.org/10.1145/3158107 Alastair Reid. 2016. Trustworthy Specifications of ARM v8-A and v8-M System Level Architecture. In FMCAD 2016. 161–168.

Slide 29

Slide 29 text

./IRIW+addrs.exe Test IRIW+addrs Allowed Histogram (15 states) 173933:>1:X0=0; 1:X3=0; 3:X0=0; 3:X3=0; 37739 :>1:X0=1; 1:X3=0; 3:X0=0; 3:X3=0; 51597 :>1:X0=0; 1:X3=1; 3:X0=0; 3:X3=0; 45819 :>1:X0=1; 1:X3=1; 3:X0=0; 3:X3=0; 44850 :>1:X0=0; 1:X3=0; 3:X0=1; 3:X3=0; 134557:>1:X0=0; 1:X3=1; 3:X0=1; 3:X3=0; 5186 :>1:X0=1; 1:X3=1; 3:X0=1; 3:X3=0; 65180 :>1:X0=0; 1:X3=0; 3:X0=0; 3:X3=1; 124971:>1:X0=1; 1:X3=0; 3:X0=0; 3:X3=1; 5 :>1:X0=0; 1:X3=1; 3:X0=0; 3:X3=1; 39218 :>1:X0=1; 1:X3=1; 3:X0=0; 3:X3=1; 91844 :>1:X0=0; 1:X3=0; 3:X0=1; 3:X3=1; 2535 :>1:X0=1; 1:X3=0; 3:X0=1; 3:X3=1; 32402 :>1:X0=0; 1:X3=1; 3:X0=1; 3:X3=1; 150164:>1:X0=1; 1:X3=1; 3:X0=1; 3:X3=1; No ...

Slide 30

Slide 30 text

⚠注意事項 & まとめ ここらへんの話は,分かりづらい(当社比)なので,正確に知りたい方は各種参考文献に あたったほうがよいです.その時に,文章だけでは分かりづらいものについて,リトマス テストをやってみるというのは良い補助となると思っています. 今日使った litmus test は https://github.com/4ge32/ltt みんなリトマステストしよう(?)

Slide 31

Slide 31 text

References 1 (リンクは2020/7/30時点有効確認) - ARM® Cortex® -A Series Version: 1.0 Programmer’s Guide for ARMv8-A https://developer.arm.com/documentation/den0024/a - A working example of how to use the herd7 Memory Model Tool https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/how-to-use-the-memory-model-tool?_ ga=2.157383987.803681745.1594033435-1355561755.1593175946 - How to generate litmus tests automatically with the diy7 tool https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/generate-litmus-tests-automatically-diy 7-tool?_ga=2.214085780.2873799.1594211965-1355561755.1593175946 - A Tutorial Introduction to the ARM and POWER Relaxed Memory Models https://www.cl.cam.ac.uk/~pes20/ppc-supplemental/test7.pdf - Armv8-A architecture: 2016 additions https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/armv8-a-architecture-2016-additions - Why linux set memory as inner shareable in multi-cluster ARMv8 cores? https://community.arm.com/developer/ip-products/processors/f/cortex-a-forum/9715/why-linux-set-memory-as-inner-shareable-i n-multi-cluster-armv8-cores

Slide 32

Slide 32 text

References 2 (リンクは2020/7/30時点有効確認) - A diy “Seven” tutorial http://diy.inria.fr/doc/diy.pdf - LINUX KERNEL MEMORY CONSISTENCY MODEL https://www.kernel.org/doc/readme/tools-memory-model-README - Tests and test results https://www.cl.cam.ac.uk/~pes20/arm-supplemental/arm001.html#toc4 - How do multicore machines actually behave? https://www.microsoft.com/en-us/research/wp-content/uploads/2012/02/petersewellslides-transform-2012-07.pdf - Prerequisite knowledge for shared memory concurrency https://www.slideshare.net/vh21/pre-knowledge-for-shared-memory-concurrency - Simplifying ARM Concurrency: Multicopy-Atomic Axiomatic and Operational Models for ARMv8 https://www.cl.cam.ac.uk/~pes20/armv8-mca/armv8-mca-draft.pdf - メモリモデル?なにそれ?おいしいの?https://yohhoy.hatenablog.jp/entry/2014/12/21/171035

Slide 33

Slide 33 text

おわり