69
1 @ikwzm ZynqMP 勉強会(2016/2/20) ZynqMP PL から PS へのアクセス 2016 2 20 @ikwzm

Zynq mp勉強会資料

  • Upload
    -

  • View
    1.036

  • Download
    0

Embed Size (px)

Citation preview

1 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP でPL から PS へのアクセス

2016 年 2 月 20 日@ikwzm

2 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP PS-PL Interface

S_AXI_ACP_FPDS_AXI_ACE_FPDS_AXI_HPC0_FPDS_AXI_HPC1_FPDS_AXI_HP0_FPDS_AXI_HP1_FPDS_AXI_HP2_FPDS_AXI_HP3_FPDM_AXI_HPM0_FPDM_AXI_HPM1_FPD

S_AXI_LPDM_AXI_HPM0_LPD

PLInterface Name Addr

WidthDataWidth

40

49

40

3249

32or64or

128

MMU

No

Yes

CacheCoherence

I/O

No

Full

I/O

YesNo

I/ONo

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

3 @ikwzmZynqMP 勉強会(2016/2/20)

Cache Coherency のはなし

4 @ikwzmZynqMP 勉強会(2016/2/20)

Cache Coherency でトラブルが発生するケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

5 @ikwzmZynqMP 勉強会(2016/2/20)

Cache Coherency でトラブルが発生するケース1

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xABED

0x0080 0xDEAD

この時まだ Mem にはライトされてない

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

1. CPU が Addr=0x0080 にData=0xABED をライト

6 @ikwzmZynqMP 勉強会(2016/2/20)

Cache Coherency でトラブルが発生するケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

4. 未だ Mem の Addr=0x0080 にはData=0xABED は書き込まれていないので、 Accelerator はData=0xDEAD を読んでしまう

0x0080 0xABED

0x0080 0xDEAD

3. Accelerator が Addr=0x0080 をリード

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

7 @ikwzmZynqMP 勉強会(2016/2/20)

Cache Coherency でトラブルが発生するケース 2

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xABED

0x0080 0xABED

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

2. Cache に無いので Mem にリード

1. CPU が Addr=0x0080 をリード

8 @ikwzmZynqMP 勉強会(2016/2/20)

Cache Coherency でトラブルが発生するケース 2

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 をリード

0x0080 0xABED

0x0080 0xDEAD

4. Accelerator が Addr=0x0080 にData=0xDEAD をライト

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

2. Cache に無いので Mem にリード

9 @ikwzmZynqMP 勉強会(2016/2/20)

Cache Coherency でトラブルが発生するケース 2

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 をリード

4. Accelerator が 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=0x0080Data=0xABED をキャッシュ

10 @ikwzmZynqMP 勉強会(2016/2/20)

Cache Coherency トラブルの解決方法

・キャッシュを使わない・ソフトウェアによる解決方法

ソフトウェアで Cache Flush/Invalidiate する

・ハードウェアによる解決方法Cache Coherency に対応した Cache と Interconnect

11 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御してトラブル回避 ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xDEAD

1. CPU が Addr=0x0080 にData=0xABED をライト

12 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御してトラブル回避 ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

0x0080 0xABED

0x0080 0xDEAD

13 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御してトラブル回避 ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

0x0080 0xABED

0x0080 0xABED

3. Data Cache の Addr=0x0080を強制的に Flush

14 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御してトラブル回避 ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

4. Accelerator が Addr=0x0080をリード

0x0080 0xDEAD

3. Data Cache の Addr=0x0080を強制的に Flush

Accelerator は正しい値(0xABED)が読める

15 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御してトラブル回避 ケース2

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xABED

0x0080 0xABED

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

2. Cache に無いので Mem にリード

1. CPU が Addr=0x0080 をリード

16 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御してトラブル回避 ケース2

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 をリード

0x0080 0xABED

0x0080 0xDEAD

2. Cache に無いので Mem にリード

4. Accelerator が Addr=0x0080に Data=0xDEAD をライト

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

17 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御してトラブル回避 ケース2

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 をリード

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

4. Accelerator が Addr=0x0080 にData=0xDEAD をライト

0x0080 0xABED

0x0080 0xDEAD

2. Cache に無いので Mem にリード

5. Data Cache の Addr=0x0080を Invalidiate(無効化)

18 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御してトラブル回避 ケース2

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 をリード

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

4. Accelerator が 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 @ikwzmZynqMP 勉強会(2016/2/20)

ソフトウェアで Cache を制御する方法の問題点

・ 面倒くせ~よ

・ 相手がリード/ライトするタイミングが判ってないと無理・ CPU が DMA や Accelerator を制御する場合は可能だけど、

マルチプロセッサ間では難しい

・ 時間がかかる・ キャッシュの操作は意外と時間がかかる

・ しかもクリティカルセクション(他の処理ができない)

20 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency - 用意するもの

CPU

addr data

CPU

addr data

Mem Accelerator

Cache Coherency に対応したInterface Protocol

Cache Coherency に対応したInterConnect

Cache Coherency に対応した Cache

21 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

0x0080 0xABED

0x0080 0xDEAD

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

22 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

3. Accelerator が Addr=0x0080をリード

0x0080 0xABED

0x0080 0xDEAD

23 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

3. Accelerator が Addr=0x0080をリード

0x0080 0xABED

0x0080 0xDEAD

4.InterConnect 内でキャッシュを持つマスターに Addr を通知(snoop)

24 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

3. Accelerator が Addr=0x0080をリード

0x0080 0xABED

0x0080 0xDEAD

4.InterConnect 内でキャッシュを持つマスターに Addr を通知(snoop)

5.該当する Addr(0x0080)のデータをキャッシュしているマスターがいる場合はマスターがデータを出力

25 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース1

CPU

addr data

CPU

addr data

Mem Accelerator

1. CPU が Addr=0x0080 にData=0xABED をライト

2. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

3. Accelerator が Addr=0x00C0をリード

0x0080 0xABED

0x00C0 0xDEAD

4.InterConnect 内でキャッシュを持つマスターに Addr を通知(snoop)

5.該当する Addr(0x00C0)のデータをキャッシュしているマスターがいない場合は Mem から読む

26 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース 2

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xABED

0x0080 0xABED

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

2. Cache に無いので Mem にリード

1. CPU が Addr=0x0080 をリード

27 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース 2

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xABED

0x0080 0xABED

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

1. CPU が Addr=0x0080 をリード

2. Cache に無いので Mem にリード

4. Accelerator が Addr=0x0080に Data=0xDEAD をライト

28 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース 2

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xABED

0x0080 0xABED

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

1. CPU が Addr=0x0080 をリード

2. Cache に無いので Mem にリード

4. Accelerator が Addr=0x0080に Data=0xDEAD をライト

5.InterConnect 内でキャッシュを持つマスターに Addr を通知(snoop)

29 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース 2(キャッシュラインサイズの書き込みの場合)

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xABED

0x0080 0xDEAD

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

1. CPU が Addr=0x0080 をリード

2. Cache に無いので Mem にリード

4. Accelerator が Addr=0x0080 にData=0xDEAD をライト

5.InterConnect 内でキャッシュを持つマスターに Addr を通知(snoop)

6.該当する Addr(0x0080)のデータをキャッシュしているマスターはキャッシュを無効化(Invalidiate)

7. Mem の Addr=0x0080 にData=0xDEAD をライト

30 @ikwzmZynqMP 勉強会(2016/2/20)

ハードウェアで Cache Coherency ケース 2 (キャッシュラインサイズの書き込みの場合)

CPU

addr data

CPU

addr data

Mem Accelerator

0x0080 0xDEAD

0x0080 0xDEAD

3. Data Cache に Addr=0x0080Data=0xABED をキャッシュ

1. CPU が Addr=0x0080 をリード

2. Cache に無いので Mem にリード

4. Accelerator が 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 にリード

31 @ikwzmZynqMP 勉強会(2016/2/20)

補足 キャッシュラインのアライメント問題

CPU

addr data

Accelerator

キャッシュするデータの単位(通称キャッシュラインサイズ)は 64 バイト

Addr Tag34bit 8byte 8byte 8byte 8byte 8byte 8byte 8byte 8byte

16byte(128bit) 16byte(128bit) 16byte(128bit) 16byte(128bit)Cache Line Size = 64byte

32 @ikwzmZynqMP 勉強会(2016/2/20)

