異質計算叢集程式設計 練習題 (Practice - MPI Cluster Background, Stencil Example, and MPI Basics)


Question 1 - MPI 記憶體模型與 SPMD [recall]

情境/題目:MPI 假設哪一種記憶體模型?process 之間如何交換資料?「所有 process 跑同一支程式卻能扮演不同角色」是什麼程式模型,對應 CUDA 的什麼?

Question 2 - 五大設定 API 與角色分工 [recall]

情境/題目:列出建立/拆除 MPI 通訊系統的五個核心 API。在本章 stencil 範例中,np 個 process 有幾個在算 stencil?誰當 data server?

Question 3 - MPI_Send 與 MPI_Recv 參數對比 [recall]

情境/題目:MPI_SendMPI_Recv 各有幾個參數?兩者第 4 個參數有何不同?若接收端不想限定 tag 該用什麼?

Question 4 - Halo cells、Ghost cells 與 Edge/Internal [recall]

情境/題目:在 25-point stencil 的 domain partitioning 中,halo cells 與 ghost cells 有何不同?edge process 與 internal process 各需收到多少 z slice?

Question 5 - 為何要兩階段重疊計算與通訊 [recall]

情境/題目:天真做法「整個 partition 算一步 → 交換 halo → 重複」為何效率不佳?兩階段策略中 stage 1 與 stage 2 各做什麼?

Question 6 - Pinned Memory、DMA 與 cudaMemcpyAsync [recall]

情境/題目:為何 halo bounce buffer 要用 cudaHostAlloc 而非 malloc?這與 DMA 和 cudaMemcpyAsync 有何關聯?釋放時要用哪個 API?

Question 7 - CUDA Streams 的並行語意 [recall]

情境/題目:CUDA stream 的執行順序規則是什麼?為何 boundary kernel 放 stream0、internal kernel 放 stream1?cudaStreamSynchronizecudaDeviceSynchronize 有何差別?

Question 8 - MPI_Sendrecv 與 MPI_PROC_NULL [recall]

情境/題目:halo 交換為何用 MPI_Sendrecv 而非分開的 MPI_Send / MPI_Recv?edge process 沒有某側鄰居時如何免去 if-then-else 特判?

Question 9 - Collective Communication 與 CUDA-aware MPI [recall]

情境/題目:列出常用的 collective communication 原語。MPI_Barrier 在 stencil 範例的用途為何?CUDA-aware MPI 移除了 halo 交換中的哪些步驟,哪些實作支援它?

Question 10 - Exercise 1:叢集 stencil 規模計算 [application]

情境/題目:64×64×2048 的 grid,17 個 MPI rank(16 個 compute + 1 個 data server)。求:(a) 每個 compute process 算幾個輸出點?(b) internal 與 edge process 各需多少 halo 點?(c) stage 1 各算多少 boundary 點?(d) stage 2 各算多少 internal 點?(e) stage 2 各送出多少 bytes?

Question 11 - Exercise 2 & 3:元素大小與 blocking 語意 [application]

情境/題目:(a) MPI_Send(ptr_a, 1000, MPI_FLOAT, 2000, 4, MPI_COMM_WORLD) 共傳 4000 bytes,每個資料元素幾 bytes?(b) 下列何者為真:MPI_Send 預設 blocking / MPI_Recv 預設 blocking / MPI 訊息至少 128 bytes / MPI process 可透過 shared memory 存同一變數?

Question 12 - Data Server 的 send_address 位移邏輯 [application]

情境/題目:data server 沿 z 切成 4 個 partition(P0…P3,每片 S 個 z slice)。送完 P0 後 send_address 該前進多少?internal 迴圈中每次又前進多少?為何兩者不同?

Question 13 - 天真 vs 重疊策略的效能分析 [analysis]

情境/題目:比較「整片算完再換 halo」的天真策略與「stage1/stage2 重疊」策略在硬體利用率上的差異。重疊策略在什麼條件下能把通訊延遲完全藏住?若內部 slice 太少會怎樣?

Question 14 - 傳統 staging MPI vs CUDA-aware MPI 的取捨 [analysis]

情境/題目:傳統(非 CUDA-aware)MPI 在每次 halo 交換要做哪些 staging copy?CUDA-aware MPI 省下什麼?換用 CUDA-aware 後是否還需要 CUDA streams 與兩段式 kernel?為什麼?

Question 15 - Pageable vs Pinned 記憶體複製路徑分析 [analysis]

情境/題目:為何用一般 malloc(pageable)記憶體的 cudaMemcpy 會被強制成同步且較慢?pinned memory 如何同時解決「資料損毀」與「無法非同步」兩個問題?代價是什麼?