2013-08-19 156 views
1

什麼是運行時API函數cudaSetDevice的CUDA驅動程序的API等效項?cudaSetDevice等效的CUDA驅動程序API

我正在查看驅動程序API並找不到等效函數。我所能做的就是

cuDeviceGet(&cuDevice, device_no); 
cuCtxCreate(&cuContext, 0, cuDevice); 

這是不是因爲旁邊設置也帶來了上下文中的設備等同。運行時API cudaSetDevice本身不會創建上下文。在運行時API中,CUDA上下文是通過第一個需要設備狀態的CUDA調用隱式創建的。

此問題的背景:CUDA感知的MPI(MVAPICH2 1.8/9)初始化需要在調用MPI_init之前設置CUDA設備。使用CUDA運行時API這可以用

cudaSetDevice(device_no); 
MPI_init(); 

但是做,我不希望使用的呼叫,因爲我的應用程序的其餘CUDA運行時純粹使用驅動程序API,我想避免鏈接到運行時。

在MPI初始化之前,創建上下文時出現了什麼問題?原則上沒有。只是想知道在驅動程序API中是否有相同的調用。

+0

再次思考。我認爲沒有相應的調用,因爲在驅動程序API中沒有設置設備。相反,它是我發佈的:一個創建一個設備的句柄,並創建一個上下文(隱式設置設備)。有了這個MVAPICH2很開心。 – ritter

+0

換言之:使用驅動程序API時,必須在使用支持CUDA的MPI時創建上下文。 – ritter

+0

在運行時API中,從CUDA 4.0開始,'cudaSetDevice' *會*創建一個上下文,如果這個上下文尚未存在於相關設備上。 – talonmies

回答

3

你可以找到在節目指南的附錄H中這方面的信息,但短期的版本是這樣的:

  • cuCtxCreate充當第一cudaSetDevice調用(即它創建的驅動程序上下文上下文堆棧)
  • cuCtxPushCurrent()cuCtxPopCurrent()對(或cuCtxSetCurrent取決於哪個API版本您正在使用)用作任何後續cudaSetDevice呼叫(即它推動或選擇一個以前創建的上下文對於所有後續的A中的活性上下文PI調用,直到上下文從驅動程序上下文堆棧彈出或取消選擇)
+1

不要忘記自cuda 4.x以來取代cuCtxPush/PopCurrent的cuCtxSetCurrent()(不知道確切的版本)。它也更接近cudaSetDevice(),除了它將上下文作爲參數而不是deviceID,並且不會在首次調用時創建新的上下文。 – kunzmi

+0

你說得對。 'cudaSetDevice'創建一個上下文。我通過查看分配給進程的虛擬內存量來檢查這一點。 – ritter

+0

爲什麼然後才能做到這一點:'cudaSetDevice(0); cudaMalloc(PTR,16); 2 GPU機器上的cudaSetDevice(1)'? (所有的命令都沒有返回錯誤;選中) – ritter

相關問題