補足 キャッシュラインのアライメント問題

CPU

addr data

Accelerator

1.CPU が Addr=0x00A0 から 32 バイトのデータをキャッシュにライト

Addr Tag34bit 8byte 8byte 8byte 8byte 8byte 8byte 8byte 8byte

16byte(128bit) 16byte(128bit) 16byte(128bit) 16byte(128bit)Cache Line Size = 64byte

0x0080

2. ハッチング部がまだメモリに書き込まれていない(dirty)

33 @ikwzmZynqMP 勉強会(2016/2/20)

補足 キャッシュラインのアライメント問題

CPU

addr data

Accelerator

1.CPU が Addr=0x00A0 から 32 バイトのデータをキャッシュにライト

Addr Tag34bit 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 からのデータをメモリにライト

34 @ikwzmZynqMP 勉強会(2016/2/20)

補足 キャッシュラインのアライメント問題

CPU

addr data

Accelerator

1.CPU が Addr=0x00A0 から 32 バイトのデータをキャッシュにライト

Addr Tag34bit 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 バイトのデータをライト

35 @ikwzmZynqMP 勉強会(2016/2/20)

補足 キャッシュラインのアライメント問題

CPU

addr data

Accelerator

1.CPU が Addr=0x00A0 から 32 バイトのデータをキャッシュにライト

Addr Tag34bit 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 @ikwzmZynqMP 勉強会(2016/2/20)

補足 キャッシュラインのアライメント問題

CPU

addr data

Accelerator

Addr Tag34bit 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 からのデータをマージ

37 @ikwzmZynqMP 勉強会(2016/2/20)

ACP(Accelerator Coherency Port)の制約

S_AXI_ACP_FPD

ACP LimitationsThe 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 CoherencyThe PL masters can also snoop APU caches through the APU’ saccelerator coherency port (ACP). The ACP accesses can be used to(read or write) allocate into L2 cache. However, the ACP only supportsaligned 64-byte and 16-byte accesses. All other accesses get a SLVERRresponse.

 『 Zynq UltraScale+ MPSoC TRM UG1085 (v1.0) November 24,2015』 228

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

38 @ikwzmZynqMP 勉強会(2016/2/20)

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

ZynqMP の Cache Coherency Architecture

Cache Coherency に対応したInterface ProtocolACE(AXI Coherency Extension)

Cache Coherency に対応したInterConnectCCI(Cache Coherency Interconnect)

Cache Coherency に対応した Cache

Cache Coherency に対応したInterConnectSCU(Snoop Control Unit)

39 @ikwzmZynqMP 勉強会(2016/2/20)

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

ZynqMP の Cache Coherency Interconnect I/F

Full Coherency (ACE Slave Port)Cache を持っているマスターとの I/FCache Snoop Channel 有りAPU から1本PL の S_AXI_ACE_FPD から 1 本

I/O Coherency (ACE-Lite Slave Port)Cache を持っていないマスターとの I/FCache Snoop Channel 無しGPU/PCIe/SATA から 1 本PL の S_AXI_HPC[01]_FPD から 1 本LPD のスイッチから1本

ACE-Lite Master PortMemory Subsystem へ 2 本その他の各種 I/O(FPGA 含む)へ 1 本

40 @ikwzmZynqMP 勉強会(2016/2/20)

Memory Management Unit のはなし

41 @ikwzmZynqMP 勉強会(2016/2/20)

Memory Management Unit の働き

・ 仮想アドレスから物理アドレスへの変換・仮想記憶 - 個々のプロセスからは単一のメモリマップ

・物理メモリの有効利用

・物理アドレス空間と仮想アドレス空間の分離

・ メモリ保護

・ キャッシュ制御

42 @ikwzmZynqMP 勉強会(2016/2/20)

仮想アドレスから物理アドレスへの変換(Aarch32-LPAE の例)

Main Memory(物理アドレス)12 11 02021293031

PTE TablePhys Addr

Phys Addr

PMD TableTable Ptr

Table Ptr

PGD TableTable Ptr

Table Ptr

TTBRx

プロセス(仮想アドレス)

64 bit/entry64 bit/entry

64 bit/entry512

entry512

entry

