CUDA 開發環境設定與簡易程式範例 - Neutrino's Blog

文章推薦指數: 80 %
投票人數:10人

如果裝了CUDA 幾本上OpenCL 也可以順便裝,因為Nvidia GPU 使用OpenCL 也是吃CUDA,這樣之後要跑OpenCL 就可以直接用。

$ sudo apt install -y nvidia- ... CUDA開發環境設定與簡易程式範例 2020-12-10 Liu,An-Chi劉安齊 ¶1.簡介 GPU以前是用來算圖形介面,後來有了通用GPU運算(GeneralPurposeGPU,GPGPU)技術的誕生,因為GPU架構擁有非常多執行緒,在跑程式的時候可以將大量的數值運算交給GPU,而邏輯的部分交給CPU,這也是常見的GPGPU使用方式。

其中Nvidia便是第一個提出GPGPU概念的公司,其公司提出CUDA技術,讓開發者可以用一般寫C的語法去驅動GPU來做運算。

¶2.CUDA安裝 CUDA有很多個版本,如果直接用aptinstallcuda不一定安裝到自己需要的版本。

除了一般的CUDA程式,我們可能還會想要給Pytorch或Tensorflow使用。

比較好的做法是去官方網站找自己需要的版本,不過要記住要去CUDAToolkitArchive的頁面選版本,不然Nvidia官網會直接導引到最新的版本。

大家可以照著我下面指示安裝。

¶2.1CUDA安裝 以下以CUDA11.0版本為範例。

首先去Archive頁面,選11.0點進去,然後照個你的需求把選項勾一勾。

例如上面就是選x86Ubuntu20.04版本,然後你可以選runfile、deblocal或debnetwork。

三種差異分別是一大包安裝檔、deb包裝好的一大包安裝檔、完全靠網路下載的deb安裝檔。

有沒有deb差異在於之後可不可以用套件管理員去管理。

通常我會選deblocal,你也可以用其他的,端看個人習慣。

選完之後他很貼心,就會給你一大串指令,基本上照著打就安裝完了。

Cuda11.0Ubuntu20.04x86安裝流程: wgethttps://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudomvcuda-ubuntu2004.pin/etc/apt/preferences.d/cuda-repository-pin-600 wgethttps://developer.download.nvidia.com/compute/cuda/11.0.3/local_installers/cuda-repo-ubuntu2004-11-0-local_11.0.3-450.51.06-1_amd64.deb sudodpkg-icuda-repo-ubuntu2004-11-0-local_11.0.3-450.51.06-1_amd64.deb sudoapt-keyadd/var/cuda-repo-ubuntu2004-11-0-local/7fa2af80.pub sudoapt-getupdate sudoapt-get-yinstallcuda 其中dpkg-i如果有問題的話,也可以直接用apt./xxx.deb來代替。

¶2.2CuDNN安裝 我們可以順便裝一下CuDNN,這是CUDA針對DeepLearning優化過的函數庫,假設有使用Pytorch就會用到。

記得根據你的作業系統改一下連結,像是ubuntu18.04是指Ubuntu18。

$sudobash-c'echo"debhttp://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/">/etc/apt/sources.list.d/cuda_learn.list' $sudoaptinstalllibcudnn7 ¶2.3OpenCL安裝 如果裝了CUDA幾本上OpenCL也可以順便裝,因為NvidiaGPU使用OpenCL也是吃CUDA,這樣之後要跑OpenCL就可以直接用。

$sudoaptinstall-ynvidia-opencl-dev $sudoaptinstallopencl-headers ¶2.4系統設定 然後首先要重新開機,這非常重要!!!! 順利裝完之後記得要把路徑設定好,在~/.bashrc裡面加入 exportPATH=$PATH:/usr/local/cuda/bin exportCUDADIR=/usr/local/cuda ¶2.5檢查安裝 然後我們就可以檢查一下有沒有裝好。

CUDA有裝好的話,以下指令應該都有反應。

