Intro to Parallel Programming CUDA-第二单元
一、parallel communication patterns ? 并行通信模式
Map:映射,在特定的位置讀取和寫入。
Gather:收集,從多個不同的位置讀入,寫入一個位置。
Scatter:分發,寫入多個位置。
Transpose轉置
結構數組縮寫為AOS,數組結構縮寫為SOA
轉置運算是指任務重新排序內存中的數據元素
Stencil模板
能夠在輸出結果為每一個元素生成一個結果
二、流處理器Stream Multiprocessors
所有在同一個線程塊中的線程運行在同一個SM上
在一個內核中的所有塊,在下個內核中任意塊啟動前都已完成
三、共享內存
共享內存是在一個塊的線程之間共享
CUDA中的線程協作主要是通過共享內存實現的。使用關鍵字“__share__”聲明共享變量,將使這個變量駐留在共享內存中,該變量具有以下特征:
- 位于線程塊的共享存儲器空間中
- 與線程塊具有相同的生命周期
- 僅可通過塊內的所有線程訪問
對于GPU上啟動的每個線程塊,CUDA C編譯器都將創建該變量的一個副本。 線程塊中的每個線程都共享這塊內存,但線程卻無法看到也不能修改其他線程塊的變量副本。 這就使得一個線程塊中的多個線程能夠在計算上進行通信和協作。而且,共享內存緩沖區駐留在物理GPU上,在訪問共享內存時的延遲要遠遠低于訪問普通緩沖區的延遲,使得共享內存的訪問非常高效。
線程同步機制“__syncthreads()”
關鍵字“__share__”只是聲明了共享變量,位于同一個線程塊中的不同線程都可以訪問該變量,如果沒有同步機制,將會發生競態條件 (Race Condition),導致錯誤的運行結果。
CUDA確保同步的方法是調用“__syncthreads()”。__syncthreads()將確保線程塊中的每個線程都執行完 __syncthreads()前面的語句后,才會執行下一條語句。
一個線程可以訪問局部內存、一個線程塊的共享內存和所有線程都可以訪問的全局內存
速度方面:local>shared>global>cpu
四、屏障
__syncthreads()的線程需要其他可以到達該點的線程,而不是等待塊內所有其他線程
一個高端的GPU每秒可以進行超過3萬億次的數學計算
五、Global Memory
如果想操作全局變量必須傳遞一個指向該內存的指針,如:
訣竅:只可以在內核中傳遞局部變量,然后傳入一個指針,要在內核外分配和初始化全局變量
總結
以上是生活随笔為你收集整理的Intro to Parallel Programming CUDA-第二单元的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intro to Parallel Pr
- 下一篇: moc文件生成方法