2013-07-11 37 views
3

有誰知道cudaSetDevice的下列用法是否正確?我想在任何主機線程中隨時調用在不同設備上創建的資源;有沒有辦法在CUDA中做到這一點?關於Open MP和cudaSetDevice()

cudaSetDevice(0); 
/...create cuda streams and do some memory allocation on gpu.../ 
cudaSetDevice(1); 
/...create cuda streams and do some memory allocation on gpu.../ 
#pragma omp parallel num_threads(2) 
{ 
    int omp_threadID=omp_get_thread_num(); 
    .... 
    if (omp_threadID==0) 
    { 
    cudaSetDevice(0); 
    /...calling streams/memory created on device 0.../ 
    } 
    else 
    { 
    cudaSetDevice(1); 
    /...calling streams/memory created on device 1.../ 
    }; 
    }; 

回答

1

是的,類似的東西應該工作。請確保您在設備0上創建的所有內容僅在OpenMP線程0中使用,同樣也適用於設備1和線程1.

您可能還想看看CUDA OpenMP Sample Code,它演示瞭如何使用OpenMP線程每個管理一個單獨的設備。

+0

謝謝,但你能解釋爲什麼我必須在單個OMP線程中使用它們嗎?我認爲,如果我可以確保OMP線程之間的同步,使得每次只有一個線程調用一個設備(並且在那裏做某些事情),我可以在任何適當的時候自由調用任何線程的cudaSetDevice()來使用cudaSetDevice()。 – user2188453

+0

我指出在你的例子中,你有OMP線程0代碼,它以'cudaSetDevice(0);'開始,所以你應該只使用設備0。同樣,在線程1中,您以'cudaSetDevice(1);'開頭,所以您應該只使用設備1.這與我參考的示例代碼的工作方式一致。 –