CUDA 5 為 CUDA 工具箱添加了一個(gè)強(qiáng)大的新工具: nvprof
。 nvprof
是一個(gè)可用于 Linux 、 Windows 和 OS X 的命令行探查器。乍一看, nvprof
似乎只是 NVIDIA Visual Profiler 和 NSight 日蝕版 中圖形分析功能的無(wú) GUI 版本。但是 nvprof
遠(yuǎn)不止這些;對(duì)我來(lái)說(shuō), nvprof
是一個(gè)輕量級(jí)的分析器,它達(dá)到了其他工具所不能達(dá)到的水平。
使用 nvprof
進(jìn)行快速檢查
我經(jīng)常想知道我的 CUDA 應(yīng)用程序是否按預(yù)期運(yùn)行。有時(shí)這只是一個(gè)正常的檢查:應(yīng)用程序是否在 GPU 上運(yùn)行內(nèi)核?它是否執(zhí)行過(guò)多的內(nèi)存復(fù)制?通過(guò)使用 nvprof ./myApp
運(yùn)行我的應(yīng)用程序,我可以快速看到它所使用的所有內(nèi)核和內(nèi)存副本的摘要,如下面的示例輸出所示。
==9261== Profiling application: ./tHogbomCleanHemi ==9261== Profiling result: Time(%) Time Calls Avg Min Max Name 58.73% 737.97ms 1000 737.97us 424.77us 1.1405ms subtractPSFLoop_kernel(float const *, int, float*, int, int, int, int, int, int, int, float, float) 38.39% 482.31ms 1001 481.83us 475.74us 492.16us findPeakLoop_kernel(MaxCandidate*, float const *, int) 1.87% 23.450ms 2 11.725ms 11.721ms 11.728ms [CUDA memcpy HtoD] 1.01% 12.715ms 1002 12.689us 2.1760us 10.502ms [CUDA memcpy DtoH]
在默認(rèn)的 摘要模式 中, nvprof 提供了應(yīng)用程序中 GPU 內(nèi)核和內(nèi)存副本的概述。摘要將對(duì)同一內(nèi)核的所有調(diào)用組合在一起,顯示每個(gè)內(nèi)核的總時(shí)間和總應(yīng)用程序時(shí)間的百分比。除了摘要模式之外, nvprof 還支持 GPU – 跟蹤和 API 跟蹤模式 ,它可以讓您看到所有內(nèi)核啟動(dòng)和內(nèi)存副本的完整列表,在 API 跟蹤模式下,還可以看到所有 CUDA API 調(diào)用的完整列表。
下面是一個(gè)使用 nvprof --print-gpu-trace 評(píng)測(cè)在我的電腦上的兩個(gè) GPUs 上運(yùn)行的 nbody 示例應(yīng)用程序的示例。我們可以看到每個(gè)內(nèi)核在哪個(gè) GPU 上運(yùn)行,以及每次啟動(dòng)使用的網(wǎng)格維度。當(dāng)您想驗(yàn)證 multi- GPU 應(yīng)用程序是否按預(yù)期運(yùn)行時(shí),這非常有用。
nvprof --print-gpu-trace ./nbody --benchmark -numdevices=2 -i=1 ... ==4125== Profiling application: ./nbody --benchmark -numdevices=2 -i=1 ==4125== Profiling result: Start Duration Grid Size Block Size Regs* SSMem* DSMem* Size Throughput Device Context Stream Name 260.78ms 864ns - - - - - 4B 4.6296MB/s Tesla K20c (0) 2 2 [CUDA memcpy HtoD] 260.79ms 960ns - - - - - 4B 4.1667MB/s GeForce GTX 680 1 2 [CUDA memcpy HtoD] 260.93ms 896ns - - - - - 4B 4.4643MB/s Tesla K20c (0) 2 2 [CUDA memcpy HtoD] 260.94ms 672ns - - - - - 4B 5.9524MB/s GeForce GTX 680 1 2 [CUDA memcpy HtoD] 268.03ms 1.3120us - - - - - 8B 6.0976MB/s Tesla K20c (0) 2 2 [CUDA memcpy HtoD] 268.04ms 928ns - - - - - 8B 8.6207MB/s GeForce GTX 680 1 2 [CUDA memcpy HtoD] 268.19ms 864ns - - - - - 8B 9.2593MB/s Tesla K20c (0) 2 2 [CUDA memcpy HtoD] 268.19ms 800ns - - - - - 8B 10.000MB/s GeForce GTX 680 1 2 [CUDA memcpy HtoD] 274.59ms 2.2887ms (52 1 1) (256 1 1) 36 0B 4.0960KB - - Tesla K20c (0) 2 2 void integrateBodies(vec4::Type*, vec4::Type*, vec4::Type*, unsigned int, unsigned int, float, float, int) [242] 274.67ms 981.47us (32 1 1) (256 1 1) 36 0B 4.0960KB - - GeForce GTX 680 1 2 void integrateBodies(vec4::Type*, vec4::Type*, vec4::Type*, unsigned int, unsigned int, float, float, int) [257] 276.94ms 2.3146ms (52 1 1) (256 1 1) 36 0B 4.0960KB - - Tesla K20c (0) 2 2 void integrateBodies(vec4::Type*, vec4::Type*, vec4::Type*, unsigned int, unsigned int, float, float, int) [275] 276.99ms 979.36us (32 1 1) (256 1 1) 36 0B 4.0960KB - - GeForce GTX 680 1 2 void integrateBodies(vec4::Type*, vec4::Type*, vec4::Type*, unsigned int, unsigned int, float, float, int) [290] Regs: Number of registers used per CUDA thread. SSMem: Static shared memory allocated per CUDA block. DSMem: Dynamic shared memory allocated per CUDA block.
使用nvprof
to ProfileAnything
nvprof 知道如何評(píng)測(cè)運(yùn)行在 GPUs NVIDIA 上的 CUDA 內(nèi)核,不管它們是用什么語(yǔ)言編寫(xiě)的(只要它們是使用 CUDA 運(yùn)行時(shí) API 或驅(qū)動(dòng)程序 API 啟動(dòng)的)。這意味著我可以使用 nvprof 來(lái)評(píng)測(cè) OpenACC 程序(沒(méi)有顯式內(nèi)核),甚至可以在內(nèi)部生成 PTX 匯編內(nèi)核的程序。 Mark Ebersole 在他最近關(guān)于 CUDA Python 的 CUDA Cast ( 第十集 )中展示了一個(gè)很好的例子,其中他使用 NumbaPro 編譯器(來(lái)自 Continuum Analytics )及時(shí)編譯了一個(gè) Python 函數(shù),并在 GPU 上并行運(yùn)行。
在 OpenACC 或 CUDA Python 程序的初始實(shí)現(xiàn)過(guò)程中,函數(shù)是否在 nvprof 或 GPU 上運(yùn)行可能并不明顯(尤其是如果您沒(méi)有計(jì)時(shí))。在 Mark 的例子中,他在 GPU 內(nèi)部運(yùn)行 Python 解釋器,捕捉應(yīng)用程序的 CUDA 函數(shù)調(diào)用和內(nèi)核啟動(dòng)的跟蹤,顯示內(nèi)核確實(shí)在 GPU 上運(yùn)行,以及用于將數(shù)據(jù)從 CPU 傳輸?shù)?GPU 的 cudaMemcpy 調(diào)用。這是一個(gè)很好的例子,說(shuō)明了像 nvprof 這樣的輕量級(jí)命令行 GPU 探查器的“健全性檢查”功能。
使用nvprof
進(jìn)行遠(yuǎn)程分析
有時(shí),您正在部署的系統(tǒng)不是您的桌面系統(tǒng)。例如,如果您使用的是 GPU 集群或云系統(tǒng),如 Amazon EC2 ,并且您只能通過(guò)終端訪(fǎng)問(wèn)機(jī)器。這是 nvprof 的另一個(gè)重要用途。只需連接到遠(yuǎn)程計(jì)算機(jī)(例如使用 ssh ,并在 nvprof 下運(yùn)行應(yīng)用程序。
通過(guò)使用 --output-profile 命令行選項(xiàng),您可以輸出一個(gè)數(shù)據(jù)文件,以便以后導(dǎo)入到 nvprof 或 NVIDIA 可視化探查器中。這意味著您可以在遠(yuǎn)程計(jì)算機(jī)上捕獲一個(gè)概要文件,然后在可視化分析器中可視化并分析桌面上的結(jié)果(有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)“ 遠(yuǎn)程分析 ”)。
nvprof 提供了一個(gè)方便的選項(xiàng)( --analysis-metrics ),用于捕獲 visualprofiler 在其“引導(dǎo)分析”模式下所需的所有 GPU 指標(biāo)。下面的屏幕截圖顯示了用于確定內(nèi)核瓶頸的可視化分析器。此分析的數(shù)據(jù)是使用下面的命令行捕獲的。
nvprof --analysis-metrics -o nbody-analysis.nvprof ./nbody --benchmark -numdevices=2 -i=1分析從 nvp 命令行分析器導(dǎo)入的數(shù)據(jù)的 NVIDIA 可視化分析器( nvp )的屏幕截圖。
非常方便的工具
如果您是命令行工具的粉絲,我想您會(huì)喜歡使用 nvprof 。 nvprof 可以做的還有很多,我在這里還沒(méi)有提到,比如在 NVIDIA 可視化分析器中收集分析指標(biāo)。關(guān)于作者
Mark Harris 是 NVIDIA 杰出的工程師,致力于 RAPIDS 。 Mark 擁有超過(guò) 20 年的 GPUs 軟件開(kāi)發(fā)經(jīng)驗(yàn),從圖形和游戲到基于物理的模擬,到并行算法和高性能計(jì)算。當(dāng)他還是北卡羅來(lái)納大學(xué)的博士生時(shí),他意識(shí)到了一種新生的趨勢(shì),并為此創(chuàng)造了一個(gè)名字: GPGPU (圖形處理單元上的通用計(jì)算)。
審核編輯:郭婷
-
gpu
+關(guān)注
關(guān)注
28文章
4768瀏覽量
129216 -
Linux
+關(guān)注
關(guān)注
87文章
11342瀏覽量
210136 -
WINDOWS
+關(guān)注
關(guān)注
4文章
3567瀏覽量
89115
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論