色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

星星科技指導員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-04-21 15:32 ? 次閱讀

在 本系列的第 1 部分 中,我們引入了新的 API 函數(shù) cudaMallocAsync 和 cudaFreeAsync ,它們使內(nèi)存分配和釋放成為流順序操作。在這篇文章中,我們通過分享一些大數(shù)據(jù)基準測試結果來強調(diào)這一新功能的好處,并為修改現(xiàn)有應用程序提供代碼 MIG 定量指南。我們還介紹了在多 GPU 訪問和 IPC 使用環(huán)境中利用流順序內(nèi)存分配的高級主題。這一切都有助于提高現(xiàn)有應用程序的性能。

GPU 大數(shù)據(jù)基準

為了衡量新的流式有序分配器在實際應用程序中的性能影響,以下是來自 RAPIDS GPU 大數(shù)據(jù)基準 ( GPU -bdb]的結果。 GPU -bdb 是 30 個查詢的基準,這些查詢以各種比例因子表示現(xiàn)實世界的數(shù)據(jù)科學和機器學習工作流: SF1000 是 1 TB 的數(shù)據(jù), SF10000 是 10 TB 的數(shù)據(jù)。事實上,每個查詢都是一個模型工作流,可以包括 SQL 、用戶定義函數(shù)、仔細的子集和聚合以及機器學習。

圖 1 顯示了在 SF1000 上在 NVIDIA DGX-2 上跨 16 個 V100 GPU 執(zhí)行的 gpu-bdb 查詢子集的 cudaMallocAsync 與 cudaMalloc 的性能比較。如您所見,由于內(nèi)存重用和消除無關同步,使用 cudaMallocAsync 時端到端性能提高了 2-5 倍。

poYBAGJhCJSAFU4BAACSAgst1mI609.png

圖 1 加速 cudaMallocAsync 結束 cudaMalloc 對于 RAPIDS GPU 大數(shù)據(jù)基準的各種查詢 。

與 CUDA Malloc 和 CUDA Free 的互操作性

應用程序可以使用 cudaFreeAsync 釋放 cudaMalloc 分配的指針。在下一次同步傳遞到 cudaFreeAsync 的流之前,不會釋放基礎內(nèi)存。

cudaMalloc(&ptr, size);
kernel<<<..., stream>>>(ptr);
cudaFreeAsync(ptr, stream);
cudaStreamSynchronize(stream); // The memory for ptr is freed at this point 

類似地,應用程序可以使用 cudaFree 釋放使用 cudaMallocAsync 分配的內(nèi)存。但是,在這種情況下, cudaFree 不會隱式同步,因此應用程序必須插入適當?shù)耐剑源_保對要釋放的內(nèi)存的所有訪問都已完成。任何有意或無意依賴 cudaFree 的隱式同步行為的應用程序代碼都必須更新。

cudaMallocAsync(&ptr, size, stream);
kernel<<<..., stream>>>(ptr);
cudaStreamSynchronize(stream); // Must synchronize first
cudaFree(ptr);

多 – GPU 訪問

默認情況下,可以從與指定流關聯(lián)的設備訪問使用 cudaMallocAsync 分配的內(nèi)存。從任何其他設備訪問內(nèi)存需要啟用從該其他設備訪問整個池。正如 cudaDeviceCanAccessPeer 所報告的,它還要求這兩個設備具有對等功能。與 cudaMalloc 分配不同, cudaDeviceEnablePeerAccess 和 cudaDeviceDisablePeerAccess 對從內(nèi)存池分配的內(nèi)存沒有影響。

例如,考慮啟用設備 4Access 到設備 3 的內(nèi)存池:

cudaMemPool_t mempool;
cudaDeviceGetDefaultMemPool(&mempool, 3);
cudaMemAccessDesc desc = {};
desc.location.type = cudaMemLocationTypeDevice;
desc.location.id = 4;
desc.flags = cudaMemAccessFlagsProtReadWrite;
cudaMemPoolSetAccess(mempool, &desc, 1 /* numDescs */); 

調(diào)用 cudaMemPoolSetAccess 時,可以使用 cudaMemAccessFlagsProtNone 撤銷對內(nèi)存池所在設備以外的設備的訪問。無法撤消對內(nèi)存池自身設備的訪問。

進程間通信支持

