0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在動(dòng)態(tài)環(huán)境中使用CUDA圖提高實(shí)際應(yīng)用程序性能

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:wnger ? 2022-04-01 16:39 ? 次閱讀

通過(guò)將計(jì)算密集型部件卸載到 GPU 上,可以大大加快許多工作負(fù)載。在 CUDA 術(shù)語(yǔ)中,這被稱(chēng)為啟動(dòng)內(nèi)核。當(dāng)這些內(nèi)核很多且持續(xù)時(shí)間很短時(shí),啟動(dòng)開(kāi)銷(xiāo)有時(shí)會(huì)成為一個(gè)問(wèn)題。

CUDA Graphs提供了一種減少開(kāi)銷(xiāo)的方法。圖形之所以有效,是因?yàn)樗鼈儗⑷我鈹?shù)量的異步 CUDA API 調(diào)用(包括內(nèi)核啟動(dòng))組合到一個(gè)只需要一次啟動(dòng)的操作中。它們?cè)趧?chuàng)建時(shí)確實(shí)會(huì)產(chǎn)生一些開(kāi)銷(xiāo),因此它們的最大好處來(lái)自多次重用。

在 ToolkitVersion10 中引入 CUDA 圖形時(shí),可以對(duì)其進(jìn)行更新,以反映其實(shí)例化中的一些細(xì)微變化。此后,此類(lèi)更新操作的覆蓋范圍和效率顯著提高。在這篇文章中,我描述了一些通過(guò)使用 CUDA 圖來(lái)提高實(shí)際應(yīng)用程序性能的場(chǎng)景,其中一些場(chǎng)景包括圖更新功能。

上下文

考慮一個(gè)應(yīng)用程序,該函數(shù)具有啟動(dòng)許多短運(yùn)行內(nèi)核的功能,例如:

poYBAGJGulWAOyPuAAAFvZpVAF8987.png

如果每次遇到此函數(shù)時(shí)都以相同的方式執(zhí)行,則可以使用流捕獲將其轉(zhuǎn)換為 CUDA 圖。在本例中,必須引入一個(gè)開(kāi)關(guān)布爾值captured,以指示是否已經(jīng)創(chuàng)建了圖形。將此開(kāi)關(guān)的解除 Clara 操作和初始化放在源代碼中,使其范圍包括對(duì)函數(shù)tight_loop的每次調(diào)用。

poYBAGJGulyAFuuRAAAF3Lw50O4800.png

接下來(lái),用代碼包裝函數(shù)的任何實(shí)際調(diào)用,以創(chuàng)建對(duì)應(yīng)的 CUDA 圖(如果它不存在),然后啟動(dòng)該圖。

pYYBAGJGumOAMi1JAAAnzvQqQS4803.png

對(duì) tight _循環(huán)函數(shù)的調(diào)用實(shí)際上并不執(zhí)行任何內(nèi)核啟動(dòng)或其他 CUDA 操作。它只記錄所有這些操作并將它們存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中。

關(guān)注啟動(dòng)內(nèi)核的函數(shù)。在實(shí)際應(yīng)用中,它看起來(lái)像以下代碼:

poYBAGJGumyASIDpAAAXe5K18Vs078.png

顯然,如果函數(shù)的參數(shù)在連續(xù)調(diào)用后發(fā)生變化,那么表示 GPU 內(nèi)部工作的 CUDA 圖也應(yīng)該發(fā)生變化。不能重復(fù)使用原始圖形。但是,假設(shè)多次遇到相同的函數(shù)參數(shù)集,您至少可以通過(guò)兩種不同的方式來(lái)處理這種情況:保存和識(shí)別圖形或更新圖形。

保存并識(shí)別 CUDA 圖形

第一種方法從 C ++標(biāo)準(zhǔn)模板庫(kù)中引入容器來(lái)存儲(chǔ)參數(shù)集。每當(dāng)您遇到一個(gè)新的參數(shù)集來(lái)唯一地定義函數(shù)tight_loop,請(qǐng)將它連同相應(yīng)的可執(zhí)行圖形一起添加到容器中。

當(dāng)您遇到容器中已經(jīng)存在的參數(shù)集時(shí),啟動(dòng)相應(yīng)的 CUDA 圖形。假設(shè)在本例中,變量first、params.size和delta唯一地定義了tight_loop。這個(gè)三胞胎是鑰匙用于區(qū)分圖形。您可以在源代碼中定義它和要使用的容器,使其范圍包括對(duì)函數(shù)tight_loop的每次調(diào)用。

