一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

構(gòu)造具有動態(tài)參數(shù)的CUDA圖表

星星科技指導(dǎo)員 ? 來源:NVIDIA ? 作者:Tu Jiqun ? 2022-10-11 09:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

自從CUDA Graphs在CUDA 10中引入以來,CUDA Graph已經(jīng)用于各種應(yīng)用中。圖形將一組CUDA內(nèi)核和其他CUDA操作組合在一起,并使用指定的依賴關(guān)系樹執(zhí)行它們。它通過結(jié)合與CUDA內(nèi)核啟動和CUDA API調(diào)用相關(guān)的驅(qū)動程序活動來加快工作流。它還通過硬件加速強制實施依賴關(guān)系,而不是在可能的情況下僅依賴CUDA流和事件。

構(gòu)造CUDA圖有兩種主要方法:顯式API調(diào)用和流捕獲。

使用顯式API調(diào)用構(gòu)造CUDA圖

通過這種構(gòu)建CUDA圖的方法,由CUDA內(nèi)核和CUDA內(nèi)存操作形成的圖節(jié)點通過調(diào)用cudaGraphAdd*節(jié)點API添加到圖中,其中*被替換為節(jié)點類型。節(jié)點之間的依賴關(guān)系是用API顯式設(shè)置的。

使用顯式API構(gòu)建CUDA圖的好處是,cudaGraphAdd*Node API返回節(jié)點句柄(cudaGraph Node_t),可以用作未來節(jié)點更新的引用。例如,可以使用cudaGraphExecKernelNodeSetParams以最低成本更新實例化圖中內(nèi)核節(jié)點的內(nèi)核啟動配置和內(nèi)核函數(shù)參數(shù)。

缺點是,在使用CUDA圖加速現(xiàn)有代碼的場景中,使用顯式API調(diào)用構(gòu)造CUDA圖通常需要大量代碼更改,尤其是有關(guān)代碼的控制流和函數(shù)調(diào)用結(jié)構(gòu)的更改。

使用流捕獲構(gòu)建CUDA圖

通過這種構(gòu)建CUDA圖的方法,cudaStreamBeginCapture和cudaStream EndCapture被放置在代碼塊的前后。代碼塊啟動的所有設(shè)備活動都會被記錄、捕獲并分組到CUDA圖中。節(jié)點之間的依賴關(guān)系是從流捕獲區(qū)域內(nèi)的CUDA流或事件API調(diào)用中推斷出來的。

使用流捕獲構(gòu)建CUDA圖的好處是,對于現(xiàn)有代碼,需要的代碼更改更少。原始代碼結(jié)構(gòu)可以基本保持不變,圖形構(gòu)造是以自動方式執(zhí)行的。

這種構(gòu)建CUDA圖的方法也有缺點。在流捕獲區(qū)域內(nèi),所有內(nèi)核啟動配置和內(nèi)核函數(shù)參數(shù)以及CUDA API調(diào)用參數(shù)都按值記錄。每當(dāng)任何配置和參數(shù)發(fā)生更改時,捕獲的然后實例化的圖形就會過期。

在《在動態(tài)環(huán)境中使用CUDA圖》一文中提供了兩種解決方案:

重新捕獲工作流。當(dāng)重新捕獲的圖與實例化的圖具有相同的節(jié)點拓?fù)鋾r,不需要重新實例化,并且可以使用cudaGraphExecUpdate執(zhí)行整個圖更新。

以配置和參數(shù)集作為鍵緩存CUDA圖。每組配置和參數(shù)都與緩存中的不同CUDA圖相關(guān)聯(lián)。在運行工作流時,配置和參數(shù)集首先被抽象為一個鍵。然后在緩存中找到相應(yīng)的圖(如果它已經(jīng)存在)并啟動。

然而,在某些工作流中,兩種解決方案都不能很好地工作。重新捕獲然后更新方法在紙面上很有效,但在某些情況下,重新捕獲和更新本身的成本很高。也有一些情況下,無法將每組參數(shù)與CUDA圖相關(guān)聯(lián)。例如,具有浮點數(shù)字參數(shù)的情況很難緩存,因為可能存在大量的浮點數(shù)字。

用顯式API構(gòu)造的CUDA圖很容易更新,但這種方法可能過于繁瑣,靈活性較差。CUDA圖可以通過流捕獲靈活地構(gòu)造,但生成的圖很難更新,而且更新成本很高。

綜合方法

在本文中,我提供了一種使用顯式API和流捕獲方法構(gòu)建CUDA圖的方法,從而實現(xiàn)兩者的優(yōu)點,避免兩者的缺點。

例如,在順序啟動三個內(nèi)核的工作流中,前兩個內(nèi)核具有靜態(tài)啟動配置和參數(shù),而最后一個內(nèi)核具有動態(tài)啟動配置和屬性。

使用流捕獲來記錄前兩個內(nèi)核的啟動,并調(diào)用顯式API將最后一個內(nèi)核節(jié)點添加到捕獲圖中。然后,顯式API返回的節(jié)點句柄用于在每次啟動圖之前用動態(tài)配置和參數(shù)更新實例化圖。