使用與設備關聯(lián)的默認內(nèi)存池分配的內(nèi)存不能與其他進程共享。應用程序必須顯式創(chuàng)建自己的內(nèi)存池,以便與其他進程共享使用 cudaMallocAsync 分配的內(nèi)存。以下代碼示例顯示如何創(chuàng)建具有進程間通信( IPC )功能的顯式內(nèi)存池:

cudaMemPool_t exportPool;
cudaMemPoolProps poolProps = {};
poolProps.allocType = cudaMemAllocationTypePinned;
poolProps.handleTypes = cudaMemHandleTypePosixFileDescriptor;
poolProps.location.type = cudaMemLocationTypeDevice;
poolProps.location.id = deviceId;
cudaMemPoolCreate(&exportPool, &poolProps); 

位置類型設備和位置 ID deviceId 指示必須在特定 GPU 上分配池內(nèi)存。分配類型 pinted 表示內(nèi)存應該是 non-migratable ,也稱為不可分頁。句柄類型 PosixFileDescriptor 表示用戶打算查詢池的文件描述符,以便與其他進程共享。

通過 IPC 共享此池中的內(nèi)存的第一步是查詢表示該池的文件描述符:

int fd;
cudaMemAllocationHandleType handleType = cudaMemHandleTypePosixFileDescriptor;
cudaMemPoolExportToShareableHandle(&fd, exportPool, handleType, 0); 

然后,應用程序可以與另一個進程共享文件描述符,例如通過 UNIX 域套接字。然后,另一個進程可以導入文件描述符并獲得進程本地池句柄:

cudaMemPool_t importPool;
cudaMemAllocationHandleType handleType = cudaMemHandleTypePosixFileDescriptor;
cudaMemPoolImportFromShareableHandle(&importPool, &fd, handleType, 0); 

下一步是導出過程從池中分配內(nèi)存:

cudaMallocFromPoolAsync(&ptr, size, exportPool, stream); 

cudaMallocAsync還有一個重載版本,它采用與cudaMallocFromPoolAsync相同的參數(shù)

cudaMallocAsync(&ptr, size, exportPool, stream); 

通過這兩個 API 中的任何一個從該池分配內(nèi)存后,指針就可以與導入進程共享。首先,導出過程獲得一個表示內(nèi)存分配的不透明句柄:

cudaMemPoolPtrExportData data;
cudaMemPoolExportPointer(&data, ptr); 

然后,可以通過任何標準 IPC 機制(例如通過共享內(nèi)存、管道等)與導入進程共享此不透明數(shù)據(jù)。導入進程然后將不透明數(shù)據(jù)轉(zhuǎn)換為進程本地指針:

cudaMemPoolImportPointer(&ptr, importPool, &data); 

現(xiàn)在,兩個進程共享對相同內(nèi)存分配的訪問。在導出過程中釋放內(nèi)存之前,必須先在導入過程中釋放內(nèi)存。這是為了確保在導出過程中,當導入過程仍在訪問以前的共享內(nèi)存分配時,內(nèi)存不會重新用于另一個 cudaMallocAsync 請求,從而可能導致未定義的行為。

現(xiàn)有函數(shù) cudaIpcGetMemHandle 僅適用于通過 cudaMalloc 分配的內(nèi)存,不能用于通過 cudaMallocAsync 分配的任何內(nèi)存,無論該內(nèi)存是否從顯式池分配。

更改設備池

如果應用程序期望大部分時間使用顯式內(nèi)存池,則可以考慮通過 cudaDeviceSetMemPool 將其設置為設備的當前池。這使應用程序可以避免每次必須從池中分配內(nèi)存時都必須指定池參數(shù)。

cudaDeviceSetMemPool(device, pool);
cudaMallocAsync(&ptr, size, stream); // This now allocates from the earlier pool set instead of the device’s default pool. 

這樣做的好處是,使用 cudaMallocAsync 分配的任何其他函數(shù)現(xiàn)在都會自動使用新池作為默認池。可以使用 cudaDeviceGetMemPool 查詢與設備關聯(lián)的當前池。

庫可組合性

通常,庫不應該更改設備的池,因為這樣做會影響整個頂級應用程序。如果庫必須分配具有不同于默認設備池屬性的內(nèi)存,它可以創(chuàng)建自己的池,然后使用 cudaMallocFromPoolAsync 從該池進行分配。該庫還可以使用 cudaMallocAsync 的重載版本,該版本將池作為參數(shù)。

