4. 4 @ikwzm高位合成友の会 2018 秋
Cache Coherency でトラブルが発生するケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
5. 5 @ikwzm高位合成友の会 2018 秋
Cache Coherency でトラブルが発生するケース1
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xDEAD
この時まだ Mem にはライトされてない
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 に
Data=0xABED をライト
6. 6 @ikwzm高位合成友の会 2018 秋
Cache Coherency でトラブルが発生するケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
4. 未だ Mem の Addr=0x0080 には
Data=0xABED は書き込まれて
いないので、 FPGA は
Data=0xDEAD を読んでしまう
0x0080 0xABED
0x0080 0xDEAD
3. FPGA が Addr=0x0080 をリード
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
7. 7 @ikwzm高位合成友の会 2018 秋
Cache Coherency でトラブルが発生するケース 2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
2. Cache に無いので Mem にリード
1. CPU が Addr=0x0080 をリード
8. 8 @ikwzm高位合成友の会 2018 秋
Cache Coherency でトラブルが発生するケース 2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
0x0080 0xABED
0x0080 0xDEAD
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
2. Cache に無いので Mem にリード
9. 9 @ikwzm高位合成友の会 2018 秋
Cache Coherency でトラブルが発生するケース 2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
Data Cache に Addr=0x0080 のデ
ータ(0xABED)が残っているので、
CPU は data=0xABED と誤った値を
リード(Mem にはリードしない)
0x0080 0xABED
0x0080 0xDEAD
2. Cache に無いので Mem にリード
5. CPU が Addr=0x0080 をリード
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
11. 11 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xDEAD
1. CPU が Addr=0x0080 に
Data=0xABED をライト
12. 12 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
0x0080 0xABED
0x0080 0xDEAD
13. 13 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
0x0080 0xABED
0x0080 0xABED
3. Data Cache の Addr=0x0080
をソフトウェアで強制的に Flush
14. 14 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
4. FPGA が Addr=0x0080
をリード
0x0080 0xDEAD
3. Data Cache の Addr=0x0080
をソフトウェアで強制的に Flush
FPGA は正しい値
(0xABED)が読める
15. 15 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
2. Cache に無いので Mem にリード
1. CPU が Addr=0x0080 をリード
16. 16 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
0x0080 0xABED
0x0080 0xDEAD
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080
に Data=0xDEAD をライト
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
17. 17 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
0x0080 0xABED
0x0080 0xDEAD
2. Cache に無いので Mem にリード
5. Data Cache の Addr=0x0080
をソフトウェアで Invalidiate(無効化)
18. 18 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
0x0080 0xDEAD
0x0080 0xDEAD
2. Cache に無いので Mem にリード
5. Data Cache の Addr=0x0080
をソフトウェアで Invalidiate(無効化)
7. Cache に無いので Mem にリード
6. CPU が Addr=0x0080 をリード
21. 21 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency - 用意するもの
CPU
addr data
CPU
addr data
Mem FPGA
Cache Coherency に対応した
Interface Protocol
Cache Coherency に対応した
InterConnect
Cache Coherency に対応した Cache
22. 22 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
0x0080 0xABED
0x0080 0xDEAD
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
23. 23 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
3. FPGA が Addr=0x0080
をリード
0x0080 0xABED
0x0080 0xDEAD
24. 24 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
3. FPGA が Addr=0x0080
をリード
0x0080 0xABED
0x0080 0xDEAD
4.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
25. 25 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
3. FPGA が Addr=0x0080
をリード
0x0080 0xABED
0x0080 0xDEAD
4.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
5.該当する Addr(0x0080)のデータを
キャッシュしているマスターがいる場合は
マスターがデータを出力
26. 26 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
3. FPGA が Addr=0x00C0
をリード
0x0080 0xABED
0x00C0 0xDEAD
4.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
5.該当する Addr(0x00C0)のデータを
キャッシュしているマスターがいない場合
は Mem から読む
27. 27 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース 2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
2. Cache に無いので Mem にリード
1. CPU が Addr=0x0080 をリード
28. 28 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース 2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 をリード
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080
に Data=0xDEAD をライト
29. 29 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース 2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 をリード
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080
に Data=0xDEAD をライト
5.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
30. 30 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース 2 (キャッシュラインサイズの書き込みの場合)
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xDEAD
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 をリード
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
5.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
6.該当する Addr(0x0080)のデータを
キャッシュしているマスターはキャッシュを
無効化(Invalidiate)
7. Mem の Addr=0x0080 に
Data=0xDEAD をライト
31. 31 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency ケース 2 (キャッシュラインサイズの書き込みの場合)
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xDEAD
0x0080 0xDEAD
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 をリード
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
5.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
6.該当する Addr(0x0080)のデータを
キャッシュしているマスターはキャッシュを
無効化(Invalidiate)
7. Mem の Addr=0x0080 に
Data=0xDEAD をライト
8. CPU が Addr=0x0080 をリード9. Cache に無いので Mem にリード
32. 32 @ikwzm高位合成友の会 2018 秋
補足 キャッシュラインのアライメント問題
CPU
addr data
Accelerator
キャッシュするデータの単位(通称キャッシュラインサイズ)は 64 バイト
Addr Tag
34bit 8byte 8byte 8byte 8byte 8byte 8byte 8byte 8byte
16byte(128bit) 16byte(128bit) 16byte(128bit) 16byte(128bit)
Cache Line Size = 64byte
33. 33 @ikwzm高位合成友の会 2018 秋
補足 キャッシュラインのアライメント問題
CPU
addr data
Accelerator
1.CPU が Addr=0x00A0 から 32 バイトのデータをキャッシュにライト
Addr Tag
34bit 8byte 8byte 8byte 8byte 8byte 8byte 8byte 8byte
16byte(128bit) 16byte(128bit) 16byte(128bit) 16byte(128bit)
Cache Line Size = 64byte
0x0080
2. ハッチング部がまだメモリに書き込まれていない(dirty)
39. 39 @ikwzm高位合成友の会 2018 秋
ZynqMP(Zynq Ultrascale+ MPSoC) PS-PL Interface
S_AXI_ACP_FPD
S_AXI_ACE_FPD
S_AXI_HPC0_FPD
S_AXI_HPC1_FPD
S_AXI_HP0_FPD
S_AXI_HP1_FPD
S_AXI_HP2_FPD
S_AXI_HP3_FPD
M_AXI_HPM0_FPD
M_AXI_HPM1_FPD
S_AXI_LPD
M_AXI_HPM0_LPD
PL
Interface Name Addr
Width
Data
Width
40
49
40
32
49
32
or
64
or
128
MMU
No
Yes
Cache
Coherence
I/O
No
Full
I/O
Yes
No
I/O
No
Cache
Coherent
Interconnect
MemorySubsystem
RPUI/O
GPU
PCIe
SATA
1MB L2 Cache ACE I/F ACP I/F
Snoop Control Unit
Cortex-A53
32KB I/D
Cortex-A53
32KB I/D
Cortex-A53
32KB I/D
Cortex-A53
32KB I/D
MMU
PS
MMU
MMU
40. 40 @ikwzm高位合成友の会 2018 秋
ZynqMP の ACP(Accelerator Coherency Port) の制約
S_AXI_ACP_FPD
ACP Limitations
The ACP accepts only the following (cache-line friendly) transactions.
. 64-byte aligned (of 64-byte) read/write INCR transactions. All write-
byte strobes must be same (either enabled or disabled).
. 16-byte aligned (of 16-byte) read/write INCR transactions. Write-byte
strobes can have any value.
『 Zynq UltraScale+ MPSoC TRM UG1085 (v1.0) November 24,2015』 826
ACP Coherency
The PL masters can also snoop APU caches through the APU’ s
accelerator coherency port (ACP). The ACP accesses can be used to
(read or write) allocate into L2 cache. However, the ACP only supports
aligned 64-byte and 16-byte accesses. All other accesses get a SLVERR
response.
『 Zynq UltraScale+ MPSoC TRM UG1085 (v1.0) November 24,2015』 228
Cache
Coherent
Interconnect
MemorySubsystem
RPUI/O
GPU
PCIe
SATA
1MB L2 Cache ACE I/F ACP I/F
Snoop Control Unit
Cortex-A53
32KB I/D
Cortex-A53
32KB I/D
Cortex-A53
32KB I/D
Cortex-A53
32KB I/D
MMU
PS
MMU
MMU
キャッシュのアライメント問題は PL 側で解決しなければならない
44. 44 @ikwzm高位合成友の会 2018 秋
AArch64 PTE(Page Table Entry) の Shareable attribute
PXN : Private Execution permission
UXN : User Execution permission
AF : Access Flag
SH : Shareable attribute
00: Non shareable
10: Outer shareable
11: Inner shareable
AP : Access Permission
NS : the security bit, but only at EL3 and Secure EL1
Indx : the index into the Memory Attribute Indirection Register MAIR_ELn
063
PXN
UXN
5354555863
Reserved for
software use
Uppser attributes
51
Indx
NS
4569 27
AP
8
SH
10
AF
11
11Lower attributesOutput block address
46. 46 @ikwzm高位合成友の会 2018 秋
MMU を使わないで Outer Share でも Cache Coherency 転送する方法
・ 「 Zynq UltraScale MPSoC Cache Coherency」 より
http://www.wiki.xilinx.com/Zynq+UltraScale+MPSoC+Cache+Coherency
5.2 Broadcasting Inner Shareable
This method alters a register of MPSoC to enable inner shareable
transactions to be broadcast. The brdc_inner bit of the lpd_apu
register in the LPD_SLCR module must be written while the APU is
in reset. The requirement to alter the register while the APU is in
reset can be accomplished in multiple manners.
(意訳)
・ lpd_apu レジスタの brdc_inner ビットを 1 にセットすることにより、 Inner
shareable なトランザクションを Outer Shareable 領域にもブロードキャスト
するようになる。 要は(強制的に) Outer Shareable 領域も Inner
Shareable 領域にしてしまう。
・ ただし APU がリセット中にこのレジスタの値を変更する必要がある。 つまり、 U-
Boot や Linux が起動した後ではこのレジスタの値を変更しても効果が無い。