昨天分享了 cuda在ubuntu的安裝和使用,今天在jetson nano上進行測試驗證使用cuda。在jetson nano上安裝使用cuda和ubuntu有所區(qū)別,所以寫了這篇文章。
首先cuda使用上還是有cuda庫直接調用和opencv cuda庫調用,最后還有在jetson nano內置的CUDA Samples。當然我們也可以自己在網絡下載,這是官方鏈接:https://github.com/NVIDIA/cuda-samples
jetson nano安裝cuda
cuda在jetson nano的鏡像是默認安裝了的,已安裝版本是:
CUDA10.2,CUDNNv8,tensorRT,opencv4.1.1,python2,python3,tensorflow2.3,所以我們可以直接使用,不過oepncv的cuda庫是沒有的,需要我們進行安裝,不過安裝的方式和上一篇文章類似,不過是有些操作細節(jié)需要修改一下。
由于jetson nano上面已經自帶了CUDA10.2,那么我們直接使用了哈。因為一些普通演示demo上篇文章就介紹過了,所以本次就寫了 cuda在ubuntu的安裝使用分享
簡單信息查詢demo
#include?"cuda_runtime.h"
#include?"device_launch_parameters.h"
#include?<stdio.h>
#include?<iostream>
using?namespace?std;
int?main()
{
?int?deviceCount;
?cudaGetDeviceCount(&deviceCount);
?for?(int?i?=?0;?i?<?deviceCount;?i++)
?{
??cudaDeviceProp?devPro;
??cudaGetDeviceProperties(&devPro,?i);
??cout?<<?"使用GPU:"?<<?i?<<?endl;
??cout?<<?"設備全局內存總量:"?<<?devPro.totalGlobalMem?<<?endl;
??cout?<<?"SM的數量:"?<<?devPro.multiProcessorCount?<<?endl;
??cout?<<?"每個線程塊的共享內存大小:"?<<?devPro.sharedMemPerBlock?/?1024<<?"KB"?<<?endl;
??cout?<<?"每個線程塊的最大線程數:"?<<?devPro.maxThreadsPerBlock?<<?endl;
??cout?<<?"一個線程塊中可用的寄存器數:"?<<?devPro.regsPerBlock?<<?endl;
??cout?<<?"每個EM的最大線程數:"?<<?devPro.maxThreadsPerMultiProcessor?<<?endl;
??cout?<<?"每個EM的最大線束數:"?<<?devPro.maxThreadsPerMultiProcessor?/?32<<?endl;
??cout?<<?"設備上多處理器的數量:"?<<?devPro.multiProcessorCount?<<?endl;
?}
?getchar();
????return?0;
}
執(zhí)行效果:
cuda sample庫驗證
這是就是前言里面說到的cuda的例子,大家可以寫cuda的代碼時候,可以參考里面的范例。而在nano里面,JetPack系統將 CUDA 環(huán)境安裝在 /usr/local/cuda 下面。
有人可能發(fā)現在 /usr/local 下面有 cuda 目錄與 cuda-10.2 目錄,兩者的內容完全一樣。事實上 cuda
這個目錄是cuda-10.2軟鏈接,實際的內容指向 cuda-10.2 這個目錄。因為 JetPack 以后會更新 CUDA 版本,所有 cuda-10.2 可能會改變,于是就使用 cuda 軟連接來確保一致性。
接下來進入 samples 目錄
cd /usr/local/cuda/samples/
,里面有早已經放置好的示例,但是都是沒有編譯的,當然我們可以在samples目錄下直接使用sudo make -j4
進行編譯,但是實際上在我編譯發(fā)現在主目錄編譯太費時間了,建議大家到各個子目錄進行編譯,然后驗證。
在每個目錄下面都有對應的子Makefile文件,大家到子目錄make即可。例如:cd 5_Simulations/nbody/
,(nbody 是粒子碰撞模擬,大家也可以到其他目錄驗證測試,因為這個 nbody 范例提供 GPU 與 CPU 的執(zhí)行,可以讓大家更清楚兩者之間的性能差距) 然后 sudo make -j4
ls -l
大家就可以看到綠色編譯好的可執(zhí)行文件,這個時候我們就可以 sudo ./nbody
進行測試
這個范例默認是在 GPU 上執(zhí)行,并且預設粒子數量為 1024 個??梢砸暣邦^部看到一些性能相關的信息,包括:模擬粒子數是1024個、渲染性能的幀率、指令性能BIPS(每秒百萬次)、計算機性能GFLPOS(單精度狀態(tài))。此外在界面的左上角還有粒子大小、速度阻尼、軟化系數、時間步長、集群規(guī)模、速度范圍。
sudo ./nbody
GPU跑的示意圖
cpu執(zhí)行的話是需要設置額外的參數 sudo ./nbody -cpu -numbodies=1024
CPU跑的示意圖
將視窗頭部的性能數據與前一個在 GPU 上執(zhí)行的結果進行比較,可以幾項性能都有10倍左右的差距,這效果就非常顯而易見了。這就是GPU使用的明顯對比了哈。
編譯opencv的cuda庫
這個和上一篇文件類似,也是要一些特殊的cmake選項,我執(zhí)行編譯的選項如下,大家把opencv_contrib-4.1.1替換成自己的目錄即可。
cmake?-D?CMAKE_BUILD_TYPE=Release
??-D?ENABLE_CXX11=ON
??????????-D?CMAKE_INSTALL_PREFIX=/usr/local
??????????-D?WITH_CUDA=ON
???????????-D?CUDA_ARCH_BIN=${cuda_compute}
???????????-D?CUDA_ARCH_PTX=""
???????????-D?ENABLE_FAST_MATH=ON
???????????-D?CUDA_FAST_MATH=ON
???????????-D?WITH_CUBLAS=ON
????????????-D?WITH_LIBV4L=ON
????????????-D?WITH_GSTREAMER=ON
?????????????-D?WITH_GSTREAMER_0_10=OFF
?????????????-D?WITH_OPENGL=ON
?????????????-D?CUDA_NVCC_FLAGS="--expt-relaxed-constexpr"?
?????????????-D?CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2
?????????????-D?WITH_TBB=ON
?????????????-D?OPENCV_EXTRA_MODULES_PATH=/home/jetson/lyn_work/opencv_contrib-4.1.1/modules??????????../
不過這里我進行了先在我的ubuntu系統進行cmake 和make執(zhí)行,把opencv-4.1.1和opencv_contrib-4.1.1兩個文件夾打包拷貝到我的jetson nano編譯。為什么這么做呢,因為遇到了一些編譯錯誤,如下:
[?98%]?Linking?CXX?executable?../../bin/opencv_perf_xphoto
In?file?included?from?/home/jetson/lyn_work/opencv-4.1.1/modules/core/include/opencv2/core.hpp:54:0,
???????????????from?/home/jetson/lyn_work/opencv-4.1.1/modules/core/include/opencv2/core/cuda.hpp:51,
???????????????from?/home/jetson/lyn_work/opencv_contrib-4.1.1/modules/cudaoptflow/include/opencv2/cudaoptflow.hpp:50,
???????????????from?/home/jetson/lyn_work/opencv-4.1.1/build/modules/cudaoptflow/precomp.hpp:48:
/home/jetson/lyn_work/opencv-4.1.1/modules/core/include/opencv2/core/base.hpp:320:40:?error:?expected?constructor,?destructor,?or?type?conversion?before?‘(’?token
#define?CV_Error(?code,?msg?)?cv::error(?code,?msg,?CV_Func,?__FILE__,?__LINE__?)
網上也有一些相似問題,不過經過自己對比log之后,發(fā)現是jetson上面網絡不好,在編譯opencv中,下載一些包,網絡不太通暢,導致下載失敗,最終導致的編譯error。所以我在自己ubuntu系統(有梯子)下載好之后再進行編譯。
-- data: Download: face_landmark_model.dat
在拷貝到jetson nano之后,解壓兩個文件夾,在opencv的build目錄刪除掉 cmake的緩存文件,rm CMakeCache.txt
,重新cmake ,這個時候重新編譯就不需要重新下載依賴的包了。
編譯完之后,我們就可以使用,測試方法還是和上一篇文章類似,這里我就不多贅述了,大家可以參考上一篇的內容。cuda在ubuntu的安裝使用分享
結語
這就是我自己的一些cuda在jetson nano的使用分享,下一篇我們聊聊cuda實際使用gpu加速和cpu使用的對比,以及它兩使用場景分析。。如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。
作者:良知猶存,白天努力工作,晚上原創(chuàng)公號號主。公眾號內容除了技術還有些人生感悟,一個認真輸出內容的職場老司機,也是一個技術之外豐富生活的人,攝影、音樂 and 籃球。關注我,與我一起同行。