4Kbyte/pageLPAE : Large Physical Address ExtensionPTE : Page Table EntryPMD : Page Middle DirectoryPGD : Page Global Directory

43 @ikwzmZynqMP 勉強会(2016/2/20)

仮想アドレスから物理アドレスへの変換(Aarch32-LPAE の例)

Main Memory(物理アドレス)12 11 02021293031

PTE TablePhys Addr

Phys Addr

PMD TableTable Ptr

Table Ptr

PGD TableTable Ptr

Table Ptr

TTBRx

プロセス(仮想アドレス)

64 bit/entry64 bit/entry

64 bit/entry512

entry512

entry

4Kbyte/page

仮想アドレスから物理アドレスに変換するのに最大3回テーブルを読む必要がある

44 @ikwzmZynqMP 勉強会(2016/2/20)

仮想アドレスから物理アドレスへの変換(Aarch32-LPAE の例)

Main Memory(物理アドレス)12 11 02021293031

PTE TablePhys Addr

Phys Addr

PMD TableTable Ptr

Table Ptr

PGD TableTable Ptr

Table Ptr

TTBRx

プロセス(仮想アドレス)

64 bit/entry64 bit/entry

64 bit/entry512

entry512

entry

4Kbyte/page

アドレス変換用キャッシュ TLB (Transalation-Lookaside Buffer)

仮想アドレスから物理アドレスに変換するのに最大3回テーブルを読む必要がある

45 @ikwzmZynqMP 勉強会(2016/2/20)

仮想記憶 - 個々のプロセスからは単一のメモリマップ

プロセス 1(仮想アドレス)

Main Memory(物理アドレス)MMU

0x0000_0000 0x08_0000_0000

0x0000_0000

0x0000_1000

0x0000_2000

0x0000_3000

0x0000_2000

0x0000_3000

0x0000_4000

0x0000_1000

0x08_0000_1000

0x08_0000_2000

0x08_0000_3000

0x08_0000_4000

0x08_0000_5000

0x08_0000_6000

0x08_0000_7000

0x08_0000_8000

プロセス 2(仮想アドレス)

46 @ikwzmZynqMP 勉強会(2016/2/20)

Accelerator から見た場合の問題

プロセス 1(仮想アドレス)

Main Memory(物理アドレス)MMU

0x0000_0000

0x0000_1000

0x0000_2000

0x0000_3000

0x0000_4000

buf[0x0000]

buf[0x1000]

buf[0x2000]

buf[0x3000]

buf[0x0000]

buf[0x1000]

buf[0x2000]

buf[0x3000] 仮想アドレス上は連続でも物理アドレス上はバラバラに配置されている

47 @ikwzmZynqMP 勉強会(2016/2/20)

Accelerator からバラバラに配置されたバッファへのアクセス方法

・ ハードウェアのアシスト無し

- 物理メモリ上に連続領域(DMA バッファ)を確保

・バッファから/へ DMA バッファへ/からデータをコピー

・DMA バッファをユーザープロセスからアクセス

・ ハードウェアのアシスト有り

・Scatter-Gather DMA

・IOMMU

48 @ikwzmZynqMP 勉強会(2016/2/20)

バッファから/へ DMA バッファへ/からデータをコピー

プロセス 1(仮想アドレス)

Main Memory(物理アドレス)MMU

0x0000_0000

0x0000_1000

0x0000_2000

0x0000_3000

0x0000_4000

buf[0x0000]

buf[0x1000]

buf[0x2000]

buf[0x3000]

buf[0x0000]

buf[0x1000]

buf[0x2000]

buf[0x3000]

メモリ上に連続領域(DMA バッファ)を確保

バッファから/へDMA バッファに/からデータをコピー

49 @ikwzmZynqMP 勉強会(2016/2/20)

バッファから/へ DMA バッファへ/からデータをコピー

・良い点・特殊なハードウェアを必要としない

・悪い点・データのコピーによる性能劣化

・課題・連続領域(DMA バッファ)の確保方法(後述)

・例・レガシーなデバイス(一昔前はわりとメジャーな方法)・今でも低速なデバイス(UART など)ではよく使われる

50 @ikwzmZynqMP 勉強会(2016/2/20)

DMA バッファをユーザープロセスからアクセス

プロセス 1(仮想アドレス)