poYBAGJGunaAGL_hAAAQ1ocfeD8808.png

無(wú)論函數(shù)tight_loop出現(xiàn)在何處,都要用填充鍵的代碼將其包裝起來(lái),并在容器中查找。如果找到鍵,代碼將啟動(dòng)相應(yīng)的可執(zhí)行 CUDA 圖。否則,它將創(chuàng)建一個(gè)新圖形,將其添加到容器中,然后啟動(dòng)它(圖 1 )。

poYBAGJGuoCAM6VXAAAxtadBF_Q510.png

pYYBAGJGujWAedr8AABToxtd1Jo121.jpg

圖 1 。保存和識(shí)別圖形。

這種方法通常效果很好,但有一些固有的危險(xiǎn)。在本例中,您確定只需要三個(gè)參數(shù)來(lái)定義容器中的鍵。對(duì)于不同的工作負(fù)載,這可能不同,或者另一個(gè)開(kāi)發(fā)團(tuán)隊(duì)成員可能會(huì)默默地向結(jié)構(gòu)中添加字段MyStruct。這會(huì)影響非平凡函數(shù)cmpKeys的編寫(xiě)方式。此函數(shù)是容器所必需的,用于確定某個(gè)密鑰是否比另一個(gè)密鑰小。

為 STL 容器編寫(xiě)一個(gè)非平凡的比較函數(shù)通常并不困難,但當(dāng)一個(gè)鍵由多個(gè)非平凡的實(shí)體組成時(shí),可能會(huì)很乏味。一種普遍適用的方法是使用詞典比較。對(duì)于本例,以下代碼示例有效:

poYBAGJGuoqASMg9AAASn6BEFeI556.png

更新 CUDA 圖

請(qǐng)記住,要重用以前捕獲的可執(zhí)行 CUDA 圖,它必須與調(diào)用上下文完全匹配:

相同拓?fù)?/p>

圖節(jié)點(diǎn)的數(shù)量和類(lèi)型相同

圖節(jié)點(diǎn)之間的依賴(lài)關(guān)系相同

相同節(jié)點(diǎn)參數(shù)

但是,如果 CUDA 圖的拓?fù)浣Y(jié)構(gòu)保持不變,則可以調(diào)整它以使其符合新的需要。存在一種方便的機(jī)制來(lái)確認(rèn)拓?fù)涞葍r(jià)性,同時(shí)調(diào)整節(jié)點(diǎn)參數(shù)以返回修改后的可執(zhí)行圖。它由cudaGraphExecUpdate提供,其工作原理是將現(xiàn)有的可執(zhí)行圖與新派生的圖進(jìn)行比較(例如,通過(guò)流捕獲方便地獲得)。如果可能,差異用于進(jìn)行更改。

這種方法的好處是雙重的。首先,當(dāng)更新足夠時(shí),可以避免昂貴的新 CUDA 圖實(shí)例化。第二,你不必知道是什么讓圖形獨(dú)一無(wú)二。任何圖形比較都由 update 函數(shù)隱式執(zhí)行。下面的代碼示例實(shí)現(xiàn)了此方法。與之前一樣,它從開(kāi)關(guān)的解除 Clara 和初始化開(kāi)始,以指示先前創(chuàng)建的圖形。

pYYBAGJGupaAKwZdAAA7Uhwfd7U676.png

在這個(gè)場(chǎng)景中,您總是執(zhí)行流捕獲來(lái)收集關(guān)于tight_loop中 CUDA 操作的信息。這是一個(gè)相對(duì)便宜的操作,完全在主機(jī)上執(zhí)行,而不是 GPU 。它可以與以前的 CUDA 圖形啟動(dòng)重疊,這些啟動(dòng)本身就是異步操作(圖 2 )。

poYBAGJGujaACF1aAAA59SNfDM4913.jpg

圖 2 。更新圖形

一句警告的話已經(jīng)準(zhǔn)備好了。cudaGraphExecUpdate的復(fù)雜性大致與 CUDA 圖形節(jié)點(diǎn)的更改數(shù)量成正比,因此如果大部分節(jié)點(diǎn)發(fā)生更改,則效率會(huì)降低。