為了使應用程序的互操作更容易,庫應該考慮為頂級應用程序提供 API 以協(xié)調(diào)所使用的池。例如,庫可以提供 set 或 get API ,使應用程序能夠以更明確的方式控制池。庫還可以將池作為單個 API 的參數(shù)。

代碼遷移指南

當將使用 cudaMalloc 或 cudaFree 的現(xiàn)有應用程序移植到新的 cudaMallocAsync 或 cudaFreeAsync API 時,考慮以下準則。

確定適當人才庫的指南:

初始默認池適用于許多應用程序。

今天,顯式構造的池只需要在與 CUDA IPC 的進程之間共享池內(nèi)存。這可能會隨著將來的功能而改變。

為了方便起見,考慮將顯式創(chuàng)建池設置為設備的當前池,以確保進程內(nèi)的所有 cudaMallocAsync 調(diào)用都使用該池。這必須由頂級應用程序而不是庫來完成,以避免與頂級應用程序的目標沖突。

為所有內(nèi)存池設置釋放閾值的準則:

設備的共享和釋放方式取決于:

對單個進程是獨占的 :使用最大釋放閾值。

在合作進程之間共享 :通過 IPC 協(xié)調(diào)使用相同的池,或?qū)⒚總€進程池設置為適當?shù)闹担员苊馊魏我粋€進程獨占所有設備內(nèi)存。

在未知進程之間共享: 如果已知,請將閾值設置為應用程序的工作集大小。否則,在使用非零值之前,請將其保留為零,并使用探查器確定分配性能是否是瓶頸。

用 cudaMallocAsync 替換 cudaMalloc 的指南:

確保所有內(nèi)存訪問都是在流順序分配之后排序的。

如果需要對等訪問,請使用 cudaMemPoolSetAccess ,因為 cudaEnablePeerAccess 和 cudaDisablePeerAccesss 對池內(nèi)存沒有影響。

與 cudaMalloc 分配不同, cudaDeviceReset 不會隱式釋放池內(nèi)存,因此必須顯式釋放。

如果使用 cudaFree 釋放,請確保在釋放之前通過適當?shù)耐酵瓿伤性L問,因為在這種情況下沒有隱式同步。依賴隱式同步的任何后續(xù)代碼也可能需要更新。

如果內(nèi)存通過 IPC 與另一個進程共享,請從顯式創(chuàng)建的支持 IPC 的池中進行分配,并刪除該指針對 cudaIpcGetMemHandle 、 cudaIpcOpenMemHandle 和 cudaIpcCloseMemHandle 的所有引用。

如果該內(nèi)存必須與 GPU 直接 RDMA 一起使用,請暫時繼續(xù)使用 cudaMalloc ,因為通過 cudaMallocAsync 分配的內(nèi)存目前不支持它。 CUDA 打算在將來支持它。

與使用 cudaMalloc 分配的內(nèi)存不同,使用 cudaMallocAsync 分配的內(nèi)存與 CUDA 上下文不關聯(lián)。這有以下影響:

使用屬性 CU_POINTER_ATTRIBUTE_CONTEXT 調(diào)用 cuPointerGetAttribute 會為上下文返回 null 。

當使用至少一個使用 cudaMallocAsync 分配的源或目標指針調(diào)用 cudaMemcpy 時,必須可以從調(diào)用線程的當前上下文/設備訪問該內(nèi)存。如果無法從該上下文或設備訪問,請改用 cudaMemcpyPeer 。

將 cudaFree 替換為 cudaFree 的指南

確保所有內(nèi)存訪問都是在按流排序的釋放之前排序的。

在下一次同步操作之前,可能無法將內(nèi)存釋放回系統(tǒng)。如果釋放閾值設置為非零值,則在顯式修剪相應的池之前,可能無法將內(nèi)存釋放回系統(tǒng)。

與 cudaFree 不同, cudaFreeAsync 不會隱式同步設備。任何依賴此隱式同步的代碼都必須更新為顯式同步。

結論

CUDA 11 。 2 中添加的流式有序分配器以及 cudaMallocAsync 和 cudaFreeAsync API 函數(shù)通過將內(nèi)存分配和釋放作為流式有序操作引入 CUDA 流編程模型,擴展了 CUDA 流編程模型。這使得分配的范圍能夠限定到內(nèi)核,內(nèi)核使用它們,同時避免了傳統(tǒng) cudaMalloc/cudaFree 可能發(fā)生的昂貴的設備范圍同步。