$nvidia-smi#Driver $nvcc--version#CUDA $/sbin/ldconfig-N-v$(sed's/://'<</dev/null|greplibcudnn#CuDNN ¶2.6其他 如果上面安裝方法沒用的話,也可以參考這幾篇有用的文章: EasyinstallationofCudaToolkitonUbuntu18.04 Tutorial:[email protected] InstallingCUDA10.1onUbuntu20.04 ¶3.CUDA程式範例 想學好CUDA最好的辦法是看官方教學文件CUDAC++ProgrammingGuide,畢竟是Nvidia自己家的產品。

Gerassimos寫的MulticoreandGPUProgramming:AnIntegratedApproach這本書也挺好的,很適合入門。

這邊提供一個簡單的範例: matadd.cu: #include #include #include #defineN512 #defineBLOCK_SIZE16 //GPU的Kernel __global__voidMatAdd(float*A,float*B,float*C) { //根據CUDA模型,算出當下thread對應的x與y inti=blockIdx.x*blockDim.x+threadIdx.x; intj=blockIdx.y*blockDim.y+threadIdx.y; //換算成線性的index intidx=j*N+i; if(i>>(d_A,d_B,d_C); //等待GPU所有thread完成 cudaDeviceSynchronize(); //將Device的資料傳回給Host cudaMemcpy(h_C,d_C,N*N*sizeof(float),cudaMemcpyDeviceToHost); //驗證正確性 for(i=0;i>>,算完之後還要再用cudaMemcpy把GPU的資料搬回給CPU,Host才能拿資料做事。

那我們看到使用Kernel時語法是MatAdd<<>>,這跟GPU的Thread架構有關。

可以參考上圖,GPU包含許多Block,每個Block又有許多Thread。

所以我們在跑Kernel時要指定要用多少Block,以及裡面使用多少Thread。

大概知道在幹嘛之後,我們就可以編譯執行囉! $nvccmatadd.cu;./a.out PASS 跑的時候可以在另一個視窗呼叫nvidia-smi,就可以看到matadd使用GPU狀況。

我們也可以用nvprof來看一下CUDA的效能: $nvprof./a.out ==27161==NVPROFisprofilingprocess27161,command:./a.out PASS ==27161==Profilingapplication:./a.out ==27161==Profilingresult: TypeTime(%)TimeCallsAvgMinMaxName GPUactivities:70.06%263.96us387.986us87.581us88.285us[CUDAmemcpyHtoD] 21.55%81.181us181.181us81.181us81.181us[CUDAmemcpyDtoH] 8.40%31.647us131.647us31.647us31.647usMatAdd(float*,float*,float*) APIcalls:98.65%133.57ms344.524ms3.6540us133.50mscudaMalloc 0.78%1.0564ms4264.10us169.89us383.89uscudaMemcpy 0.19%256.03us385.342us20.249us148.41uscudaFree 0.14%187.38us1187.38us187.38us187.38uscuDeviceTotalMem 0.13%169.85us971.7510us193ns69.776uscuDeviceGetAttribute 0.07%98.576us198.576us98.576us98.576uscudaDeviceSynchronize 0.02%29.226us129.226us29.226us29.226uscudaLaunchKernel 0.02%26.508us126.508us26.508us26.508uscuDeviceGetName 0.00%4.0950us14.0950us4.0950us4.0950uscuDeviceGetPCIBusId 0.00%1.3720us3457ns266ns811nscuDeviceGetCount 0.00%1.0800us2540ns192ns888nscuDeviceGet 0.00%365ns1365ns365ns365nscuDeviceGetUuid 上面顯示我們大部時間都花在搬資料,的確合理,因為我們運算的東西很簡單,導致Overhead發生在記憶體搬移上。

¶4.結論 本文簡單介紹CUDA開發環境設置,並解說簡單的CUDA程式範例。

GPGPU幫助我們在大量運算時可以有效加速計算,許多數值計算函式庫抑或機器學習、深度學習框架也都會使用GPGPU來加速計算。