Main Memory(物理アドレス)MMU

0x0000_0000

0x0000_1000

0x0000_2000

0x0000_3000

0x0000_4000

buf[0x0000]

buf[0x1000]

buf[0x2000]

buf[0x3000]

メモリ上に連続領域(DMA バッファ)を確保

DMA バッファをユーザープロセスの仮想空間にマッピング

51 @ikwzmZynqMP 勉強会(2016/2/20)

DMA バッファをユーザープロセスからアクセス

・良い点・特殊なハードウェアを必要としない

・悪い点・ユーザープログラム側に対処が必要

・課題・連続領域(DMA バッファ)の確保方法(後述)

・例・UIO(User space I/O)・udmabuf

52 @ikwzmZynqMP 勉強会(2016/2/20)

連続領域(DMA バッファ)の確保方法 - Linux の場合

・Linux の管理外領域に連続領域を確保・メモリ管理をユーザープログラムが行う必要がある・領域は Linux 起動時に確保・キャッシュ対象外(キャッシュが効かない)

・CMA(Contiguous Memory Allocator)を使う・メモリ管理は Linux のカーネルが行う・CMA 領域の最大値は Linux 起動時に指定・"ある程度"動的にバッファを確保できる(フラグメンテーション問題)

・キャッシュの対象

53 @ikwzmZynqMP 勉強会(2016/2/20)

Scatter-Gather DMA

・専用 DMA がバラバラに配置された物理領域を順番にアクセスする・例

・USB ホストコントローラー(xHCI)・ネットワークコントローラー・SerialATA ホストコントローラー(AHCI)・メジャーかつ高スループットが必要なデバイスは大抵この方法

54 @ikwzmZynqMP 勉強会(2016/2/20)

Scatter-Gather DMA

・良い点・デバイスに特化した DMA による性能向上(高スループット)・バッファ間のデータコピーの削減

・悪い点・専用の DMA コントローラハードウェアが必要・専用のデバイスドライバ(の開発とメンテナンス)が必要・ランダムアクセスに難がある(たいていはシーケンシャルアクセス)

55 @ikwzmZynqMP 勉強会(2016/2/20)

IOMMU

プロセス 1(仮想アドレス)

Main Memory(物理アドレス)MMU

0x0000_0000

0x0000_1000

0x0000_2000

0x0000_3000

0x0000_4000

buf[0x0000]

buf[0x1000]

buf[0x2000]

buf[0x3000]

buf[0x0000]

buf[0x1000]

buf[0x2000]

buf[0x3000]

Accelerator からみたアドレス空間

IOMMU

56 @ikwzmZynqMP 勉強会(2016/2/20)

IOMMU

・良い点・DMA の開発が楽(面倒は MMU にお任せ)・ドライバの開発が楽(MMU の管理は OS にお任せ)・バッファ間のデータコピーの削減・ランダムアクセスに強い

・悪い点・IOMMU が必要・仮想アドレスから物理アドレスに変換する際のオーバーヘッド・いまいち流行ってない(知見が少ない、 これからに期待)

57 @ikwzmZynqMP 勉強会(2016/2/20)

I/O

ZynqMP の IOMMU

S_AXI_ACP_FPDS_AXI_ACE_FPDS_AXI_HPC0_FPDS_AXI_HPC1_FPDS_AXI_HP0_FPDS_AXI_HP1_FPDS_AXI_HP2_FPDS_AXI_HP3_FPDM_AXI_HPM0_FPDM_AXI_HPM1_FPD

S_AXI_LPDM_AXI_HPM0_LPD

PLInterface Name Addr

WidthDataWidth

40

49

40

3249

32or64or

128

IOMMU

No

Yes

YesNo

CacheCoherence

No

Full

I/O

I/ONo

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

58 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP の S_AXI_LPD の注意点

S_AXI_LPD

LPD-PL InterfaceThis port can be used in physical or virtual mode by setting the AxUSERbit. In virtual mode, it cannot directly access the LPD. Instead, virtualmode accesses are routed as follows.

PL → LPD → FPD (SMMU/CCI) → LPD

The S_AXI_PL_LPD is a PL interface that connects into the low-powerdomain. For situations where the FP domain is powered down, thisinterface provides a high-performance mastering capability from thePL. Due to the interconnect topology, this port has a relatively longlatency to DDR.