此外,這些 API 函數(shù)在 CUDA 中添加了內(nèi)存池的概念,從而實現(xiàn)了內(nèi)存的重用,從而避免了代價高昂的系統(tǒng)調(diào)用并提高了性能。使用指南 MIG 評估您現(xiàn)有的代碼,并查看您的應用程序性能有多大改進!

關于作者

Vivek Kini 是 NVIDIA 的高級系統(tǒng)軟件工程師。他致力于 CUDA 驅(qū)動程序,特別關注內(nèi)存管理功能。他旨在簡化 CUDA 應用程序的內(nèi)存管理,而不犧牲它們所需的性能。

Jake Hemstad 是一個高級開發(fā)工程師 NVIDIA ,他在開發(fā)高性能 CUDA C ++軟件加速數(shù)據(jù)分析。他同樣關心開發(fā)高質(zhì)量的軟件,正如他實現(xiàn)最佳的 GPU 性能一樣,也是現(xiàn)代 C ++設計的倡導者。在 NVIDIA 之前,他參加了明尼蘇達大學的研究生院,在那里他與桑迪亞國家實驗室在任務并行 HPC 運行時間和稀疏線性求解器上工作。

審核編輯:郭婷

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

    關注

    28

    文章

    4743

    瀏覽量

    129008
  • API
    API
    +關注

    關注

    2

    文章

    1502

    瀏覽量

    62123
  • CUDA
    +關注

    關注

    0

    文章

    121

    瀏覽量

    13641