tags:  parallelprogramming ,  cuda ,  gpu ,  Ad Thismayhelpmeearnsomemoney.(Ofcourseyoucandonatemedirectly) Comments 可以去全站留言板來留言喔! AboutMe Liu,An-Chi劉安齊 SoftwareEngineer @tigercosmos TOC 1.簡介2.CUDA安裝2.1CUDA安裝2.2CuDNN安裝2.3OpenCL安裝2.4系統設定2.5檢查安裝2.6其他3.CUDA程式範例4.結論 RecentPosts 2021米蘭理工交換教戰手冊—米蘭理工概況與心得 2021米蘭理工交換教戰手冊—抵達米蘭與生存篇 2021米蘭理工交換教戰手冊—出國前準備篇 出發到抵達米蘭頭兩天雜記 如何在台灣申請義大利學生簽證 交大觀察與心得(五):碩二下—科技X藝術 JavaScript遍歷Array的四種方法:for、for-in、for-of、forEach() 計算攝影學(ComputationalPhotography)簡介(一) 「台灣社交距離」App背後技術原理:接觸通知系統與保護隱私的接觸追蹤技術 深入理解Reentrancy和Thread-safe Ad Search 贊助寫作 謝謝您的協助,請作者喝一杯咖啡,能讓作者用來更有動力為讀者提供品質更加優良的文章與閱讀環境 Archives 20211420204720191620185820174720162120153 Tags 20212dpattern30天javascript從入門到進階angular2之30天邁向神乎其技之路boostcgicpuspecenglishfacebookhdritalyjavascriptmilansharedarraybuffervocabularytitanwebassemblyxr專題aialgorithmamdmi50angularangular5angular2arrayatomicatomicsbagofvisualwordsbagofwordsbeginnerbenchmarkbiasbotbottenderbrowserbrowserarchitecturebrowserscc++cameracameracalibrationchaoschatbotchromiumcloudmosacollisiondetectioncompareandswapcomputationalphotographycomputeranimationcomputersciencecomputervisioncoscupcovid-19cpucublascudacudnndebugdeeplearningdeeplearninghardwaredenodigitalprocessingdnsdockerdup2elixirenglishfeaturematchingfloating-pointnumberforkforwardkinematicsfrontenddevelopmentgdbgitgithubappgooglenetgpugrowinguphowthingsworkhttpserverhybridimageimageprocessingimagestitchingimpulseinferenceinterninversekinematicsjacobianjointconstraintkeypointlet'sbuildadbmslinebotlinuxlocalizationlockfreemachinelearningmeasurementmmapmobiledevicemozillamozillataiwannetworknetworkprogrammingnewyearresolutionnlpnodejsnoteopensourceopenclpaperparallelprogrammingperfperformanceanalysisphysicspipepolimiprobotprogrammingpseudoinversepthreadpuffinbrowserpuffinosphonepullrequestpythonpytorchransacredblacktreereentrancyrelationaldatabaserevisioncontrolrigidbodyrustrusttaiwanscienceservosharedmemorysharedobjectshellsideprojectsigactionsignalsimulationsirsocketsoftwaresoftwareengineersoftwareengineeringspecaccelspeccpusquidstellarsqlstorysystemsystemsoftwaretensorflowthecleancoderthread-safetimestackingtimewarpingtopcommandtputraditionalchineseunixvgg16visaweatherbotwebwebworkerwindows‎ieee754交大觀察與心得交大課程交大資工所來做個網路瀏覽器吧!傳染病全球集思論壇公共衛生公司函式助教反向動力法台大台大網媒所台大觀察與心得國網中心基本素養大學大學生活大氣女友學習指南安琪兒專案工作工作環境布朗運動平行化平行程式必修課悅讀源碼想法接觸通知系統推甄故事故宮效能分析新年新希望時間扭曲法校系選擇條件判斷模擬機率檔案讀寫正向動力法氣象喵氣象機器人源始碼演算法瀏覽器物件物理獎學金玉山培育傑出人才獎學金玉山文教生機省思研究所碩士科學科學班科展程式程式設計入門筆記簽證米蘭米蘭理工米蘭理工交換教戰手冊紅黑樹美術社義大利自序自然語言處理臺灣金融科技公司藝術資工資訊工程軟體工程軟體工程師迴圈鐵人賽開源陣列隨筆電腦動畫電腦動畫與特效電腦視覺面試高中



請為這篇文章評分?