Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Armv8-A_メモリモデル.pdf

shigemi1014
August 08, 2020
3k

 Armv8-A_メモリモデル.pdf

shigemi1014

August 08, 2020
Tweet

Transcript

  1. 早速ですが,クイズです [?] 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) = ?
  2. 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)も考えられるが論理的に起こ りえない
  3. 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
  4. 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を個別に 持っていることに注意
  5. 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 にいれかえたものを使用
  6. 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は 起こりうる
  7. 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は 起こりうる
  8. 結果の 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 ...
  9. 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 でスレッド間通信を表現する
  10. 結果について 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.
  11. 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 から
  12. 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)
  13. Barriers - Data Memory Barrier (DMB) - Data Synchronization Barrier

    (DSB) - Instruction Synchronization Barrier (ISB) - One way barriers (Armv8-a only)
  14. 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 より必ず後でなければいけない
  15. 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)
  16. 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)
  17. 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は起こらない 回数増やしてみた
  18. 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は 起こらない
  19. 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で指定したアドレス先へストア
  20. 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
  21. 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)
  22. 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は起こらない
  23. 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を 観測できなかった
  24. 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.
  25. ./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 ...
  26. 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
  27. 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