《基於GPU加速的計算機視覺程式設計》學習筆記(2)

2021-10-13 01:21:05 字數 3269 閱讀 7062

使用cuda c進行並行程式設計

那我們應該坐以待斃麼,那是不可能的,所以我們選擇曲線救國,使用ubuntu16.04安裝cuda。

這裡就不細講我怎麼在win10上安裝的ubuntu16.04雙系統了,乙個原因是確實沒法截圖,另乙個原因是雙系統的安裝也不是我乙個人完成的,遇到了一些問題,都是同學幫我解決的,所以沒有資格在這裡講解(雖然網上也沒有特別詳細的教程,尤其是分盤那一步)

不過,這裡可以說一下在安裝過程中讓我印象很深的一件事吧。

就是我安裝完了ubuntu16.04雙系統之後,開機選擇進入ubuntu,進入ubuntu的過程十分緩慢。之後的關機,reboot,也會卡住,一直卡在乙個畫面上只能重啟。

解決方法:安裝顯示卡驅動,安裝好了,上面的問題就解決了,根本不是什麼網上說的輸入法,語言設定的問題。

1.ctrl+alt+t 開啟終端。

2.輸入sudo lshw -c video

我們可以看到,這裡顯示的資訊是,gp107m(geforce gtx 1050 mobile)

使用ubuntu自帶的apt-get,在終端裡輸入命令即可

sudo apt-get install nvidia-cuda-tootik
nvcc 將分別編譯 .cu檔案(後續測試時會講到)中的host和device**,前者是通過系統自帶的gcc之類的host**編譯器進行的,而後者則是通過cuda c前端等一系列工具進行的。

你可以通過如下命令安裝nsight eclipse edition(也叫做nv)用作linux下開發cuda程式的圖形化ide環境。

sudo apt install nvidia-nsight
hello cuda!**如下

#include //書中只給了這乙個庫函式,但是我執行失敗了,因為有printf。

#include //加上stdio.h就執行成功了。我是在終端上編譯執行的,書上是在nv上編譯執行的,難道這還會有差別?我認為可能是作者寫錯了?

__global__ void myfirstkernel(void)

int main(void)

儲存為 filename.cu檔案。

nvcc -o filename filename.cu
使用nvcc的 -o命令,編譯生成可執行檔案

./filename
執行可執行檔案,可以在終端看到

執行成功。

__global__字首是cuda c在標準c中新增的乙個限定符,它告訴編譯器在這個限定符後面的函式定義應該該在裝置上而不是主機上。也就是上面的函式myfirstkernel將執行在裝置上。(雖然現在是空的)

nvcc編譯器將main提供給c編譯器,因為它沒有被global修飾,因此main函式將在主機上執行。

尖括號是cuda c的乙個技巧:從主機**呼叫裝置**。被稱為核心呼叫。尖括號內的值代表我們希望在執行時從主機傳遞給裝置的引數。比如,上面**。<< <1,1> >> 表示,myfirstkernel函式將執行在裝置上的乙個塊和乙個執行緒上。

myfirstkernel函式將執行在乙個只有乙個塊和乙個執行緒的裝置上。他們通過乙個成為核心啟動的方法從main函式內部的主機**啟動。

##cuda c中的雙變數加法程式

#include #include #include #include //核心函式

__global__ void gpuadd(int d_a, int d_b ,int *d_c)

//主函式

int main(void)

其實**很好理解,無非是使用了cuda自帶的api實現動態分配記憶體和釋放。剩下的關鍵點就和hello cuda是一樣的。

為了在裝置上並行啟動多個程式,我們必須在核心呼叫中配置引數,核心呼叫是在核心啟動配置中編寫的。它們指定了grid中塊的數量,和每個塊中線程的數量。我們可以並行啟動很多塊,而每個塊又有很多個執行緒。通常,每個塊有512或1024個執行緒。每個塊在流多處理器上執行,乙個塊只能哦個的執行緒可以通過共享記憶體彼此通訊。

假設我們要啟動500個執行緒,我們可以:

1.啟動乙個包含500個執行緒的塊

2.啟動乙個執行緒的500個塊

3.或者兩個執行緒,每個執行緒250個塊

但每個塊的執行緒數量不能超過gpu裝置所支援的最大限度。

我們的目標是計算機視覺的應用程式,需要處理二維和三維影象,那麼使用多維的執行緒和塊則可以更好地進行和處理視覺化。

例如:gpu支援三維網格塊和三維線程塊

mykernel<< >>()
這裡的nb表示網格中的x,y,z方向,nt表示乙個塊中沿x,y,z的執行緒數。例如我們想要處理乙個影象,可以啟動乙個16×16的塊網路,所有的塊都包含16×16的執行緒。語法如下:

mykernel<< >>()
我們會經常的在cuda c程式中看到如下關鍵字, _ global _、cudamalloc、cudamemcpy、cudafree。其中,global在前問中已經講過,如果對於理解程式**來說,不需要知道的太多,所以不再講述。

對cudamalloc和cudafree,用法和malloc和free的用法是相同的,只不過是用在裝置塊中而已。

這裡我們重點說一下cudamemcpy。

cudamemcpy(void * dst_ptr ,const void * src_ptr ,size_t size,enum cudamemcpykind kind)

example :cudamemcpy(&h_c,d_c,sizeof(int),cudamemcpydevicetohost)

這個函式類似於memcpy函式,除了是在裝置塊中這一點區別以外,它多了乙個第四個引數:方向,即資料複製的方向:可以從主機到裝置,裝置到裝置,主機到主機,或裝置到主機。但是一定要注意,這裡的方向和你設定的第一和第二個引數要是對應的。例子中,選擇裝置指標d_c作為源指標,h_c為目標指標,第四個引數告訴我們,是從裝置視訊記憶體複製到了主機記憶體上。

12月26日的更新到這裡結束了,12月25日的內容有部分的改動。

為啥繼續往下寫,是因為發現自己的nvcc不能夠執行global裡的函式,然後調查了一圈原因也沒找到,感覺是不是cuda的安裝出了問題,然後又重新安裝了一遍cuda,結果安裝崩了,導致nvcc都用不了了。。。。。。。淦。

(計算機視覺)計算機視覺基礎

opencv cximage cimg freeimage opencv中vc庫的版本與visual studio版本的對應關係 vc8 2005 vc9 2008 vc10 2010 vc11 2012 vc12 2013 vc14 2015 vc15 2017 visual studio中的輔助...

OpenVINO計算機視覺模型加速 003

include include include include include using namespace cv using namespace inferenceengine using namespace std int main int argc,char ar namedwindow i...

Python計算機視覺程式設計

本書是計算機視覺程式設計的權威實踐指南,通過python語言講解了基礎理論與演算法,並通過大量示例細緻分析了物件識別 基於內容的影象搜尋 光學字元識別 光流法 跟蹤 3d重建 立體成像 增強現實 姿態估計 全景建立 影象分割 降噪 影象分組等技術。另外,書中附帶的練習還能讓讀者鞏固並學會應用程式設計...