收藏 人收藏

    評論

    相關推薦

    英邁質(zhì)譜分配器:精準控制,引領質(zhì)譜分析新高度

    分配器采用了先進的流量控制技術,能夠?qū)崿F(xiàn)對流體輸送過程的精確調(diào)控。其創(chuàng)新的設計,確保了流體在分配過程中的穩(wěn)定性和一致性,從而大大提高了質(zhì)譜分析的準確性和可靠性。 對于研究人員和實驗室而言,英邁質(zhì)譜
    的頭像 發(fā)表于 12-26 14:14 ?109次閱讀

    CDCL1810A 1.8V、10 輸出高性能時鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCL1810A 1.8V、10 輸出高性能時鐘分配器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 08-23 10:08 ?0次下載
    CDCL1810A 1.8V、10 輸出高<b class='flag-5'>性能</b>時鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCL1810 1.8V 10路輸出高性能時鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCL1810 1.8V 10路輸出高性能時鐘分配器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 08-22 11:14 ?0次下載
    CDCL1810 1.8V 10路輸出高<b class='flag-5'>性能</b>時鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCE18005高性能時鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCE18005高性能時鐘分配器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 08-21 11:12 ?0次下載
    CDCE18005高<b class='flag-5'>性能</b>時鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCE62005高性能時鐘發(fā)生器和分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCE62005高性能時鐘發(fā)生器和分配器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 08-21 11:12 ?0次下載
    CDCE62005高<b class='flag-5'>性能</b>時鐘發(fā)生器和<b class='flag-5'>分配器</b>數(shù)據(jù)表

    LMK01000高性能時鐘緩沖器、分頻器和分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《LMK01000高性能時鐘緩沖器、分頻器和分配器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 08-21 09:53 ?0次下載
    LMK01000高<b class='flag-5'>性能</b>時鐘緩沖器、分頻器和<b class='flag-5'>分配器</b>數(shù)據(jù)表

    液壓分配器起什么作用的

    液壓分配器是一種用于控制液壓系統(tǒng)中液體流量和壓力的設備。它在許多工業(yè)和工程應用中發(fā)揮著重要作用,例如在液壓升降機、液壓挖掘機、液壓起重機等設備中。以下是液壓分配器的主要功能和原理: 流量控制 :液壓分配器
    的頭像 發(fā)表于 07-10 10:56 ?993次閱讀

    液壓分配器工作原理是什么

    液壓分配器,又稱液壓多路閥,是液壓系統(tǒng)中的關鍵部件之一。它的作用是將液壓泵輸出的油液分配到各個執(zhí)行機構,實現(xiàn)液壓系統(tǒng)的控制和調(diào)節(jié)。 一、液壓分配器的工作原理 液壓分配器的基本組成 液壓
    的頭像 發(fā)表于 07-10 10:55 ?1898次閱讀

    液壓分配器壓力調(diào)整方法有哪些

    液壓分配器,又稱液壓分配器或液壓分流器,是一種用于液壓系統(tǒng)中的設備,主要用于將液壓系統(tǒng)中的壓力油分配到各個執(zhí)行元件,以實現(xiàn)對液壓系統(tǒng)的控制和調(diào)節(jié)。 一、液壓分配器壓力調(diào)整的重要性 液壓
    的頭像 發(fā)表于 07-10 10:53 ?2068次閱讀

    單線分配器與雙線分配器的區(qū)別是什么

    單線分配器與雙線分配器是兩種不同類型的電子設備,它們在通信、廣播、電視等領域中有著廣泛的應用。本文將介紹單線分配器與雙線分配器的區(qū)別。 一、定義 單線
    的頭像 發(fā)表于 07-10 10:44 ?935次閱讀

    四路數(shù)據(jù)分配器的基本概念、工作原理、應用場景及設計方法

    四路數(shù)據(jù)分配器是一種數(shù)字電路元件,它的作用是將一個數(shù)據(jù)輸入信號分配成多個數(shù)據(jù)輸出信號。 1. 四路數(shù)據(jù)分配器的基本概念 四路數(shù)據(jù)分配器是一種多路復用器(Multiplexer),它將一
    的頭像 發(fā)表于 07-10 10:42 ?1761次閱讀

    八路數(shù)據(jù)分配器的基本概念及工作原理

    八路數(shù)據(jù)分配器是一種常見的電子設備,用于將一個輸入信號分配到多個輸出端。在本文中,我們將詳細介紹八路數(shù)據(jù)分配器的基本概念、工作原理、應用場景以及設計方法。 一、八路數(shù)據(jù)分配器的基本概念
    的頭像 發(fā)表于 07-10 10:40 ?2115次閱讀

    Linux內(nèi)核內(nèi)存管理之slab分配器

    本文在行文的過程中,會多次提到cache或緩存的概念。如果沒有特殊在前面添加硬件的限定詞,就說明cache指的是slab分配器使用的軟件緩存的意思。如果添加了硬件限定詞,則指的是處理器的硬件緩存,比如L1-DCache、L1-ICache之類的。
    的頭像 發(fā)表于 02-22 09:25 ?1266次閱讀
    Linux內(nèi)核<b class='flag-5'>內(nèi)存</b>管理之slab<b class='flag-5'>分配器</b>

    Linux內(nèi)核內(nèi)存管理之ZONE內(nèi)存分配器

    內(nèi)核中使用ZONE分配器滿足內(nèi)存分配請求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內(nèi)存大小請求。
    的頭像 發(fā)表于 02-21 09:29 ?913次閱讀

    請問為什么CAN不使用手動引腳分配器來更改引腳?

    了 Pin28 (P2.8) 使用手動引腳分配器,它起作用了, 然后想把 \" sync2 \" 從 Pin25 (P2.15) 改為 Pin1 (P0.1), 但是在手動引腳分配器
    發(fā)表于 01-30 07:24
    主站蜘蛛池模板: 中国jjzz| 日本wwwxx| 最近的中文字幕2019国语| 漂亮的保姆3集电影免费观看中文| 国产毛片女人18水多| 99久久久无码国产精精品| 亚洲AV久久久噜噜噜久久| 人人干人人看| 伦 乱真实故事| 国产曰韩无码亚洲视频| 成人在无码AV在线观看一| 18禁黄久久久AAA片| 亚洲免费网站观看视频| 爱穿丝袜的麻麻3d漫画acg| 亚洲精品午睡沙发系列| 日日噜噜夜夜爽爽| 蜜芽国产在线精品欧美| 九九精品视频一区二区三区| 国产成人精视频在线观看免费| 99久久久久国产精品免费| 一区三区三区不卡| 亚洲精品国产高清不卡在线| 视频三区 国产盗摄| 强奷乱码欧妇女中文字幕熟女| 龙腾亚洲人成电影网站| 久久精品国产欧美| 韩国女主播内部vip自带氏巾| 国产AV一区二区三区传媒| 超碰97免费人妻| SAO货腿张开JI巴CAO死我| 97视频在线观看免费视频| 中文字幕无码亚洲字幕成A人蜜桃 中文字幕无码亚洲视频 | 香艳69xxxxx有声小说| 日韩一区二区三区四区区区 | 97国产蝌蚪视频在线观看| 永久免费无码AV国产网站| 亚洲手机在线人成视频| 亚洲一区免费观看| 亚洲在线视频自拍精品| 一本到道免费线观看| 一二三四在线视频社区8|