SlideShare a Scribd company logo
1 of 57
Download to read offline
1 @ikwzm高位合成友の会 2018 秋
高位合成友の会 2018 秋
Cache Coherency の話
2018 年 9 月 22 日初版
@ikwzm
2 @ikwzm高位合成友の会 2018 秋
自己紹介みたいなもの
・ハンドルネーム ikwzm
・現在隠居中
・もうすぐ 54 才(けっこう年)
・主に論理回路設計(回路図~VHDL)
・たまにプログラム(アセンブラ~C/Ruby)
・言語の設計は素人
3 @ikwzm高位合成友の会 2018 秋
Cache Coherency トラブルの症状
・ ケース1 CPU が書いたデータが FPGA から正しく読めない
・ ケース 2 FPGA が書いたデータが CPU から正しく読めない
4 @ikwzm高位合成友の会 2018 秋
Cache Coherency でトラブルが発生するケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
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 @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 @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 @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 @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 をキャッシュ
10 @ikwzm高位合成友の会 2018 秋
Cache Coherency トラブルの解決方法
・ キャッシュを使わない
・ ソフトウェアによる解決方法
ソフトウェアで Cache Flush/Invalidiate する
・ ハードウェアによる解決方法
Cache Coherency に対応した Cache と Interconnect
11 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xDEAD
1. CPU が Addr=0x0080 に
Data=0xABED をライト
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 @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 @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 @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 @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 @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 @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 をリード
19 @ikwzm高位合成友の会 2018 秋
ソフトウェアで Cache を制御する方法の問題点
・ 面倒くせ~よ
・ 相手がリード/ライトするタイミングが判ってないと無理
・ CPU が DMA や FPGA を制御する場合は可能だけど、
マルチプロセッサ間では難しい
・ 時間がかかる
・ キャッシュの操作は意外と時間がかかる
・ しかもクリティカルセクション(他の処理ができない)
20 @ikwzm高位合成友の会 2018 秋
ソフトウェアによるキャッシュ操作時間の例 - Zynq の場合
・ https://github.com/ikwzm/FPGA-SoC-Linux-Example-1-ZYBO-Z7
・ 転送サイズ : 1MiB(1048576Byte)
・ DMA で Mem→FPGA と FPGA->Mem を同時に転送
ソフトウェアによるキャッシュ操作なし
0ms 5ms 10ms 15ms
ソフトウェアによるキャッシュ操作あり
6.1ms
13.0ms
5.6ms
5.4ms5.1ms 2.5ms
setup time cleanup timedma&run time
・ 1MiB キャッシュフラッシュに 4.9msec
・ 1MiB キャッシュ無効化に 2.3msec
21 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency - 用意するもの
CPU
addr data
CPU
addr data
Mem FPGA
Cache Coherency に対応した
Interface Protocol
Cache Coherency に対応した
InterConnect
Cache Coherency に対応した Cache
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 @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 @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 @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 @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 @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 @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 @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 @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 @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 @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 @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)
34 @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)
3. Accelerator が Addr=0x0080 から 64 バイトのデータをライト
4. この場合はキャッシュを Invalidiate するだけで事足りる
5. Accelerator からのデータをメモリにライト
35 @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)
3. Accelerator が Addr=0x0090 から 8 バイトのデータをライト
36 @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)
3. Accelerator が Addr=0x0090 から 8 バイトのデータをライト
ハッチング部をメモリに書かなければならない
37 @ikwzm高位合成友の会 2018 秋
補足 キャッシュラインのアライメント問題
CPU
addr data
Accelerator
Addr Tag
34bit 8byte 8byte 8byte 8byte 8byte 8byte 8byte 8byte
16byte(128bit) 16byte(128bit) 16byte(128bit) 16byte(128bit)
Cache Line Size = 64byte
0x0080
7. キャッシュを Invalidiate
6.マージしたデータをメモリにライト
5.キャッシュからの
データと
Accelerator からのデータをマージ
38 @ikwzm高位合成友の会 2018 秋
ハードウェアで Cache Coherency - Zynq の場合
・ ACP(Accelarator Coherency Port)を使う
・ Zynq にはハードウェアで Cache Coherency を制御できる
専用のアクセスポートがあります
・ キャッシュラインのアライメント問題はハードで解決済み
・ HP(High Performance Port - Cache Coherency を制
御しないポート) に比べて 30%~70%の帯域しかでません
・ 参照: FPGA の部屋 『 Zynq の AXI_ACP ポートと
AXI_HP ポートの性能の違い1(AXI_ACP ポート)』
(http://marsee101.blog19.fc2.com/blog-entry-2773.html)
・ しかしソフトウェアで Cache を操作する苦労をしなくて済みます
・ とりあえず動くことを確認したい時には便利です
・ ARCACHE 信号と AWCACHE 信号を"1111"にしておくこと
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 @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 側で解決しなければならない
41 @ikwzm高位合成友の会 2018 秋
ZynqMP の Inner Share と Outer Share
S_AXI_ACP_FPD
S_AXI_ACE_FPD
S_AXI_HPC0_FPD
S_AXI_HPC1_FPD
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
Inner Share
Outer Share
・ Inner Share
・ APU 内の Snoop Control Unit を
中心として Cortex-A54 と ACP だ
けで Cache Coherency を維持
・ Outer Share
・ Inner Share に加えて CCI に接続
している ACE、 HPC0、 HPC1 も含
めて Cache Coherency を維持
・ Inner Share と Outer Share の設定
は MMU が行う
42 @ikwzm高位合成友の会 2018 秋
Memory Management Unit の働き
・ 仮想アドレスから物理アドレスへの変換
・ 仮想記憶 - 個々のプロセスからは単一のメモリマップ
・ 物理メモリの有効利用
・ 物理アドレス空間と仮想アドレス空間の分離
・ メモリ保護
・ キャッシュ制御
43 @ikwzm高位合成友の会 2018 秋
仮想アドレスから物理アドレスへの変換(Aarch32-LPAE の例)
Main Memory
(物理アドレス)12 11 02021293031
PTE Table
Phys Addr
Phys Addr
PMD Table
Table Ptr
Table Ptr
PGD Table
Table Ptr
Table Ptr
TTBRx
プロセス(仮想アドレス)
64 bit/entry64 bit/entry
64 bit/entry
512
entry
512
entry
4Kbyte/page
LPAE : Large Physical Address Extension
PTE : Page Table Entry
PMD : Page Middle Directory
PGD : Page Global Directory
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
45 @ikwzm高位合成友の会 2018 秋
Linux Kernel 4.14 の AArch64 MMU 対応
:
(中略)
:
/*
* Level 3 descriptor (PTE).
*/
#define PTE_TYPE_MASK (_AT(pteval_t, 3) << 0)
#define PTE_TYPE_FAULT (_AT(pteval_t, 0) << 0)
#define PTE_TYPE_PAGE (_AT(pteval_t, 3) << 0)
#define PTE_TABLE_BIT (_AT(pteval_t, 1) << 1)
#define PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */
#define PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */
#define PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */
#define PTE_AF (_AT(pteval_t, 1) << 10) /* Access Flag */
#define PTE_NG (_AT(pteval_t, 1) << 11) /* nG */
#define PTE_DBM (_AT(pteval_t, 1) << 51) /* Dirty Bit Management */
#define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */
#define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */
#define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */
#define PTE_HYP_XN (_AT(pteval_t, 1) << 54) /* HYP XN */
:
(後略)
:
arch/arm64/include/asm/pgtable-hwdef.h
SH[1:0] は Inner shareable と Non sharable の 2 択しかない
Linux Kernel 4.14 では Outer Share は未サポート
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 が起動した後ではこのレジスタの値を変更しても効果が無い。
47 @ikwzm高位合成友の会 2018 秋
MMU を使わないで Outer Share でも Cache Coherency 転送する方法
PMU(Power Management Unit) から lpd_apu レジスタを設定する
・ PMU は Xilinx の Microbraze という CPU 内蔵
・ MPSoC のリセット直後はまず PMU が起動する
・ PMU が外部 ROM から boot.bin の FSBL を内部 RAM にロード
・ FSBL ロード後に PMU が APU のリセットを解除する
・ boot.bin 生成時に PMU が実行するスクリプトっぽいのを埋め込む
詳しい情報は以下の URL 参照
・ 「 Zynq UltraScale MPSoC Cache Coherency」 wiki.xilinx
http://www.wiki.xilinx.com/Zynq+UltraScale+MPSoC+Cache+Coherency
・ 『 UltraZed 向け Debian GNU/Linux で AXI HPC port を使う』 @Qiita
https://qiita.com/ikwzm/items/79170301e215b21b14aa
ちなみに「 Zynq UltraScale+ MPSoC Technical Reference Manual」 には
何も書いていない
48 @ikwzm高位合成友の会 2018 秋
Linux Kernel 4.14 を Outer Share 出来るようにパッチ
:
(中略)
:
/*
* Level 3 descriptor (PTE).
*/
#define PTE_TYPE_MASK (_AT(pteval_t, 3) << 0)
#define PTE_TYPE_FAULT (_AT(pteval_t, 0) << 0)
#define PTE_TYPE_PAGE (_AT(pteval_t, 3) << 0)
#define PTE_TABLE_BIT (_AT(pteval_t, 1) << 1)
#define PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */
#define PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */
#define PTE_AF (_AT(pteval_t, 1) << 10) /* Access Flag */
#define PTE_NG (_AT(pteval_t, 1) << 11) /* nG */
#define PTE_DBM (_AT(pteval_t, 1) << 51) /* Dirty Bit Management */
#define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */
#define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */
#define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */
#define PTE_HYP_XN (_AT(pteval_t, 1) << 54) /* HYP XN */
#define PTE_SHARED_MASK (_AT(pteval_t, 3) << 8)
#define PTE_INNER_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */
#define PTE_OUTER_SHARED (_AT(pteval_t, 2) << 8) /* SH[1:0], outer shareable */
#define PTE_SHARED PTE_INNER_SHARED
:
(後略)
:
arch/arm64/include/asm/pgtable-hwdef.h
PTE_SHARED_MASK と PTE_OUTER_SHARED を追加
49 @ikwzm高位合成友の会 2018 秋
Linux Kernel 4.14 を Outer Share 出来るようにパッチ
:
(中略)
:
#if defined(CONFIG_X86)
# define VM_PAT VM_ARCH_1 /* PAT reserves whole VMA at once (x86) */
#if defined (CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS)
# define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0
# define VM_PKEY_BIT0VM_HIGH_ARCH_0 /* A protection key is a 4-bit value */
# define VM_PKEY_BIT1VM_HIGH_ARCH_1
# define VM_PKEY_BIT2VM_HIGH_ARCH_2
# define VM_PKEY_BIT3VM_HIGH_ARCH_3
#endif
#elif defined(CONFIG_PPC)
# define VM_SAO VM_ARCH_1 /* Strong Access Ordering (powerpc) */
#elif defined(CONFIG_PARISC)
# define VM_GROWSUP VM_ARCH_1
#elif defined(CONFIG_METAG)
# define VM_GROWSUP VM_ARCH_1
#elif defined(CONFIG_IA64)
# define VM_GROWSUP VM_ARCH_1
#elif defined(CONFIG_ARM64)
# define VM_OUTER_SHARED VM_ARCH_1
#elif !defined(CONFIG_MMU)
# define VM_MAPPED_COPY VM_ARCH_1 /* T if mapped copy of data (nommu mmap) */
#endif
:
(後略)
:
include/linux/mm.h
vm_flags のパラメータに VM_OUTER_SHARED を追加
50 @ikwzm高位合成友の会 2018 秋
Linux Kernel 4.14 を Outer Share 出来るようにパッチ
:
(中略)
:
pgprot_t protection_map[16] __ro_after_init = {
__P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
__S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111
};
pgprot_t vm_get_page_prot(unsigned long vm_flags)
{
return __pgprot(pgprot_val(protection_map[vm_flags &
(VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) |
pgprot_val(arch_vm_get_page_prot(vm_flags)));
}
EXPORT_SYMBOL(vm_get_page_prot);
:
(後略)
:
mm/mmap.c
vm_flags から page_prot を生成する関数
・ 上の protection_map[] から基本となる page_prot を得る
・ アーキテクチャ毎に定義された arch_vm_get_page_prot()の戻り値を論理和
(つまりビットのセットは出来るがビットのクリアは出来ない)
このファイルは他のアーキテクチャでも使うので変更しない
・ protection_map[] の中身(__P000~__S111)と
arch_vm_get_page_prot() を修正する
51 @ikwzm高位合成友の会 2018 秋
Linux Kernel 4.14 を Outer Share 出来るようにパッチ
:
(中略)
:
#define __P000 __pgprot(_PAGE_NONE & ~PTE_SHARED_MASK)
#define __P001 __pgprot(_PAGE_READONLY & ~PTE_SHARED_MASK)
#define __P010 __pgprot(_PAGE_READONLY & ~PTE_SHARED_MASK)
#define __P011 __pgprot(_PAGE_READONLY & ~PTE_SHARED_MASK)
#define __P100 __pgprot(_PAGE_EXECONLY & ~PTE_SHARED_MASK)
#define __P101 __pgprot(_PAGE_READONLY_EXEC & ~PTE_SHARED_MASK)
#define __P110 __pgprot(_PAGE_READONLY_EXEC & ~PTE_SHARED_MASK)
#define __P111 __pgprot(_PAGE_READONLY_EXEC & ~PTE_SHARED_MASK)
#define __S000 __pgprot(_PAGE_NONE & ~PTE_SHARED_MASK)
#define __S001 __pgprot(_PAGE_READONLY & ~PTE_SHARED_MASK)
#define __S010 __pgprot(_PAGE_SHARED & ~PTE_SHARED_MASK)
#define __S011 __pgprot(_PAGE_SHARED & ~PTE_SHARED_MASK)
#define __S100 __pgprot(_PAGE_EXECONLY & ~PTE_SHARED_MASK)
#define __S101 __pgprot(_PAGE_READONLY_EXEC & ~PTE_SHARED_MASK)
#define __S110 __pgprot(_PAGE_SHARED_EXEC & ~PTE_SHARED_MASK)
#define __S111 __pgprot(_PAGE_SHARED_EXEC & ~PTE_SHARED_MASK)
#define arch_vm_get_page_prot(vm_flags) 
__pgprot((vm_flags & VM_OUTER_SHARED) ? PTE_OUTER_SHARED : PTE_INNER_SHARED)
#endif /* __ASSEMBLY__ */
#endif /* __ASM_PGTABLE_PROT_H */
arch/arm64/include/asm/pgtable-prot.h
__P000~__S111 の値は
SH[1:0] の部分をクリアしておく
arch_vm_get_page_prot() では vm_flags の VM_OUTER_SHARED フラ
グの有無により PTE_OUTER_SHARED か PTE_INNER_SHARED を返す
52 @ikwzm高位合成友の会 2018 秋
Udmabuf を Outer Share の設定が出来るようにパッチ
static int udmabuf_driver_file_mmap(struct file *file, struct vm_area_struct* vma)
{
struct udmabuf_driver_data* this = file->private_data;
if ((file->f_flags & O_SYNC) | (this->sync_mode & SYNC_ALWAYS)) {
switch (this->sync_mode & SYNC_MODE_MASK) {
case SYNC_MODE_NONCACHED :
vma->vm_flags |= VM_IO;
vma->vm_page_prot = _PGPROT_NONCACHED(vma->vm_page_prot);
break;
case SYNC_MODE_WRITECOMBINE :
vma->vm_flags |= VM_IO;
vma->vm_page_prot = _PGPROT_WRITECOMBINE(vma->vm_page_prot);
break;
case SYNC_MODE_DMACOHERENT :
vma->vm_flags |= VM_IO;
vma->vm_page_prot = _PGPROT_DMACOHERENT(vma->vm_page_prot);
break;
default :
break;
}
}
else {
if (this->outer_shared) {
vma->vm_flags |= VM_OUTER_SHARED;
}
}
vma->vm_private_data = this;
udmabuf.c
outer_shared フラグが真の時は
vm_flags に VM_OUTER_SHARED を論理和する
53 @ikwzm高位合成友の会 2018 秋
Udmabuf を Outer Share の設定が出来るようにパッチ
/**
* udmabuf_platform_driver_probe() - Probe call for the device.
* @pdev: handle to the platform device structure.
* Return: Success(=0) or error status(<0).
*
* It does all the memory allocation and registration for the device.
*/
static int udmabuf_platform_driver_probe(struct platform_device *pdev)
{
:
(略)
:
/*
* outer shared property
*/
{
driver_data->outer_shared = of_property_read_bool(pdev->dev.of_node, "outer-shared");
}
:
(略)
:
}
udmabuf.c
device-tree に outer-shared プロパティがあれば、
outer_shared フラグを真にする
54 @ikwzm高位合成友の会 2018 秋
ZynqMP-FPGA-Linux-Example-3-UltraZed で試してみた
・ 『 UltraZed 向け Debian GNU/Linux で AXI HPC port を使う』 @Qiita
https://qiita.com/ikwzm/items/79170301e215b21b14aa
・ 上の記事で使った FPGA デザインとサンプルプログラムを使う
・ 詳細は上の記事参照
・ boot.bin は https://github.com/ikwzm/ZynqMP-FPGA-Linux のもの
・ Linux Kernel は前述のパッチを当てたバージョン
・ udmabuf は前述のパッチを当てたバージョン
55 @ikwzm高位合成友の会 2018 秋
ZynqMP-FPGA-Linux-Example-3-UltraZed で試してみた
・ device tree の udmabuf に outer-shared プロパティを追加
negative2-outershared.dts
/dts-v1/;/plugin/;
/ {
fragment@0 {
target-path = "/amba_pl@0";
#address-cells = <2>;
#size-cells = <2>;
__overlay__ {
:
(中略)
:
negative-udmabuf4 {
compatible = "ikwzm,udmabuf-0.10.a";
device-name = "udmabuf4";
size = <0x00100000>;
outer-shared;
};
negative-udmabuf5 {
compatible = "ikwzm,udmabuf-0.10.a";
device-name = "udmabuf5";
size = <0x00100000>;
outer-shared;
};
};
} ;
} ;
56 @ikwzm高位合成友の会 2018 秋
ZynqMP-FPGA-Linux-Example-3-UltraZed で試してみた
・ negative2.py を実行してみた
root@debian-fpga:/home/fpga/examples/negative2# tbocfg.rb -i negative --dts negative2-outershared.dts
[ 100.601124] udmabuf udmabuf4: major number = 242
[ 100.607631] udmabuf udmabuf4: minor number = 0
[ 100.617776] udmabuf udmabuf4: phys address = 0x0000000070100000
[ 100.628796] udmabuf udmabuf4: buffer size = 1048576
[ 100.633913] udmabuf udmabuf4: dma coherent = 0
[ 100.638511] udmabuf udmabuf4: outer shared = 1
[ 100.643113] udmabuf amba_pl@0:negative-udmabuf4: driver installed.
[ 100.650801] udmabuf udmabuf5: major number = 242
[ 100.655536] udmabuf udmabuf5: minor number = 1
[ 100.660126] udmabuf udmabuf5: phys address = 0x0000000070200000
[ 100.666205] udmabuf udmabuf5: buffer size = 1048576
[ 100.671325] udmabuf udmabuf5: dma coherent = 0
[ 100.675924] udmabuf udmabuf5: outer shared = 1
[ 100.680530] udmabuf amba_pl@0:negative-udmabuf5: driver installed.
root@debian-fpga:/home/fpga/examples/negative2# python3 negative.py
total:1.435[msec] setup:0.847[msec] xfer:0.044[msec] cleanup:0.544[msec]
total:1.100[msec] setup:0.620[msec] xfer:0.020[msec] cleanup:0.460[msec]
total:1.092[msec] setup:0.615[msec] xfer:0.020[msec] cleanup:0.458[msec]
total:1.094[msec] setup:0.615[msec] xfer:0.020[msec] cleanup:0.459[msec]
total:1.091[msec] setup:0.614[msec] xfer:0.020[msec] cleanup:0.457[msec]
total:1.093[msec] setup:0.615[msec] xfer:0.020[msec] cleanup:0.458[msec]
total:1.117[msec] setup:0.638[msec] xfer:0.021[msec] cleanup:0.459[msec]
total:8.966[msec] setup:0.602[msec] xfer:7.904[msec] cleanup:0.460[msec]
total:1.093[msec] setup:0.614[msec] xfer:0.020[msec] cleanup:0.459[msec]
average_setup_time :0.642[msec]
average_cleanup_time:0.468[msec]
average_xfer_time :0.899[msec]
throughput :291.656[MByte/sec]
np.negative(udmabuf4) == udmabuf5 : OK
57 @ikwzm高位合成友の会 2018 秋
ZynqMP-FPGA-Linux-Example-3-UltraZed で試してみた
・ ちなみに outers-shared プロパティ無しのデバイスツリーをロードして実行してみると
root@debian-fpga:/home/fpga/examples/negative2# dtbocfg.rb -i negative --dts negative2.dts
[ 534.262992] udmabuf udmabuf4: major number = 242
[ 534.267995] udmabuf udmabuf4: minor number = 0
[ 534.278140] udmabuf udmabuf4: phys address = 0x0000000070100000
[ 534.289763] udmabuf udmabuf4: buffer size = 1048576
[ 534.300443] udmabuf udmabuf4: dma coherent = 0
[ 534.310597] udmabuf udmabuf4: outer shared = 0
[ 534.320752] udmabuf amba_pl@0:negative-udmabuf4: driver installed.
[ 534.334268] udmabuf udmabuf5: major number = 242
[ 534.339009] udmabuf udmabuf5: minor number = 1
[ 534.343602] udmabuf udmabuf5: phys address = 0x0000000070200000
[ 534.349671] udmabuf udmabuf5: buffer size = 1048576
[ 534.354794] udmabuf udmabuf5: dma coherent = 0
[ 534.359392] udmabuf udmabuf5: outer shared = 0
[ 534.363995] udmabuf amba_pl@0:negative-udmabuf5: driver installed.
root@debian-fpga:/home/fpga/examples/negative2# python3 negative2.py
total:8.051[msec] setup:0.128[msec] xfer:7.909[msec] cleanup:0.014[msec]
total:0.129[msec] setup:0.077[msec] xfer:0.041[msec] cleanup:0.011[msec]
total:0.105[msec] setup:0.076[msec] xfer:0.019[msec] cleanup:0.010[msec]
total:0.102[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec]
total:0.103[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec]
total:0.102[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec]
total:0.102[msec] setup:0.073[msec] xfer:0.018[msec] cleanup:0.010[msec]
total:0.102[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec]
total:0.101[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec]
average_setup_time :0.080[msec]
average_cleanup_time:0.011[msec]
average_xfer_time :0.898[msec]
throughput :291.949[MByte/sec]
np.negative(udmabuf4) == udmabuf5 : NG
NC Count:7024

More Related Content

What's hot

Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt AffinityについてTakuya ASADA
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速するKohei KaiGai
 
FPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたFPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたTakefumi MIYOSHI
 
仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理Akari Asai
 
20170329_BigData基盤研究会#7
20170329_BigData基盤研究会#720170329_BigData基盤研究会#7
20170329_BigData基盤研究会#7Kohei KaiGai
 
PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価Toshiaki Hishinuma
 
20170726 py data.tokyo
20170726 py data.tokyo20170726 py data.tokyo
20170726 py data.tokyoManaMurakami1
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
 
FPGAX6_hayashi
FPGAX6_hayashiFPGAX6_hayashi
FPGAX6_hayashi愛美 林
 
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望Kohei KaiGai
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpuKohei KaiGai
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜Taro Matsuzawa
 
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Mr. Vengineer
 

What's hot (20)

Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt Affinityについて
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する
 
FPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたFPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみた
 
Fpga local 20130322
Fpga local 20130322Fpga local 20130322
Fpga local 20130322
 
仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理
 
V6 unix vol.2 in okinawa
V6 unix vol.2 in okinawaV6 unix vol.2 in okinawa
V6 unix vol.2 in okinawa
 
20170329_BigData基盤研究会#7
20170329_BigData基盤研究会#720170329_BigData基盤研究会#7
20170329_BigData基盤研究会#7
 
ICD/CPSY 201412
ICD/CPSY 201412ICD/CPSY 201412
ICD/CPSY 201412
 
PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価PEZY-SC2上における倍々精度Rgemmの実装と評価
PEZY-SC2上における倍々精度Rgemmの実装と評価
 
20170726 py data.tokyo
20170726 py data.tokyo20170726 py data.tokyo
20170726 py data.tokyo
 
Reconf 201506
Reconf 201506Reconf 201506
Reconf 201506
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
FPGAX6_hayashi
FPGAX6_hayashiFPGAX6_hayashi
FPGAX6_hayashi
 
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望TPC-DSから学ぶPostgreSQLの弱点と今後の展望
TPC-DSから学ぶPostgreSQLの弱点と今後の展望
 
Ptt391
Ptt391Ptt391
Ptt391
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpu
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
Cpu cache arch
Cpu cache archCpu cache arch
Cpu cache arch
 
V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
 

Similar to 高位合成友の会(2018秋)スライド

Secrets of Izna
Secrets of IznaSecrets of Izna
Secrets of Iznanyaxt
 
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」Makoto Hirahara
 
Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache maruyama097
 
IEICE technical report (RECONF), January 2015.
IEICE technical report (RECONF), January 2015.IEICE technical report (RECONF), January 2015.
IEICE technical report (RECONF), January 2015.Takuma Usui
 
Wiresharkで検出できないチャットプログラム
Wiresharkで検出できないチャットプログラムWiresharkで検出できないチャットプログラム
Wiresharkで検出できないチャットプログラムShinichi Hirauchi
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...Masanobu Saitoh
 
機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 Fujio Kojima
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタSatoyuki Tsukano
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と MeltdownHirotaka Kawata
 
Fight Against Citadel in Japan by 中津留 勇
Fight Against Citadel in Japan by 中津留 勇Fight Against Citadel in Japan by 中津留 勇
Fight Against Citadel in Japan by 中津留 勇CODE BLUE
 
Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Windows Server 2019 の Hyper-Converged Infrastructure (HCI) Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Windows Server 2019 の Hyper-Converged Infrastructure (HCI) Hiroshi Matsumoto
 
[INSIGHT OUT 2011] B32 open hardwareの夜明け pci express 3・infiniband fdrの登場(yama...
[INSIGHT OUT 2011] B32 open hardwareの夜明け pci express 3・infiniband fdrの登場(yama...[INSIGHT OUT 2011] B32 open hardwareの夜明け pci express 3・infiniband fdrの登場(yama...
[INSIGHT OUT 2011] B32 open hardwareの夜明け pci express 3・infiniband fdrの登場(yama...Insight Technology, Inc.
 

Similar to 高位合成友の会(2018秋)スライド (15)

Secrets of Izna
Secrets of IznaSecrets of Izna
Secrets of Izna
 
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」
SFC デザイン言語WS(電子工作)第6回「PCとの連携・音」
 
Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache 
 
Apache Hadoopの未来 3系になって何が変わるのか?
Apache Hadoopの未来 3系になって何が変わるのか?Apache Hadoopの未来 3系になって何が変わるのか?
Apache Hadoopの未来 3系になって何が変わるのか?
 
IEICE technical report (RECONF), January 2015.
IEICE technical report (RECONF), January 2015.IEICE technical report (RECONF), January 2015.
IEICE technical report (RECONF), January 2015.
 
Reconf 201901
Reconf 201901Reconf 201901
Reconf 201901
 
Wiresharkで検出できないチャットプログラム
Wiresharkで検出できないチャットプログラムWiresharkで検出できないチャットプログラム
Wiresharkで検出できないチャットプログラム
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
 
機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
 
Fight Against Citadel in Japan by 中津留 勇
Fight Against Citadel in Japan by 中津留 勇Fight Against Citadel in Japan by 中津留 勇
Fight Against Citadel in Japan by 中津留 勇
 
Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Windows Server 2019 の Hyper-Converged Infrastructure (HCI) Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
Windows Server 2019 の Hyper-Converged Infrastructure (HCI)
 
[INSIGHT OUT 2011] B32 open hardwareの夜明け pci express 3・infiniband fdrの登場(yama...
[INSIGHT OUT 2011] B32 open hardwareの夜明け pci express 3・infiniband fdrの登場(yama...[INSIGHT OUT 2011] B32 open hardwareの夜明け pci express 3・infiniband fdrの登場(yama...
[INSIGHT OUT 2011] B32 open hardwareの夜明け pci express 3・infiniband fdrの登場(yama...
 

Recently uploaded

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Recently uploaded (9)

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

高位合成友の会(2018秋)スライド

  • 1. 1 @ikwzm高位合成友の会 2018 秋 高位合成友の会 2018 秋 Cache Coherency の話 2018 年 9 月 22 日初版 @ikwzm
  • 2. 2 @ikwzm高位合成友の会 2018 秋 自己紹介みたいなもの ・ハンドルネーム ikwzm ・現在隠居中 ・もうすぐ 54 才(けっこう年) ・主に論理回路設計(回路図~VHDL) ・たまにプログラム(アセンブラ~C/Ruby) ・言語の設計は素人
  • 3. 3 @ikwzm高位合成友の会 2018 秋 Cache Coherency トラブルの症状 ・ ケース1 CPU が書いたデータが FPGA から正しく読めない ・ ケース 2 FPGA が書いたデータが CPU から正しく読めない
  • 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 をキャッシュ
  • 10. 10 @ikwzm高位合成友の会 2018 秋 Cache Coherency トラブルの解決方法 ・ キャッシュを使わない ・ ソフトウェアによる解決方法 ソフトウェアで Cache Flush/Invalidiate する ・ ハードウェアによる解決方法 Cache Coherency に対応した Cache と Interconnect
  • 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 をリード
  • 19. 19 @ikwzm高位合成友の会 2018 秋 ソフトウェアで Cache を制御する方法の問題点 ・ 面倒くせ~よ ・ 相手がリード/ライトするタイミングが判ってないと無理 ・ CPU が DMA や FPGA を制御する場合は可能だけど、 マルチプロセッサ間では難しい ・ 時間がかかる ・ キャッシュの操作は意外と時間がかかる ・ しかもクリティカルセクション(他の処理ができない)
  • 20. 20 @ikwzm高位合成友の会 2018 秋 ソフトウェアによるキャッシュ操作時間の例 - Zynq の場合 ・ https://github.com/ikwzm/FPGA-SoC-Linux-Example-1-ZYBO-Z7 ・ 転送サイズ : 1MiB(1048576Byte) ・ DMA で Mem→FPGA と FPGA->Mem を同時に転送 ソフトウェアによるキャッシュ操作なし 0ms 5ms 10ms 15ms ソフトウェアによるキャッシュ操作あり 6.1ms 13.0ms 5.6ms 5.4ms5.1ms 2.5ms setup time cleanup timedma&run time ・ 1MiB キャッシュフラッシュに 4.9msec ・ 1MiB キャッシュ無効化に 2.3msec
  • 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)
  • 34. 34 @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) 3. Accelerator が Addr=0x0080 から 64 バイトのデータをライト 4. この場合はキャッシュを Invalidiate するだけで事足りる 5. Accelerator からのデータをメモリにライト
  • 35. 35 @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) 3. Accelerator が Addr=0x0090 から 8 バイトのデータをライト
  • 36. 36 @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) 3. Accelerator が Addr=0x0090 から 8 バイトのデータをライト ハッチング部をメモリに書かなければならない
  • 37. 37 @ikwzm高位合成友の会 2018 秋 補足 キャッシュラインのアライメント問題 CPU addr data Accelerator Addr Tag 34bit 8byte 8byte 8byte 8byte 8byte 8byte 8byte 8byte 16byte(128bit) 16byte(128bit) 16byte(128bit) 16byte(128bit) Cache Line Size = 64byte 0x0080 7. キャッシュを Invalidiate 6.マージしたデータをメモリにライト 5.キャッシュからの データと Accelerator からのデータをマージ
  • 38. 38 @ikwzm高位合成友の会 2018 秋 ハードウェアで Cache Coherency - Zynq の場合 ・ ACP(Accelarator Coherency Port)を使う ・ Zynq にはハードウェアで Cache Coherency を制御できる 専用のアクセスポートがあります ・ キャッシュラインのアライメント問題はハードで解決済み ・ HP(High Performance Port - Cache Coherency を制 御しないポート) に比べて 30%~70%の帯域しかでません ・ 参照: FPGA の部屋 『 Zynq の AXI_ACP ポートと AXI_HP ポートの性能の違い1(AXI_ACP ポート)』 (http://marsee101.blog19.fc2.com/blog-entry-2773.html) ・ しかしソフトウェアで Cache を操作する苦労をしなくて済みます ・ とりあえず動くことを確認したい時には便利です ・ ARCACHE 信号と AWCACHE 信号を"1111"にしておくこと
  • 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 側で解決しなければならない
  • 41. 41 @ikwzm高位合成友の会 2018 秋 ZynqMP の Inner Share と Outer Share S_AXI_ACP_FPD S_AXI_ACE_FPD S_AXI_HPC0_FPD S_AXI_HPC1_FPD 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 Inner Share Outer Share ・ Inner Share ・ APU 内の Snoop Control Unit を 中心として Cortex-A54 と ACP だ けで Cache Coherency を維持 ・ Outer Share ・ Inner Share に加えて CCI に接続 している ACE、 HPC0、 HPC1 も含 めて Cache Coherency を維持 ・ Inner Share と Outer Share の設定 は MMU が行う
  • 42. 42 @ikwzm高位合成友の会 2018 秋 Memory Management Unit の働き ・ 仮想アドレスから物理アドレスへの変換 ・ 仮想記憶 - 個々のプロセスからは単一のメモリマップ ・ 物理メモリの有効利用 ・ 物理アドレス空間と仮想アドレス空間の分離 ・ メモリ保護 ・ キャッシュ制御
  • 43. 43 @ikwzm高位合成友の会 2018 秋 仮想アドレスから物理アドレスへの変換(Aarch32-LPAE の例) Main Memory (物理アドレス)12 11 02021293031 PTE Table Phys Addr Phys Addr PMD Table Table Ptr Table Ptr PGD Table Table Ptr Table Ptr TTBRx プロセス(仮想アドレス) 64 bit/entry64 bit/entry 64 bit/entry 512 entry 512 entry 4Kbyte/page LPAE : Large Physical Address Extension PTE : Page Table Entry PMD : Page Middle Directory PGD : Page Global Directory
  • 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
  • 45. 45 @ikwzm高位合成友の会 2018 秋 Linux Kernel 4.14 の AArch64 MMU 対応 : (中略) : /* * Level 3 descriptor (PTE). */ #define PTE_TYPE_MASK (_AT(pteval_t, 3) << 0) #define PTE_TYPE_FAULT (_AT(pteval_t, 0) << 0) #define PTE_TYPE_PAGE (_AT(pteval_t, 3) << 0) #define PTE_TABLE_BIT (_AT(pteval_t, 1) << 1) #define PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */ #define PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */ #define PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ #define PTE_AF (_AT(pteval_t, 1) << 10) /* Access Flag */ #define PTE_NG (_AT(pteval_t, 1) << 11) /* nG */ #define PTE_DBM (_AT(pteval_t, 1) << 51) /* Dirty Bit Management */ #define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */ #define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */ #define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */ #define PTE_HYP_XN (_AT(pteval_t, 1) << 54) /* HYP XN */ : (後略) : arch/arm64/include/asm/pgtable-hwdef.h SH[1:0] は Inner shareable と Non sharable の 2 択しかない Linux Kernel 4.14 では Outer Share は未サポート
  • 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 が起動した後ではこのレジスタの値を変更しても効果が無い。
  • 47. 47 @ikwzm高位合成友の会 2018 秋 MMU を使わないで Outer Share でも Cache Coherency 転送する方法 PMU(Power Management Unit) から lpd_apu レジスタを設定する ・ PMU は Xilinx の Microbraze という CPU 内蔵 ・ MPSoC のリセット直後はまず PMU が起動する ・ PMU が外部 ROM から boot.bin の FSBL を内部 RAM にロード ・ FSBL ロード後に PMU が APU のリセットを解除する ・ boot.bin 生成時に PMU が実行するスクリプトっぽいのを埋め込む 詳しい情報は以下の URL 参照 ・ 「 Zynq UltraScale MPSoC Cache Coherency」 wiki.xilinx http://www.wiki.xilinx.com/Zynq+UltraScale+MPSoC+Cache+Coherency ・ 『 UltraZed 向け Debian GNU/Linux で AXI HPC port を使う』 @Qiita https://qiita.com/ikwzm/items/79170301e215b21b14aa ちなみに「 Zynq UltraScale+ MPSoC Technical Reference Manual」 には 何も書いていない
  • 48. 48 @ikwzm高位合成友の会 2018 秋 Linux Kernel 4.14 を Outer Share 出来るようにパッチ : (中略) : /* * Level 3 descriptor (PTE). */ #define PTE_TYPE_MASK (_AT(pteval_t, 3) << 0) #define PTE_TYPE_FAULT (_AT(pteval_t, 0) << 0) #define PTE_TYPE_PAGE (_AT(pteval_t, 3) << 0) #define PTE_TABLE_BIT (_AT(pteval_t, 1) << 1) #define PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */ #define PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */ #define PTE_AF (_AT(pteval_t, 1) << 10) /* Access Flag */ #define PTE_NG (_AT(pteval_t, 1) << 11) /* nG */ #define PTE_DBM (_AT(pteval_t, 1) << 51) /* Dirty Bit Management */ #define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */ #define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */ #define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */ #define PTE_HYP_XN (_AT(pteval_t, 1) << 54) /* HYP XN */ #define PTE_SHARED_MASK (_AT(pteval_t, 3) << 8) #define PTE_INNER_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ #define PTE_OUTER_SHARED (_AT(pteval_t, 2) << 8) /* SH[1:0], outer shareable */ #define PTE_SHARED PTE_INNER_SHARED : (後略) : arch/arm64/include/asm/pgtable-hwdef.h PTE_SHARED_MASK と PTE_OUTER_SHARED を追加
  • 49. 49 @ikwzm高位合成友の会 2018 秋 Linux Kernel 4.14 を Outer Share 出来るようにパッチ : (中略) : #if defined(CONFIG_X86) # define VM_PAT VM_ARCH_1 /* PAT reserves whole VMA at once (x86) */ #if defined (CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS) # define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0 # define VM_PKEY_BIT0VM_HIGH_ARCH_0 /* A protection key is a 4-bit value */ # define VM_PKEY_BIT1VM_HIGH_ARCH_1 # define VM_PKEY_BIT2VM_HIGH_ARCH_2 # define VM_PKEY_BIT3VM_HIGH_ARCH_3 #endif #elif defined(CONFIG_PPC) # define VM_SAO VM_ARCH_1 /* Strong Access Ordering (powerpc) */ #elif defined(CONFIG_PARISC) # define VM_GROWSUP VM_ARCH_1 #elif defined(CONFIG_METAG) # define VM_GROWSUP VM_ARCH_1 #elif defined(CONFIG_IA64) # define VM_GROWSUP VM_ARCH_1 #elif defined(CONFIG_ARM64) # define VM_OUTER_SHARED VM_ARCH_1 #elif !defined(CONFIG_MMU) # define VM_MAPPED_COPY VM_ARCH_1 /* T if mapped copy of data (nommu mmap) */ #endif : (後略) : include/linux/mm.h vm_flags のパラメータに VM_OUTER_SHARED を追加
  • 50. 50 @ikwzm高位合成友の会 2018 秋 Linux Kernel 4.14 を Outer Share 出来るようにパッチ : (中略) : pgprot_t protection_map[16] __ro_after_init = { __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111 }; pgprot_t vm_get_page_prot(unsigned long vm_flags) { return __pgprot(pgprot_val(protection_map[vm_flags & (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) | pgprot_val(arch_vm_get_page_prot(vm_flags))); } EXPORT_SYMBOL(vm_get_page_prot); : (後略) : mm/mmap.c vm_flags から page_prot を生成する関数 ・ 上の protection_map[] から基本となる page_prot を得る ・ アーキテクチャ毎に定義された arch_vm_get_page_prot()の戻り値を論理和 (つまりビットのセットは出来るがビットのクリアは出来ない) このファイルは他のアーキテクチャでも使うので変更しない ・ protection_map[] の中身(__P000~__S111)と arch_vm_get_page_prot() を修正する
  • 51. 51 @ikwzm高位合成友の会 2018 秋 Linux Kernel 4.14 を Outer Share 出来るようにパッチ : (中略) : #define __P000 __pgprot(_PAGE_NONE & ~PTE_SHARED_MASK) #define __P001 __pgprot(_PAGE_READONLY & ~PTE_SHARED_MASK) #define __P010 __pgprot(_PAGE_READONLY & ~PTE_SHARED_MASK) #define __P011 __pgprot(_PAGE_READONLY & ~PTE_SHARED_MASK) #define __P100 __pgprot(_PAGE_EXECONLY & ~PTE_SHARED_MASK) #define __P101 __pgprot(_PAGE_READONLY_EXEC & ~PTE_SHARED_MASK) #define __P110 __pgprot(_PAGE_READONLY_EXEC & ~PTE_SHARED_MASK) #define __P111 __pgprot(_PAGE_READONLY_EXEC & ~PTE_SHARED_MASK) #define __S000 __pgprot(_PAGE_NONE & ~PTE_SHARED_MASK) #define __S001 __pgprot(_PAGE_READONLY & ~PTE_SHARED_MASK) #define __S010 __pgprot(_PAGE_SHARED & ~PTE_SHARED_MASK) #define __S011 __pgprot(_PAGE_SHARED & ~PTE_SHARED_MASK) #define __S100 __pgprot(_PAGE_EXECONLY & ~PTE_SHARED_MASK) #define __S101 __pgprot(_PAGE_READONLY_EXEC & ~PTE_SHARED_MASK) #define __S110 __pgprot(_PAGE_SHARED_EXEC & ~PTE_SHARED_MASK) #define __S111 __pgprot(_PAGE_SHARED_EXEC & ~PTE_SHARED_MASK) #define arch_vm_get_page_prot(vm_flags) __pgprot((vm_flags & VM_OUTER_SHARED) ? PTE_OUTER_SHARED : PTE_INNER_SHARED) #endif /* __ASSEMBLY__ */ #endif /* __ASM_PGTABLE_PROT_H */ arch/arm64/include/asm/pgtable-prot.h __P000~__S111 の値は SH[1:0] の部分をクリアしておく arch_vm_get_page_prot() では vm_flags の VM_OUTER_SHARED フラ グの有無により PTE_OUTER_SHARED か PTE_INNER_SHARED を返す
  • 52. 52 @ikwzm高位合成友の会 2018 秋 Udmabuf を Outer Share の設定が出来るようにパッチ static int udmabuf_driver_file_mmap(struct file *file, struct vm_area_struct* vma) { struct udmabuf_driver_data* this = file->private_data; if ((file->f_flags & O_SYNC) | (this->sync_mode & SYNC_ALWAYS)) { switch (this->sync_mode & SYNC_MODE_MASK) { case SYNC_MODE_NONCACHED : vma->vm_flags |= VM_IO; vma->vm_page_prot = _PGPROT_NONCACHED(vma->vm_page_prot); break; case SYNC_MODE_WRITECOMBINE : vma->vm_flags |= VM_IO; vma->vm_page_prot = _PGPROT_WRITECOMBINE(vma->vm_page_prot); break; case SYNC_MODE_DMACOHERENT : vma->vm_flags |= VM_IO; vma->vm_page_prot = _PGPROT_DMACOHERENT(vma->vm_page_prot); break; default : break; } } else { if (this->outer_shared) { vma->vm_flags |= VM_OUTER_SHARED; } } vma->vm_private_data = this; udmabuf.c outer_shared フラグが真の時は vm_flags に VM_OUTER_SHARED を論理和する
  • 53. 53 @ikwzm高位合成友の会 2018 秋 Udmabuf を Outer Share の設定が出来るようにパッチ /** * udmabuf_platform_driver_probe() - Probe call for the device. * @pdev: handle to the platform device structure. * Return: Success(=0) or error status(<0). * * It does all the memory allocation and registration for the device. */ static int udmabuf_platform_driver_probe(struct platform_device *pdev) { : (略) : /* * outer shared property */ { driver_data->outer_shared = of_property_read_bool(pdev->dev.of_node, "outer-shared"); } : (略) : } udmabuf.c device-tree に outer-shared プロパティがあれば、 outer_shared フラグを真にする
  • 54. 54 @ikwzm高位合成友の会 2018 秋 ZynqMP-FPGA-Linux-Example-3-UltraZed で試してみた ・ 『 UltraZed 向け Debian GNU/Linux で AXI HPC port を使う』 @Qiita https://qiita.com/ikwzm/items/79170301e215b21b14aa ・ 上の記事で使った FPGA デザインとサンプルプログラムを使う ・ 詳細は上の記事参照 ・ boot.bin は https://github.com/ikwzm/ZynqMP-FPGA-Linux のもの ・ Linux Kernel は前述のパッチを当てたバージョン ・ udmabuf は前述のパッチを当てたバージョン
  • 55. 55 @ikwzm高位合成友の会 2018 秋 ZynqMP-FPGA-Linux-Example-3-UltraZed で試してみた ・ device tree の udmabuf に outer-shared プロパティを追加 negative2-outershared.dts /dts-v1/;/plugin/; / { fragment@0 { target-path = "/amba_pl@0"; #address-cells = <2>; #size-cells = <2>; __overlay__ { : (中略) : negative-udmabuf4 { compatible = "ikwzm,udmabuf-0.10.a"; device-name = "udmabuf4"; size = <0x00100000>; outer-shared; }; negative-udmabuf5 { compatible = "ikwzm,udmabuf-0.10.a"; device-name = "udmabuf5"; size = <0x00100000>; outer-shared; }; }; } ; } ;
  • 56. 56 @ikwzm高位合成友の会 2018 秋 ZynqMP-FPGA-Linux-Example-3-UltraZed で試してみた ・ negative2.py を実行してみた root@debian-fpga:/home/fpga/examples/negative2# tbocfg.rb -i negative --dts negative2-outershared.dts [ 100.601124] udmabuf udmabuf4: major number = 242 [ 100.607631] udmabuf udmabuf4: minor number = 0 [ 100.617776] udmabuf udmabuf4: phys address = 0x0000000070100000 [ 100.628796] udmabuf udmabuf4: buffer size = 1048576 [ 100.633913] udmabuf udmabuf4: dma coherent = 0 [ 100.638511] udmabuf udmabuf4: outer shared = 1 [ 100.643113] udmabuf amba_pl@0:negative-udmabuf4: driver installed. [ 100.650801] udmabuf udmabuf5: major number = 242 [ 100.655536] udmabuf udmabuf5: minor number = 1 [ 100.660126] udmabuf udmabuf5: phys address = 0x0000000070200000 [ 100.666205] udmabuf udmabuf5: buffer size = 1048576 [ 100.671325] udmabuf udmabuf5: dma coherent = 0 [ 100.675924] udmabuf udmabuf5: outer shared = 1 [ 100.680530] udmabuf amba_pl@0:negative-udmabuf5: driver installed. root@debian-fpga:/home/fpga/examples/negative2# python3 negative.py total:1.435[msec] setup:0.847[msec] xfer:0.044[msec] cleanup:0.544[msec] total:1.100[msec] setup:0.620[msec] xfer:0.020[msec] cleanup:0.460[msec] total:1.092[msec] setup:0.615[msec] xfer:0.020[msec] cleanup:0.458[msec] total:1.094[msec] setup:0.615[msec] xfer:0.020[msec] cleanup:0.459[msec] total:1.091[msec] setup:0.614[msec] xfer:0.020[msec] cleanup:0.457[msec] total:1.093[msec] setup:0.615[msec] xfer:0.020[msec] cleanup:0.458[msec] total:1.117[msec] setup:0.638[msec] xfer:0.021[msec] cleanup:0.459[msec] total:8.966[msec] setup:0.602[msec] xfer:7.904[msec] cleanup:0.460[msec] total:1.093[msec] setup:0.614[msec] xfer:0.020[msec] cleanup:0.459[msec] average_setup_time :0.642[msec] average_cleanup_time:0.468[msec] average_xfer_time :0.899[msec] throughput :291.656[MByte/sec] np.negative(udmabuf4) == udmabuf5 : OK
  • 57. 57 @ikwzm高位合成友の会 2018 秋 ZynqMP-FPGA-Linux-Example-3-UltraZed で試してみた ・ ちなみに outers-shared プロパティ無しのデバイスツリーをロードして実行してみると root@debian-fpga:/home/fpga/examples/negative2# dtbocfg.rb -i negative --dts negative2.dts [ 534.262992] udmabuf udmabuf4: major number = 242 [ 534.267995] udmabuf udmabuf4: minor number = 0 [ 534.278140] udmabuf udmabuf4: phys address = 0x0000000070100000 [ 534.289763] udmabuf udmabuf4: buffer size = 1048576 [ 534.300443] udmabuf udmabuf4: dma coherent = 0 [ 534.310597] udmabuf udmabuf4: outer shared = 0 [ 534.320752] udmabuf amba_pl@0:negative-udmabuf4: driver installed. [ 534.334268] udmabuf udmabuf5: major number = 242 [ 534.339009] udmabuf udmabuf5: minor number = 1 [ 534.343602] udmabuf udmabuf5: phys address = 0x0000000070200000 [ 534.349671] udmabuf udmabuf5: buffer size = 1048576 [ 534.354794] udmabuf udmabuf5: dma coherent = 0 [ 534.359392] udmabuf udmabuf5: outer shared = 0 [ 534.363995] udmabuf amba_pl@0:negative-udmabuf5: driver installed. root@debian-fpga:/home/fpga/examples/negative2# python3 negative2.py total:8.051[msec] setup:0.128[msec] xfer:7.909[msec] cleanup:0.014[msec] total:0.129[msec] setup:0.077[msec] xfer:0.041[msec] cleanup:0.011[msec] total:0.105[msec] setup:0.076[msec] xfer:0.019[msec] cleanup:0.010[msec] total:0.102[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec] total:0.103[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec] total:0.102[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec] total:0.102[msec] setup:0.073[msec] xfer:0.018[msec] cleanup:0.010[msec] total:0.102[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec] total:0.101[msec] setup:0.073[msec] xfer:0.019[msec] cleanup:0.010[msec] average_setup_time :0.080[msec] average_cleanup_time:0.011[msec] average_xfer_time :0.898[msec] throughput :291.949[MByte/sec] np.negative(udmabuf4) == udmabuf5 : NG NC Count:7024