並行程式設計 cuda memory

2021-09-08 13:19:01 字數 2210 閱讀 1993

cuda儲存器模型:

gpu片內:register,shared memory;

host 記憶體: host memory, pinned memory.

板載視訊記憶體:local memory,constant memory, texture memory, texture memory,global memory;

register: 訪問延遲極低;

基本單元:register file (32bit/each)

計算能力1.0/1.1版本號硬體:8192/sm。

計算能力1.2/1.3版本號硬體: 16384/sm;

每乙個執行緒占有的register有限。程式設計時不要為其分配過多私有變數。

shared memory:訪問速度與暫存器相似。

實現執行緒間通訊的延遲最小。

儲存公用的計數器或者block的公用結果。

硬體1.0~1.3中。16kbyte/sm,被組織為16個bank。

宣告keyword _shared_  int sdata_static[16];

host記憶體:分為pageable memory 和 pinned memory

pageable memory: 通過作業系統api(malloc()。new())分配的儲存器空間;、

pinned memory:始終存在於物理記憶體中,不會被分配到低速的虛擬記憶體中,可以通過dma加速與裝置端進行通訊。

cudahostalloc(), cudafreehost()來分配和釋放pinned memory。使用pinned memory長處:主機端-裝置端的傳輸資料頻寬高;  某些裝置上能夠通過zero-copy功能對映到裝置位址空間。從gpu直接訪問,省掉主存與視訊記憶體間進行資料拷貝的工作; pinned memory 不能夠分配過多:導致作業系統用於分頁的物理記憶體變。 導致系統總體效能下降。通常由哪個cpu執行緒分配,就僅僅有這個執行緒才有訪問許可權;

cuda2.3版本號中,pinned memory功能擴充:

portable memory:讓控制不同gpu的主機端線程操作同一塊portable memory,實現cpu執行緒間通訊;使用cudahostalloc()分配頁鎖定記憶體時。加上cudahostallocportable標誌。

write-combined memory:提高從cpu向gpu單向資料傳輸的速度;不使用cpu的l1,l2 cache對一塊pinned memory中的資料進行緩衝。將cache資源留給其它程式使用。在pci-e匯流排傳輸期間不會被來自cpu的監視打斷。在呼叫cudahostalloc()時加上cudahostallocwritecombined標誌。cpu從這樣的儲存器上讀取的速度非常低。

constant memory:僅僅讀位址空間;位於視訊記憶體,有快取加速;64kb。用於儲存須要頻繁訪問的僅僅讀引數 。僅僅讀;使用_constant_ keyword。定義在全部函式之外。兩種常數儲存器的用法:直接在定義時初始化常數儲存器。定義乙個constant陣列。然後使用函式進行賦值;

texture memory:僅僅讀。不是一塊專門的儲存器,而是牽涉到視訊記憶體、兩級紋理快取、紋理拾取單元的紋理流水線;資料常以一維、二維或者三維陣列的形式儲存在視訊記憶體中;快取加速;能夠宣告大小比常數儲存器大得多;適合實現影象樹立和查詢表。對大量資料的隨機訪問或非對齊訪問有良好的加速效果;在kernel中訪問紋理儲存器的操作成為紋理拾取(texture fetching)。紋理拾取使用的座標與資料在視訊記憶體中的位置能夠不同,通過紋理參照系約定二者的對映方式。將視訊記憶體中的資料與紋理參照系關聯的操作,稱為將資料與紋理繫結(texture binding)。視訊記憶體中能夠繫結到紋理的資料有:普通線性儲存器和cuda陣列;存在快取機制;能夠設定濾波模式,定址模式等;

local memory:暫存器被使用完成,資料將被儲存在區域性儲存器中;

大型結構體或者陣列。

無法確定大小的陣列;

執行緒的輸入和中間變數;

定義執行緒私有陣列的同一時候進行初始化的陣列被分配在暫存器中。

global memory:存在於視訊記憶體中。也稱為線性記憶體(視訊記憶體能夠被定義為線性儲存器或者cuda陣列)。

cudamalloc()函式分配,cudafree()函式釋放,cudamemcpy()進行主機端與裝置端的傳輸資料。

初始化共享儲存器須要呼叫cudamemset();

二維三維陣列:cudamallocpitch()和cudamalloc3d()分配線性儲存空間,能夠確保分配滿足對齊要求;

cudamemcpy2d()。cudamemcpy3d()與裝置端儲存器進行拷貝;

並行程式設計與PLINQ 任務並行

任務並行 在tpl當中還可以使用parallel.invoke方法觸發多個非同步任務,其中 actions 中可以包含多個方法或者委託,paralleloptions用於配置parallel類的操作。public static void invoke action actions public st...

c 並行程式設計

本部落格將看c 並行程式設計的例子 1.執行緒程序原理 執行緒是輕量級的程序,乙個程序可以擁有多個執行緒。編譯多執行緒程式加入 g lphread 2.openmp庫加速 2.1 openmp庫加速配置及hello,world 事實上有個openmp庫,可以實現單台cpu的加速 windows下使用...

MPI並行程式設計

了解並熟悉mpi並行程式開發環境,學會並行程式編譯方法,並行程式作業提交方法,並行程式執行狀態觀察與分析方法,本實驗的內容主要包括學習如何編譯執行mpi程式以及通過較簡單的 helloworld.c 程式的實際執行來進一步的熟悉 實驗一,本實驗的內容主要包括學習如何編譯執行mpi程式以及通過較簡單的...