『 Zynq UltraScale+ MPSoC TRM UG1085 (v1.0) November 24,2015』 822

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

59 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP の IOMMU(ちょっと詳細に)

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

TBU2

PS

TBU1

TBU0TBU

TBUTBU

TCU

SMMU(System Memory Management Unit)各 I/F 毎に MMU があるのではない全体で IOMMU は一つ次の2つのコンポーネントで構成・TBU(Traslation Buffer Unit)

・ アドレス変換用キャッシュ TLB(Translation Lookaside Buffer)

・ TLB にヒットした時のみアドレス変換を行う

・ TLB ミスの時は TCU にテーブルウォークを依頼する

・ 各 I/F の近くに分散配置

・TCU(Translation Control Unit)・ テーブルウォークを行い、 各 TBU に変換結果を通知

60 @ikwzmZynqMP 勉強会(2016/2/20)

IOMMU のアドレス変換のオーバヘッドはどのくらいだろう?

・オーバーヘッドの"平均"サイクル数 TLB ヒット率×1+(1-TLB ヒット率)×TLB ミス時の Table Walk サイクル数

・TLB のヒット率は?・Accelerator のアクセスパターン

・シーケンシャル/ランダム・アドレスの先出しする/しない・1 トランザクションの転送量

・TLB の構成(ZynqMP では 512entry 4-way)・TLB の追い出しアルゴリズム(LRU? Random?)・Table Walk 時に充填する TLB のエントリ数は?

・TLB ミス時の Table Walk の性能はどのくらい?

61 @ikwzmZynqMP 勉強会(2016/2/20)

・オーバーヘッドの"平均"サイクル数 TLB ヒット率×1+(1-TLB ヒット率)×TLB ミス時の Table Walk サイクル数

・TLB のヒット率は?・Accelerator のアクセスパターン

・シーケンシャル/ランダム・アドレスの先出しする/しない・1 トランザクションの転送量

・TLB の構成(ZynqMP では 512entry 4-way)・TLB の追い出しアルゴリズム(LRU? Random?)・Table Walk 時に充填する TLB のエントリ数は?

・TLB ミス時の Table Walk の性能はどのくらい?

IOMMU のアドレス変換のオーバヘッドはどのくらいだろう?

やってみないとわからん

62 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP の Global System Address Map

DDR SDRAMLPD-PL interfaceFPD-PL(HPM0) interfaceFPD-PL(HPM1) interfaceQuad-SPIPCIe LowReservedCoresight System TraceRPU Low Latency PortReservedFPS Slave

Lower LPS SlaveCSU, PMU, TCM, OCMReserved

DDR SDRAM

2GB512MB256MB256MB512MB256MB128MB16MB1MB63MB16MB

Upper LPS Slave 16MB12MB4MB12GB

FPD-PL(HPM0) interface 4GBFPD-PL(HPM1) interface 4GBPCIe High 8GB

32GB

DDR SDRAM

FPD-PL(HPM0) interface 224GBFPD-PL(HPM1) interface 224GBPCIe High 256GB

256GB

Range Name Size Start Address End Address0x00_0000_00000x00_8000_00000x00_A000_00000x00_B000_00000x00_C000_00000x00_E000_00000x00_F000_00000x00_F800_00000x00_F900_00000x00_F910_00000x00_FD00_00000x00_FE00_00000x00_FF00_00000x00_FFC0_00000x01_0000_00000x04_0000_00000x05_0000_00000x06_0000_00000x08_0000_00000x10_0000_00000x48_0000_00000x80_0000_00000xC0_0000_0000

0x00_7FFF_FFFF0x00_9FFF_FFFF0x00_AFFF_FFFF0x00_BFFF_FFFF0x00_DFFF_FFFF0x00_EFFF_FFFF0x00_F7FF_FFFF0x00_F8FF_FFFF0x00_F90F_FFFF0x00_FCFF_FFFF0x00_FDFF_FFFF0x00_FEFF_FFFF0x00_FFBF_FFFF0x00_FFFF_FFFF0x03_FFFF_FFFF0x04_FFFF_FFFF0x05_FFFF_FFFF0x07_FFFF_FFFF0x0F_FFFF_FFFF0x47_FFFF_FFFF0x7F_FFFF_FFFF0xBF_FFFF_FFFF0xFF_FFFF_FFFF

