《GPU高效能程式設計CUDA實戰》學習筆記 1

2021-09-02 17:43:17 字數 2549 閱讀 4922

《gpu高效能程式設計cuda實戰》中**整理

《gpu高效能程式設計cuda實戰》學習筆記(三)

cuda程式設計——gpu架構,由sp,sm,thread,block,grid,warp說起

《cuda並行程式設計-gpu程式設計指南》讀書筆記–(1)執行緒網格、執行緒塊以及執行緒

sp(streaming process),sm(streaming multiprocessor)是硬體(gpu hardware)概念。而thread,block,grid,warp是軟體上的(cuda)概念。

cuda架構專門為gpu計算設計了一種全新的模組,目的是減輕早期gpu計算中存在的一些限制,而正是這些限制使得之前的gpu在通用計算中沒有得到廣泛的應用。

使用cuda c來編寫**的前提條件包括

(1)、支援cuda的圖形處理器,即由nvidia推出的gpu顯示卡,要求視訊記憶體超過256mb;

(2)、nvidia裝置驅動程式,用於實現應用程式與支援cuda的硬體之間的通訊,確保安裝最新的驅動程式,注意選擇與開發環境相符的圖形卡和作業系統;

(3)、cuda開發工具箱即cuda toolkit,此工具箱中包括乙個編譯gpu**的編譯器;

(4)、標準c編譯器,即cpu編譯器。cuda c應用程式將在兩個不同的處理器上執行計算,因此需要兩個編譯器。其中乙個編譯器為gpu編譯**,而另乙個為cpu編譯**。

一般,將cpu以及系統的記憶體稱為主機(host),而將gpu及其記憶體稱為裝置(device)。在gpu裝置上執行的函式通常稱為核函式(kernel)。

#include

#include

__global__ void

kernel

(void

)int main()

這個程式與最初的「 hello, world!」相比,多了兩個值得注意的地方:

#include 

#include

#include

__global__ void

add(int a, int b, int *c)

int main()

注意這裡增加了多行**,在這些**中包含兩個概念:

• 可以像呼叫c函式那樣將引數傳遞給核函式。

• 當裝置執行任何有用的操作時,都需要分配記憶體,例如將計算值返回給主機。

通過cudamalloc() 來分配記憶體。

這個函式呼叫的行為非常類似於標準的c函式malloc(),但該函式的作用是告訴cuda執行時在裝置上分配記憶體。

cudamalloc函式使用限制總結:

1.可以將cudamalloc()分配的指標傳遞給在裝置上執行的函式。

2.可以在裝置**中使用cudamalloc()分配的指標進行記憶體讀/寫操作。

3.可以將cudamalloc()分配的指標傳遞給在主機上執行的函式。

4.不能在主機**中使用cudamalloc()分配的指標進行記憶體讀/寫操作。

要釋放cudamalloc()分配的記憶體,需要呼叫cudafree()

裝置指標的使用方式與標準c中指標的使用方式完全一樣。主機指標只能訪問主機**中的記憶體,而裝置指標也只能訪問裝置**中的記憶體。

有可能在單塊卡上包含了兩個或多個gpu。

在主機**中可以通過呼叫cudamemcpy() 來訪問裝置上的記憶體,在裝置和主機之間複製資料。

獲得cuda裝置的數量,可以呼叫cudagetdevicecount()

int count;

handle_error

(cudagetdevicecount

(&count )

);

在整合的gpu上執行**,可以與cpu共享記憶體。

計算功能集的版本為1.3或者更高的顯示卡才能支援雙精度浮點數的計算。

cudagetdeviceproperties()

查詢主版本號大於1,或者主版本號為1且次版本號大於等於3的裝置:

首先,找出我們希望裝置擁有的屬性並將這些屬性填充到乙個cudadeviceprop結構。

cudadeviceprop prop;

memset

(&prop,0,

sizeof

( cudadeviceprop ));

prop.major =1;

prop.minor =

3;

在填充完 cudadeviceprop 結構後,將其傳遞給 cudachoosedevice(),這樣cuda執行時將查詢是否存在某個裝置滿足這些條件。 cudachoosedevice()函式將返回乙個裝置id,然後我們可以將這個id傳遞給 cudasetdevice()。隨後,所有的裝置操作都將在這個裝置上執行。

#include "../common/book.h"

int main

(void

)

GPU高效能程式設計CUDA實戰 二

接下來實施 三步走戰略 配置 附加包含目錄 附加庫目錄 以及 附加依賴項 第一步 配置 附加包含目錄 注 對於cuda samples,有的電腦安裝後的路徑會隱藏,我們可以在 開始 按鈕處查詢,見下圖。第二步 配置 附加庫目錄 第三步 配置 附加依賴項 最後,驗證一下配置是否成功。在新建的工程mai...

《GPU高效能程式設計CUDA實戰》學習筆記(五)

add dev a,dev b,dev c 尖括號中 n 開啟了n個執行緒塊 1 每個執行緒塊中建立1個執行緒。共啟動的執行緒數量 n個執行緒塊 1個執行緒 執行緒塊 n個並行執行緒 本節完成上一章相同任務。但執行緒塊中的並行能完成並行執行緒塊無法完成的工作。1.使用執行緒實現gpu上的向量求和 1...

GPU 高效能程式設計 CUDA 執行緒協作

並行執行緒塊的分解 在向量加法中,為向量中的每乙個元素都啟動乙個執行緒塊 add dev a,dev b,dev c 尖括號中的第乙個引數建立的執行緒塊的數量,第二個引數表示每個執行緒塊中建立的執行緒數量,所以上述啟動的執行緒數量為 n n 1 使用執行緒實現 gpu 上的向量求和 需要修改兩個地方...