Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
myread
Search
a1933b51019
February 21, 2024
41
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
myread
a1933b51019
February 21, 2024
More Decks by a1933b51019
See All by a1933b51019
test
chungvlong
0
120
Featured
See All Featured
My Coaching Mixtape
mlcsv
0
360
How to build a perfect <img>
jonoalderson
1
6.1k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
Visualization
eitanlees
153
17k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
Making the Leap to Tech Lead
cromwellryan
135
10k
How GitHub (no longer) Works
holman
316
150k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
Ethics towards AI in product and experience design
skipperchong
2
430
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Transcript
My File read
Virt user buffer physical user buffer Virt data block physical
user buffer Page table Share buffer dpu cpu 共享 Task array (host 端)
Virt_buf Virt_data_block Virt_buf 為傳入的參數, 在此read operation中user buffer 的目的地vaddr Virt_data_block 為要讀data的起始virt
addr
Virt_buf Virt_data_block 使用get user page觸發page fault,使virt user buffer產生對應的physical user buffer
page
Virt_buf Virt_data_block Host cpu(filesystem) Virt_bufphys_buf Pgd 查表取得virt_buf對應的phys address phys_buf
Virt_buf Virt_data_block Host cpu(filesystem) Virt_buf phys_buf Pgd 查表取得virt_buf對應的phys address phys_buf
phys_buf
Virt_buf Virt_data_block Host cpu(filesystem) 通過-offset的方式找到Virt_data_block 的phys address phys_data_block phys_buf phys_data_block=Virt_data_block-
offset phys_data_block
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_block Dst: phys_buf
Size: 2K Type:read 針對點的地方(2K size)的data copy,產生對應read task 產生read task ,先暫存起來
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_block Dst: phys_buf
Size: 2K Type:read 產生read task,先暫存起來
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block 透過file inode 和index(1)和write entry
尋找index 1 的block的virtual address Virt_data_block A Virt_data_block A Src: phys_data_block Dst: phys_buf Size: 2K Type:read
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block phys_data_blockA=Virt_data_blockA- offset Virt_data_block A
Src: phys_data_block Dst: phys_buf Size: 2K Type:read phys_data_blockA 通過-offset的方式找到Virt_data_blockA 的phys address phys_data_blockA
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read 產生read task,先暫存起來 Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA 針對點的地方(2K size)的data copy,產生對應read task
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read 產生read task,先暫存起來 Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K Virt_buf+4K phys_bufA Pgd 查表取得virt_buf+4K對應的phys address phys_bufA
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K Virt_buf+4K phys_bufA Pgd phys_bufA 查表取得virt_buf+4K對應的phys address phys_bufA
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read 產生read task,先暫存起來 針對點的地方(2K size)的data copy,產生對應read task
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read 產生read task,先暫存起來
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read 透過file inode 和index(2)和write entry 尋找index 2 的block的virtual address Virt_data_block B
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read 透過file inode 和index(2)和write entry 尋找index 2 的block的virtual address Virt_data_block B Virt_data_block B
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB=Virt_data_blockB- offset 通過-offset的方式找到Virt_data_blockB 的phys address phys_data_blockB phys_data_blockB
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read 產生read task,先暫存起來 針對點的地方(2K size)的data copy,產生對應read task
Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K
Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read 產生read task,先暫存起來
Pim driver(cpu) Src: phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read Src:
phys_data_block Dst: phys_buf Size: 2K Type:read Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read 將存在filesystem(host端)的task填入 dpu與cpu的shared buffer 此處應該還會判斷shared buffer是否滿,那些欄位在使用,但先暫時省略
Virt_buf Virt_data_block DPU phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K Size:
2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 1的參數執行copy
Virt_buf Virt_data_block DPU phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K Size:
2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 1的參數執行copy clflush(phys_buf, 2K); memcpy_v(phys_buf, phys_data_block, 2K);
Virt_buf Virt_data_block DPU phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K Size:
2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 1的參數執行copy clflush(phys_buf, 2K); memcpy_v(phys_buf, phys_data_block, 2K); DPU
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 2的參數執行copy Src: phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 2的參數執行copy clflush(phys_buf+2K, 2K); memcpy_v(phys_buf+2K, phys_data_blockS, 2K); Src: phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 2的參數執行copy clflush(phys_buf+2K, 2K); memcpy_v(phys_buf+2K, phys_data_blockS, 2K); Src: phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read DPU
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 3的參數執行copy
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 3的參數執行copy clflush(phys_buf+2K, 2K); memcpy_v(phys_buf+2K, phys_data_blockA, 2K); Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 3的參數執行copy clflush(phys_bufA, 2K); memcpy_v(phys_bufA, phys_data_blockA, 2K); Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read DPU
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 4的參數執行copy
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Virt_data_block B phys_data_blockB Dpu根據task 4的參數執行copy clflush(phys_bufA+2K, 2K); memcpy_v(phys_bufA+2K, phys_data_blockB, 2K); Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read
Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA
Virt_data_block B phys_data_blockB Dpu根據task 4的參數執行copy clflush(phys_bufA+2K, 2K); memcpy_v(phys_bufA+2K, phys_data_blockB, 2K); Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read DPU
Pim driver(cpu) Check shared buffer 中task 4的狀態,發現dpu處理完成 (busy waiting的方式) Src:
phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read Done:ok Src: phys_data_block Dst: phys_buf Size: 2K Type:read Done:ok Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Done:ok Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Done:ok
Filesystem(cpu) • Pim driver回傳 ok,此次write operation的tasks dpu皆做完 • 此次write operation可以準備結束