32bitaddr36bitaddr40bitaddr

63 @ikwzmZynqMP 勉強会(2016/2/20)

32bit アドレスの注意事項

・MMU を使わないとアクセス可能なメインメモリは最大 2GB・APU が Aarch32(ARM 32bit mode)の場合・RPU(Cortex-R5)の場合・PL 側のマスターのアドレスが 32bit しかない場合

64 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP PS-PL Interface

S_AXI_ACP_FPDS_AXI_ACE_FPDS_AXI_HPC0_FPDS_AXI_HPC1_FPDS_AXI_HP0_FPDS_AXI_HP1_FPDS_AXI_HP2_FPDS_AXI_HP3_FPDM_AXI_HPM0_FPDM_AXI_HPM1_FPD

S_AXI_LPDM_AXI_HPM0_LPD

PLInterface Name Addr

WidthDataWidth

40

49

40

3249

32or64or

128

MMU

No

Yes

CacheCoherence

I/O

No

Full

I/O

YesNo

I/ONo

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

65 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP の S_AXI_ACP_FPDS_AXI_ACP_FPD・利点(Benefit)

・ Lowest latency to L2 cache.

・ Cache coherency.

・ Ability to allocate into L2 cache.

・検討事項(Considerations)・ Only 64B and 16B transactions supported

- requires specially designed PL-DMA.

・ Shares CPU interconnect bandwidth.

・ More complex PL master design.

・推奨使用方法(Suggested Uses)・ PL logic tightly coupled with APU.

・ Medium granularity CPU offload.

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

66 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP の S_AXI_ACE_FPDS_AXI_ACE_FPD・利点(Benefit)

・ Optional cache coherency.

・ APU can snoop into PL cached masters (two-way coherency).

・検討事項(Considerations)・ Limited burst length (64B) support when snooping into cached master

in PL (PS to PL).

・ When used as ACELITE, larger burst length from PL to PS can cause the

CPU to hang (direct AXI4 path between CCI and PS-DDR, which impacts

other applications waiting to access DDR).

・ Complex PL design that require support for ACE.

・推奨使用方法(Suggested Uses)・ Cached accelerators in PL.

・ System cache in PL using block RAM.

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

67 @ikwzmZynqMP 勉強会(2016/2/20)

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

ZynqMP の S_AXI_HPC[01]_FPDS_AXI_HPC[01]_FPD・利点(Benefit)

・ High throughput (Best Effort).

・ Multiple interfaces.

・ AXI FIFO interface with QoS-400 traffic shaping.

・ Hardware assisted coherency;

no cache flush/invalidate in software driver.

・ Virtualization support with SMMU in path.

・検討事項(Considerations)・ More complex PL master design.

・ PL design to drive AxCACHE as needed for coherency.

・推奨使用方法(Suggested Uses)・ High performance DMA for large datasets.

68 @ikwzmZynqMP 勉強会(2016/2/20)

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U

ZynqMP の S_AXI_HP[0123]_FPDS_AXI_HP[0123]_FPD・利点(Benefit)

・ High throughput (Best Effort).

・ Multiple interfaces.

・ AXI FIFO interface with QoS-400 traffic shaping.

・ Virtualization support with SMMU in path.

・検討事項(Considerations)・ Software driver to handle cache flush/invalidate.

・ More complex PL master design.

・推奨使用方法(Suggested Uses)・ High performance DMA for large datasets.

69 @ikwzmZynqMP 勉強会(2016/2/20)

ZynqMP の S_AXI_LPDS_AXI_LPD・利点(Benefit)

・ Fastest, low latency path to the OCM and TCM.

・ Optional coherency.

・ SMMU in datapath provides option for virtualization.

・ PL access to LPD when FPD is powered off.

・ High throughput.

・推奨使用方法(Suggested Uses)・ Safety applications.

CacheCoherentInterconnect

Mem

orySubsystem

RPUI/O

GPU

PCIe

SATA

1MB L2 Cache ACE I/F ACP I/F

Snoop Control Unit

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

Cortex-A5332KB I/D

MMU

PS

MM

U

MM

U