后果

推動(dòng)這兩種方法以靈活方式管理 CUDA 圖的應(yīng)用程序有兩種不同的工作負(fù)載大小,但行為有所不同(表 1 )。所有涉及的內(nèi)核在單個(gè) NVIDIA A100 GPU 上執(zhí)行需要 2 – 8 微秒。報(bào)告的加速是針對(duì)代碼中可以轉(zhuǎn)換為 CUDA 圖形的部分。

poYBAGJGup-AIHSQAAA4Mm_yIno078.png

結(jié)論

具有許多小 CUDA 內(nèi)核的應(yīng)用程序通??梢允褂?CUDA 圖進(jìn)行加速,即使內(nèi)核啟動(dòng)模式在整個(gè)應(yīng)用程序中發(fā)生變化。鑒于這種動(dòng)態(tài)環(huán)境,最佳方法取決于應(yīng)用程序的具體情況。希望您能發(fā)現(xiàn)本文中描述的兩個(gè)示例易于理解和實(shí)現(xiàn)。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4793

    瀏覽量

    102429
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    27

    文章

    4591

    瀏覽量

    128144
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    XScale 應(yīng)用程序性能的優(yōu)化策略

    XScale 是一款具有高性能、低功耗特性的ARM 兼容嵌入式微處理器架構(gòu)。XScale 引入了多種硬件特性提高其處理能力,但也給應(yīng)用程序的優(yōu)化帶來(lái)了困難。本文分析XScale 體系結(jié)構(gòu)的特點(diǎn)
    發(fā)表于 05-18 13:07 ?5次下載

    快速識(shí)別應(yīng)用程序性能瓶頸

    RATIONAL QUANTIFY FOR WINDOWS能查明應(yīng)用程序性能瓶頸,從而確保使用JAVA、VISUAL C/C++和VISUAL BASIC開(kāi)發(fā)的應(yīng)用程序的質(zhì)量和性能
    發(fā)表于 04-18 22:15 ?20次下載

    DVFS對(duì)程序性能影響模型

    (dynamic voltage frequency scaling,簡(jiǎn)稱(chēng)DVFS)來(lái)提升單節(jié)點(diǎn)的能耗表現(xiàn).但是,DVFS這一類(lèi)機(jī)制同時(shí)影響到應(yīng)用的能源消耗和性能,而這一問(wèn)題尚未被深入探索.專(zhuān)注于 DVFS 機(jī)制對(duì)應(yīng)用程序性能的影響,提出了一個(gè)分析模型用來(lái)量化地刻畫(huà)
    發(fā)表于 12-30 14:56 ?1次下載

    利用矢量硬件如何提高應(yīng)用程序性能

    本次會(huì)議演示了識(shí)別和修改代碼以利用矢量硬件的過(guò)程如何提高應(yīng)用程序性能。
    的頭像 發(fā)表于 05-31 11:46 ?1222次閱讀

    使用Eclipse將Android應(yīng)用程序添加本機(jī)x86架構(gòu)中

    很容易將x86架構(gòu)的支持添加到現(xiàn)有的原生Android應(yīng)用程序中。添加支持還有可能提高應(yīng)用程序性能。 本指南詳細(xì)介紹了使用Eclipse開(kāi)發(fā)環(huán)境的必要步驟
    的頭像 發(fā)表于 11-06 06:50 ?2959次閱讀

    了解CPI對(duì)分析程序性能的意義

    本小節(jié)講述為什么使用 CPI 分析程序性能的意義。如果已經(jīng)非常了解 CPI 對(duì)分析程序性能的意義,可以跳過(guò)本小節(jié)的閱讀。
    的頭像 發(fā)表于 12-15 10:30 ?9780次閱讀

    如何通過(guò)多線程并發(fā)設(shè)計(jì)來(lái)提高應(yīng)用程序性能

    這里我們簡(jiǎn)單總結(jié)了一下,現(xiàn)代多處理器或多內(nèi)核環(huán)境下,如何通過(guò)多線程并發(fā)設(shè)計(jì)來(lái)提高我們應(yīng)用程序性能和響應(yīng)性。
    的頭像 發(fā)表于 09-28 02:13 ?5192次閱讀

    LabVIEW應(yīng)用程序性能瓶頸的解決

    了解如何識(shí)別和解決LabVIEW應(yīng)用程序中的性能瓶頸。使用內(nèi)置工具和VI分析器,您可以監(jiān)視VIs的內(nèi)存使用情況和執(zhí)行時(shí)間,以確定導(dǎo)致應(yīng)用程序性能下降的代碼部分。
    發(fā)表于 03-29 14:03 ?8次下載
    LabVIEW<b class='flag-5'>應(yīng)用程序</b>中<b class='flag-5'>性能</b>瓶頸的解決

    如何使用CMake工具套件構(gòu)建CUDA應(yīng)用程序

    我希望這篇文章向您展示了 CMake 如何自然地支持構(gòu)建 CUDA 應(yīng)用程序。如果您是 CMake 的現(xiàn)有用戶(hù),請(qǐng)?jiān)囉?CMake 3 . 9 并利用改進(jìn)的 CUDA 支持。如果您不是 CMake 的現(xiàn)有用戶(hù),請(qǐng)?jiān)囉?CMake
    的頭像 發(fā)表于 04-01 17:42 ?4264次閱讀
    如何使用CMake工具套件構(gòu)建<b class='flag-5'>CUDA</b><b class='flag-5'>應(yīng)用程序</b>

    使用CUDA流順序內(nèi)存分配器助于提高現(xiàn)有應(yīng)用程序性能

      為了衡量新的流式有序分配器實(shí)際應(yīng)用程序中的性能影響,以下是來(lái)自 RAPIDS GPU 大數(shù)據(jù)基準(zhǔn) ( GPU -bdb]的結(jié)果。
    的頭像 發(fā)表于 04-21 15:32 ?4049次閱讀
    使用<b class='flag-5'>CUDA</b>流順序內(nèi)存分配器助于<b class='flag-5'>提高</b>現(xiàn)有<b class='flag-5'>應(yīng)用程序</b>的<b class='flag-5'>性能</b>

    JavaScript中動(dòng)態(tài)的創(chuàng)建QML對(duì)象

    實(shí)際QML應(yīng)用開(kāi)發(fā)中,我們可以JavaScript中動(dòng)態(tài)的創(chuàng)建QML對(duì)象。這樣做可以延遲對(duì)象的實(shí)例化,當(dāng)我們需要?jiǎng)?chuàng)建對(duì)象的時(shí)候才
    的頭像 發(fā)表于 09-01 10:42 ?1474次閱讀

    通過(guò)32Gb/S光纖通道提高應(yīng)用程序性能

    電子發(fā)燒友網(wǎng)站提供《通過(guò)32Gb/S光纖通道提高應(yīng)用程序性能.pdf》資料免費(fèi)下載
    發(fā)表于 07-29 09:56 ?0次下載
    通過(guò)32Gb/S光纖通道<b class='flag-5'>提高</b><b class='flag-5'>應(yīng)用程序性能</b>

    第6代光纖通道:加速全閃存數(shù)據(jù)中心的數(shù)據(jù)訪問(wèn)和應(yīng)用程序性能

    電子發(fā)燒友網(wǎng)站提供《第6代光纖通道:加速全閃存數(shù)據(jù)中心的數(shù)據(jù)訪問(wèn)和應(yīng)用程序性能.pdf》資料免費(fèi)下載
    發(fā)表于 08-29 11:52 ?0次下載
    第6代光纖通道:加速全閃存數(shù)據(jù)中心的數(shù)據(jù)訪問(wèn)和<b class='flag-5'>應(yīng)用程序性能</b>

    使用Brocade Gen 7 SAN確保應(yīng)用程序性能和可靠性

    電子發(fā)燒友網(wǎng)站提供《使用Brocade Gen 7 SAN確保應(yīng)用程序性能和可靠性.pdf》資料免費(fèi)下載
    發(fā)表于 09-01 10:51 ?0次下載
    使用Brocade Gen 7 SAN確保<b class='flag-5'>應(yīng)用程序性能</b>和可靠性

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢?

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢? PGO,全稱(chēng)為Profile Guided Optimization,譯為“基于特征優(yōu)化”的技術(shù),是一種通過(guò)利用應(yīng)用程序的運(yùn)行特征數(shù)據(jù)來(lái)優(yōu)化
    的頭像 發(fā)表于 10-26 17:37 ?1881次閱讀