2012-07-17 376 views
0

我在多個GPU上實現我的程序... 我的電腦中有兩個GPU,並且想要生成兩個獨立的流來處理這兩個設備。我已經產生兩個流:使用獨立流在多個GPU上同時調用相同的cuda功能

cudaStream_t *streams; 
streams = (cudaStream_t*) malloc(nstreams * sizeof(cudaStream_t)); 
for(int j = 0; j < nstreams; j++){ 
    cudaStreamCreate(&(streams[j])); 
} 

然後我打電話與設備ID內核作爲一個參數,按照SDK中的例子。 根據設備ID,cudaDevice設置(cudaSetDevice(DEV_ID))和內核調用與各自的流通過:

kernel1<<< grid, block,0,streamNo >>>(tex, size);................ 


for (i = 0;i<gpuN;i++){ 
    initialize(i); 
    printf("initialization done with stream %i on device %i\n", (int)streams[i], i); 
    runTest(i); 
    printf("running tests done with %i stream \n", i); 
    deini(i); 
    printf("deinitialization is done\n"); 
} 

我的程序工作正常用兩種不同的數據流,但它運行順序。 我想使用兩個設備同時使用兩個獨立的流來運行功能。任何人都可以幫我解決這個問題嗎?

我與CUDA 4.2工作使用您創建的依賴於上下文您在創建他們二特斯拉2070

回答

2

流,它是非法的在一個比它是其他任何上下文中使用流創建。在CUDA 4.x及更高版本中,使用cudaSetDevice()執行上下文切換。

因此,爲了使這一點,你需要做的是這樣的:

​​3210

這將創建在每個設備的nstreams流列舉[0,..,ndevices-1]。每當在流上執行操作(啓動內核,執行異步memcpy等)時,您必須首先執行cudaSetDevice()至正確的設備上下文。

它實際上聽起來像你可能根本不需要使用流。如果你只有兩個流和兩個設備,你的主內核啓動代碼很可能是簡單的:

for(int i=0; i<2; i++) { 
    cudaSetDevice(i); 
    kernel1<<< grid, block >>>(tex, size); 
} 

沒有實際需要再創建任何流。

+0

感謝您的快速回復..我仍然有同樣的問題。當我運行我的cuda函數runTest(i)(它包含許多內核)時,我將device_ID作爲設備ID傳遞給每個設備,但程序正在運行......但一個接一個地運行一個設備......它需要雙倍的時間作爲單個卡。我沒有太多關於流的想法,我只是遵循SDK示例創建2個不同的流來處理我的兩個GPU設備......基本上我需要我的程序在兩個設備上同時運行......期待您的建議。 – vishva 2012-07-17 16:45:05

+0

什麼API函數在你的'runTest()'例程中使用? – talonmies 2012-07-17 18:12:18

+0

@vishva在啓動內核之後(或在算法中的任何位置?),你是否需要cudaThreadSynchronize()或cuCtxSynchronize()?這將序列化您的程序(即一個設備在另一個之後)。 – 2012-07-17 19:51:12

相關問題