CUDA進階第三篇:CUDA計時方式
寫在前面內容分為兩部分,第一部分為翻譯《Professional CUDA C Programming》 Section 2. CUDA Programming Model中的TIMING YOUR KERNEL;第二部分為自己的經驗。經驗不足,歡迎各位大大補充。
寫CUDA,追求的就是加速比,想要得到準確的時間,計時函式就是必不可少
計時通常分為兩種情況,(1)直接得到介面函式的時間,一般用於得到加速比;(2)獲得介面函式核心函式、記憶體拷貝函式等所耗時間,一般用於優化程式碼時。
情況(1)方法有兩種,CPU計時函式和GPU計時函式。
情況(2)有三種工具nsight,nvvp,nvprof
本文會詳細介紹情況(1)的兩種方法;情況(2),nsight不會用,簡單介紹一下nvvp和nvprof的用法。
CPU計時函式
在利用CPU計時函式時,要考慮的一個問題是:核函式的執行是非同步執行的,所以必須加上核函式同步函式,才能得到準確的時間。
示例程式碼如下:
寫CUDA,追求的就是加速比,想要得到準確的時間,計時函式就是必不可少
計時通常分為兩種情況,(1)直接得到介面函式的時間,一般用於得到加速比;(2)獲得介面函式核心函式、記憶體拷貝函式等所耗時間,一般用於優化程式碼時。
情況(1)方法有兩種,CPU計時函式和GPU計時函式。
情況(2)有三種工具nsight,nvvp,nvprof
本文會詳細介紹情況(1)的兩種方法;情況(2),nsight不會用,簡單介紹一下nvvp和nvprof的用法。
CPU計時函式
在利用CPU計時函式時,要考慮的一個問題是:核函式的執行是非同步執行的,所以必須加上核函式同步函式,才能得到準確的時間。
示例程式碼如下:
- double cpuSecond() {
- struct timeval tp;
- gettimeofday(&tp,NULL);
- return ((double)tp.tv_sec + (double)tp.tv_usec*1.e-6);
- }
- double iStart = cpuSecond();
- function(argument list);
- cudaDeviceSynchronize(); // 同步函式
- double iElaps = cpuSecond() – iStart;
複製程式碼
GPU計時函式
GPU計時函式就不需要考慮同步問題,直接用計時事件函式就可以了,示例程式碼如下:
- cudaEvent_t start, stop;
- float elapsedTime = 0.0;
- cudaEventCreate(&start);
- cudaEventCreate(&stop);
- cudaEventRecord(start, 0);
- function(argument list);;
- cudaEventRecord(stop, 0);
- cudaEventSynchronize(stop);
- cudaEventElapsedTime(&elapsedTime, start, stop);
- cout << elapsedTime << endl;
- cudaEventDestroy(start);
- cudaEventDestroy(stop);
複製程式碼
如何獲得精確的計時正常情況下,第一次執行核函式的時間會比第二次慢一些。這是因為GPU在第一次計算時需要warmup。所以想要第一次核函式的執行時間是不精確的。獲得精確的計時我總結為三種,如下
- 迴圈執行一百次所需要計時的部分,求平均值,將第一次的誤差縮小100倍。這種方法的優點是簡單粗暴。但缺點也很明顯:(1)程式的執行時間大大增長,特別是比較大的程式(2)要考慮記憶體溢位問題,C++的記憶體需要程式猿自己手動管理。寫出執行一次不出記憶體溢位問題的程式很容易,但是寫出迴圈執行一百次而不出記憶體溢位問題的程式碼就有一定難度了(3)計時不是特別準確,雖然誤差已經被縮小了100倍。
- 在計時之前先執行一個warmup函式,warmup函式隨便寫,比如我從cuda sample裡的vectoradd作為warmup函式。這種方法的優點是程式執行時間縮短;缺點是需要在程式中新增一個函式,而且因為GPU亂序並行的執行方式,核函式的兩次執行時間並不能完全保持一樣。所以推薦使用方法3.
- 先執行warmup函式,在迴圈10遍計時部分。
nvvp和nvprof的用法
nvprof是自cuda5.0開始存在的一個命令列Profiler,你可以只用nvprof來你程式碼的一些執行細節。簡單用法如下:
- $ nvprof ./sumArraysOnGPU-timer
複製程式碼
你就可以得到如下:
- ./sumArraysOnGPU-timer Starting…
- Using Device 0: Tesla M2070
- ==17770== NVPROF is profiling process 17770, command: ./sumArraysOnGPU-timer
- Vector size 16777216
- sumArraysOnGPU <<<16384, 1024>>> Time elapsed 0.003266 sec
- Arrays match.
- ……
複製程式碼
關於nvprof的更多引數資訊,可以使用幫助命令:
- $ nvprof –help
複製程式碼
The NVIDIA Visual Profiler(nvvp)是一款圖形化介面的Profiler,也是我一直在用的Profiler。
本文來自大光叔叔的原創,http://blog.csdn.net/litdaguang/article/details/50520549
原文釋出時間為:2016-7-8 10:35:49
原文由:十四王爺釋出,版權歸屬於原作者
本文來自雲棲社群合作伙伴NVIDIA,瞭解相關資訊可以關注NVIDIA官方網站
相關文章
- cuda程式設計與gpu平行計算(四):cuda程式設計模型程式設計GPU模型
- CUDA
- CUDA學習筆記-1: CUDA程式設計概覽筆記程式設計
- cuda 流
- 【cuda】- 01
- cmake cuda
- TensorFlow 報錯 CUDA driver version is insufficient for CUDA runtime version
- CUDA 技能樹
- cuda和cudatoolkit
- 【CUDA】CUDA9.0+VS2017+win10詳細配置Win10
- CUDA 高效能平行計算入門
- CUDA 8的混合精度程式設計程式設計
- CUDA的問題
- cuda 核函式函式
- cuda安裝教程
- CUDA精講(1)
- CUDA學習指南
- CUDA 版本檢視
- CUDA C 程式設計權威指南 學習筆記:第二章 CUDA程式設計模型程式設計筆記模型
- 如何解決.cuda()載入用時很長
- 簡述CUDA執行緒及求CUDA中執行緒索引執行緒索引
- cmake 生成 cuda 專案
- Kaldi中啟用cuda
- cuda 加速矩陣乘法矩陣
- CUDA總結2——cudaMemcpymemcpy
- kaldi+cuda安裝
- miniconda Pytorch CUDA Cudnn onnxruntimePyTorchDNN
- cuda的c++程式C++
- 漫談CUDA優化優化
- Ubuntu下安裝CUDAUbuntu
- NVIDIA CUDA 程式設計模型之Grid和Block程式設計模型BloC
- CUDA和CUDNN版本切換DNN
- linux安裝cuda和cudnnLinuxDNN
- Ubuntu 切換不同 CUDA 版本Ubuntu
- cuda runtime error (801) : operation not supportedError
- CUDA常用概念及注意點
- cuda矩陣練習(一)矩陣
- 有Cuda能力的GPU核心GPU