作為 CUDA 開發人員,您通常需要控制應用程序使用的設備。克里斯·梅森在 Accelerware 博客上發表了一篇簡短但很貼心的帖子,他寫道:
您的 CUDA 應用程序需要針對特定的 GPU 嗎?如果您正在編寫啟用 GPU 的代碼,您通常會使用設備查詢來選擇所需的 GPUs 。然而,一個快速而簡單的測試解決方案是使用環境變量
CUDA_VISIBLE_DEVICES
來限制 CUDA 應用程序看到的設備。如果您試圖共享節點上的資源,或者希望啟用 GPU 的可執行文件以特定的 GPU 為目標,那么這將非常有用
正如 Chris 指出的,健壯的應用程序應該使用 CUDA API 在運行時枚舉和選擇具有適當功能的設備。要了解如何操作,請閱讀 CUDA 編程指南中的 設備標識 部分。但是 CUDA_VISIBLE_DEVICES
環境變量可以方便地將執行限制到特定設備或設備集,以便進行調試和測試。您還可以使用它來控制沒有源代碼的應用程序的執行,或者在一臺機器上啟動一個程序的多個實例,每個實例都有自己的環境和一組可見的設備。
要使用它,請將 CUDA_VISIBLE_DEVICES
設置為逗號分隔的設備 ID 列表,以使應用程序只看到這些設備。請注意,您可以使用此技術來屏蔽設備或更改設備的可見性順序,以便 CUDA 運行時按特定順序枚舉它們。
在我們即將發布的帶有統一內存的 CUDA 6 版本中, CUDA_VISIBLE_DEVICES
是有用的(參見我的 統一內存上的帖子 )。統一內存允許多個 GPUs 和 CPU 共享一個托管內存空間。 GPUs 之間的統一內存要求 GPUs 全部支持 對等內存訪問 ,但在某些系統中,這種情況并非如此, GPUs 是不同型號的,或者它們連接到 PCI express 總線上的不同 I / O 控制器集線器。如果 GPUs 不是所有 P2P 兼容的,那么使用 cudaMallocManaged()
的分配將返回到 設備映射主機內存 (也稱為“零拷貝”內存)。通過 PCI express 訪問此內存,并且具有更低的帶寬和更高的延遲。為了避免這種回退,您可以使用 CUDA_VISIBLE_DEVICES
限制應用程序在單個設備或一組與 P2P 兼容的設備上運行。
?