下面的代碼示例說明了這個想法:

cudaStream_t stream;
std::vector _node_list;
cudaGraphExec_t _graph_exec;

if (not using_graph) {
  
  first_static_kernel<<<1, 1, 0, stream>>>(static_parameters);
  second_static_kernel<<<1, 1, 0, stream>>>(static_parameters);
  dynamic_kernel<<<1, 1, 0, stream>>>(dynamic_parameters);

} else {

  if (capturing_graph) {

    cudaStreamBeginCapture(stream, cudaStreamCaptureModeGlobal);

    first_static_kernel<<<1, 1, 0, stream>>>(static_parameters);
    second_static_kernel<<<1, 1, 0, stream>>>(static_parameters);

    // Get the current stream capturing graph
    cudaGraph_t _capturing_graph;
    cudaStreamCaptureStatus _capture_status;
    const cudaGraphNode_t *_deps;
    size_t _dep_count;
    cudaStreamGetCaptureInfo_v2(stream, &_capture_status, nullptr &_capturing_graph, &_deps, &_dep_count);

    // Manually add a new kernel node
    cudaGraphNode_t new_node;
    cudakernelNodeParams _dynamic_params_cuda;
    cudaGraphAddKernelNode(&new_node, _capturing_graph, _deps, _dep_count, &_dynamic_params_cuda);
    // ... and store the new node for future references
    _node_list.push_back(new_node);

    // Update the stream dependencies
    cudaStreamUpdateCaptureDependencies(stream, &new_node, 1, 1); 

    // End the capture and instantiate the graph
    cudaGraph_t _captured_graph;
    cudaStreamEndCapture(stream, &_captured_graph);

    cudaGraphInstantiate(&_graph_exec, _captured_graph, nullptr, nullptr, 0);

  } else if (updating_graph) {
    cudakernelNodeParams _dynamic_params_updated_cuda;
  
    cudaGraphExecKernelNodeSetParams(_graph_exec, _node_list[0], &_dynamic_params_updated_cuda);

  }
}

在此示例中,cudaStreamGetCaptureInfo_v2提取當(dāng)前正在記錄并捕獲到的CUDA圖形。在調(diào)用cudaStreamUpdateCaptureDependencies更新當(dāng)前捕獲流的依賴項樹之前,會將一個內(nèi)核節(jié)點添加到此圖中,并返回和存儲節(jié)點句柄(new_node)。最后一步是必要的,以確保隨后捕獲的任何其他活動都在這些手動添加的節(jié)點上正確設(shè)置了它們的依賴項。

使用這種方法,即使參數(shù)是動態(tài)的,也可以通過輕量級的cudaGraphExecKernelNodeSetParams調(diào)用直接重用相同的實例化圖(cudaGraph Exec_t對象)。本文中的第一張圖片顯示了這種用法。

此外,捕獲和更新代碼路徑可以組合成一段代碼,與啟動最后兩個內(nèi)核的原始代碼相鄰。這會造成最少的代碼更改,并且不會破壞原始的控制流和函數(shù)調(diào)用結(jié)構(gòu)。

新方法在帶有動態(tài)參數(shù)的蜂樹/cuda圖獨立代碼示例中詳細(xì)顯示。cudaStreamGetCaptureInfo_v2和cudaStream UpdateCaptureDependencies是CUDA 11.3中引入的新CUDA運行時API。

績效結(jié)果

使用帶有動態(tài)參數(shù)的蜂巢樹/cuda圖獨立代碼示例,我用三種不同的方法測量了運行受內(nèi)核啟動開銷約束的相同動態(tài)工作流的性能:

在沒有CUDA圖形加速的情況下運行

使用重新捕獲然后更新方法運行CUDA圖

使用本文介紹的組合方法運行CUDA圖

表1顯示了結(jié)果。本文中提到的方法的提速很大程度上取決于底層工作流。

結(jié)論

在本文中,我介紹了一種結(jié)合顯式API和流捕獲方法構(gòu)建CUDA圖的方法。它提供了一種以最低成本為具有動態(tài)參數(shù)的工作流重用實例化圖的方法。

關(guān)于作者

Tu Jiqun在加入NVIDIA擔(dān)任高級計算機開發(fā)技術(shù)工程師之前,曾獲得哥倫比亞大學(xué)晶格QCD物理學(xué)博士學(xué)位。在NVIDIA,他致力于在最新的NVIDIAGPU上使用最新的硬件和軟件功能,以加速廣泛的HPC應(yīng)用程序。

審核編輯:郭婷

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

    關(guān)注

    14

    文章

    5309

    瀏覽量

    106413
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1620

    瀏覽量

    64049
  • CUDA
    +關(guān)注

    關(guān)注

    0

    文章

    123

    瀏覽量

    14125
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

    具有許多小 CUDA 內(nèi)核的應(yīng)用程序通??梢允褂?CUDA 圖進(jìn)行加速,即使內(nèi)核啟動模式在整個應(yīng)用程序中發(fā)生變化。鑒于這種動態(tài)環(huán)境,最佳方法取決于應(yīng)用程序的具體情況。希望您能發(fā)現(xiàn)本文中
    的頭像 發(fā)表于 04-01 16:39 ?4138次閱讀
    在<b class='flag-5'>動態(tài)</b>環(huán)境中使用<b class='flag-5'>CUDA</b>圖提高實際應(yīng)用程序性能

    轎車參數(shù)化分析模型的構(gòu)造研究及應(yīng)用

    轎車參數(shù)化分析模型的構(gòu)造研究及應(yīng)用概念設(shè)計階段是車身結(jié)構(gòu)設(shè)計中保證性能的重要階段這個階段留下的缺陷往往很難在后續(xù)的設(shè)計中彌補因而在車身開發(fā)中受到廣泛重視目前國內(nèi)外在這方面都展開了詳細(xì)的研究尤其是國外
    發(fā)表于 04-16 13:40

    CUDA/OpenCL支持

    是否有關(guān)于GRID vGPU的CUDA / OpenCL支持的更新信息?以上來自于谷歌翻譯以下為原文Is there any updated information about CUDA/OpenCL support for GRID vGPU ?
    發(fā)表于 09-07 16:42

    Grid K2 cuda下載位置是?

    我們有一個使用Grid K2機器的系統(tǒng)。我試圖在一個vm的側(cè)面設(shè)置cuda。當(dāng)我使用驅(qū)動程序下載頁面時,它指向NVIDIA-Linux-x86_64-367.57版本的驅(qū)動程序似乎工作(它們安裝
    發(fā)表于 10-10 17:02

    CUDA編程教程

    Nvidia CUDA 2.0編程教程
    發(fā)表于 03-05 07:30

    安裝cuda-9.0的過程

    [cuda] Linux系統(tǒng)多版本cuda環(huán)境下的cuda-90安裝
    發(fā)表于 06-19 17:04

    LInux安裝cuda sdk

    1.安裝toolkit(1)cd /home/CUDA_train/software/cuda4.1(2)./cudatoolkit_4.1.28_linux_64_rhel6.x.run
    發(fā)表于 07-24 06:11

    CUDA教程之Linux系統(tǒng)下CUDA安裝教程

    CUDA教程之1:Linux系統(tǒng)下CUDA安裝教程
    發(fā)表于 06-02 16:53

    什么是CUDA?

    在大家開始深度學(xué)習(xí)時,幾乎所有的入門教程都會提到CUDA這個詞。那么什么是CUDA?她和我們進(jìn)行深度學(xué)習(xí)的環(huán)境部署等有什么關(guān)系?通過查閱資料,我整理了這份簡潔版CUDA入門文檔,希望能幫助大家用最快
    發(fā)表于 07-26 06:28

    什么是CUDA?

    什么是CUDA?
    發(fā)表于 09-28 07:37

    cuda程序設(shè)計

      •GPGPU及CUDA介紹   •CUDA編程模型   •多線程及存儲器硬件
    發(fā)表于 11-12 16:12 ?0次下載

    帶形狀參數(shù)的曲線曲面的構(gòu)造

    為了更加方便地表示和修改曲線曲面,提出了帶形狀參數(shù)的四次三角Bezier曲線曲面QTBezier的構(gòu)造方法和應(yīng)用。首先仿照Bezier曲線性質(zhì),構(gòu)造了帶形狀參數(shù)的基函數(shù),定義了帶形狀
    發(fā)表于 12-05 18:09 ?0次下載

    基于車輛動態(tài)信息的路由構(gòu)造及篩選策略

    引入車輛動態(tài)參數(shù)作為構(gòu)造依據(jù)并結(jié)合鏈路有效時間( LET. link expiration time)進(jìn)行路徑篩選,提高了轉(zhuǎn)發(fā)路徑的穩(wěn)定性及可靠性;仿真表
    發(fā)表于 01-21 11:13 ?0次下載
    基于車輛<b class='flag-5'>動態(tài)</b>信息的路由<b class='flag-5'>構(gòu)造</b>及篩選策略

    CUDA簡介: CUDA編程模型概述

    CUDA 編程模型中,線程是進(jìn)行計算或內(nèi)存操作的最低抽象級別。 從基于 NVIDIA Ampere GPU 架構(gòu)的設(shè)備開始,CUDA 編程模型通過異步編程模型為內(nèi)存操作提供加速。 異步編程模型定義了與 CUDA 線程相關(guān)的異
    的頭像 發(fā)表于 04-20 17:16 ?3371次閱讀
    <b class='flag-5'>CUDA</b>簡介: <b class='flag-5'>CUDA</b>編程模型概述

    支持動態(tài)并行的CUDA擴展功能和最佳應(yīng)用實踐

      本文檔描述了支持動態(tài)并行的 CUDA 的擴展功能,包括為利用這些功能而對 CUDA 編程模型進(jìn)行必要的修改和添加,以及利用此附加功能的指南和最佳實踐。
    的頭像 發(fā)表于 04-28 09:31 ?1642次閱讀
    支持<b class='flag-5'>動態(tài)</b>并行的<b class='flag-5'>CUDA</b>擴展功能和最佳應(yīng)用實踐