簡體   English   中英

我是否需要在 CUDA 中跨多個 GPU 鏡像輸入緩沖區/紋理?

[英]Do I need to mirror input buffers/textures across multiple GPUs in CUDA?

TL;DR:在使用 CUDA 進行多 GPU 編程時,我是否需要在多個設備上鏡像只讀查找紋理和輸入緩沖區(無論是嚴格要求還是為了最佳性能)?

我有一個 GPU 內核,它接收用於查找的兩個紋理和用於輸入數據的兩個(較小的)緩沖區。

我已經擴展了我的代碼以允許使用多個 GPU(我們的系統最多有 8 個,但為了測試我在一個只使用 2 個的較小的開發系統上)。 我們的系統使用 NVLINK 並且我們啟用了 UVA。

我的設置涉及使設備 0 成為一種“主”或“根”設備,其中存儲最終結果並進行最終串行(串行,僅在一個 GPU 上可執行)操作發生。 所有設備都設置為允許對 dev 0 的對等訪問。內核在每個設備上以以下形式的循環多次調用:

for(unsigned int f = 0; f < maxIterations; f++)
{
    unsigned int devNum = f % maxDevices; //maxIterations >> maxDevices
    cudaSetDevice(devNum);
    cudaDeviceSynchronize(); //Is this really needed?
    executeKernel<<<>>>(workBuffers[devNum], luTex1, luTex2, inputBufferA, inputBufferB);
    cudaMemcpyAsync(&bigGiantBufferOnDev0[f * bufferStride],
                     workBuffers[devNum],
                     sizeof(float) * bufferStride,
                     cudaMemcpyDeviceToDevice);
}

可以看出,每個設備都有自己的“工作緩沖區”,用於寫出中間結果,然后將這些結果存儲到設備 0。

工作(輸出)緩沖區的大小比輸入緩沖區大幾個數量級,我注意到當我犯了一個錯誤並跨設備訪問緩沖區時,性能受到了重大影響(大概是因為內核正在訪問另一個設備)。 然而,在修復輸出緩沖區問題后,我還沒有注意到只讀輸入緩沖區的類似問題。

這讓我想到了我的問題:我是否真的需要跨設備鏡像這些輸入緩沖區和紋理,或者是否有緩存機制使這變得不必要? 為什么我在跨設備訪問工作緩沖區時會注意到如此巨大的性能下降,但似乎不會對輸入緩沖區/紋理造成這樣的損失?

如果您啟用了對等訪問,則可以“遠程”進行紋理以及普通的全局數據訪問。 由於此類訪問是通過 NVLink(或具有對等功能的結構)進行的,因此它通常會更慢。

對於“小”輸入緩沖區,GPU 緩存機制可能傾向於減少或減輕與遠程訪問相關的懲罰。 GPU 有專門的只讀緩存,旨在幫助處理只讀/輸入數據,當然紋理機制也有自己的緩存。 除非使用實際代碼進行實際分析,否則無法進行詳細的性能陳述。

如果使用 > Pascal 級別的 GPU,它們具有統一的內存。 您不需要數據遷移。

當在 CPU 或 GPU 上運行的代碼訪問以這種方式分配的數據(通常稱為 CUDA 管理數據)時,CUDA 系統軟件和/或硬件負責將內存頁面遷移到訪問處理器的內存。

https://devblogs.nvidia.com/unified-memory-cuda-beginners/

如果你使用老派的方式來分配緩沖區(cuMalloc),我認為你確實需要鏡像數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM