2016-03-15 126 views
2
#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 
#include <stdio.h> 
__global__ void funct(void){ 
     printf("Hello from GPU!\n"); 
} 

int main(void){ 
     funct << < 2, 4 >> >(); 

for (int i = 0; i < 10; i++){ 
    cudaDeviceReset(); 
    //cudaDeviceSynchronize(); 
    printf("Hello, World from CPU!\n"); 

    } 
return 0; 
} 

我以爲cudaDeviceReset的作用是cudamemcpy。這種情況我們沒有編號的結果。所以我們無法使用cudamemcpy。但我們使用cudaDeviceReset來返回四個「來自GPU的Hello!」來自內核。cuda中的cudaDeviceReset()有什麼作用

是嗎?

和我取代cudaDeviceRest()與cudaDeviceSynchronize()。我看到了同樣的結果。但我不知道它們之間的區別。

回答

4

cudaDeviceReset()的作用是記錄here

它用於破壞CUDA context,這意味着所有設備分配將被刪除。

我同意,它似乎有一個同步的效果。但是,由於文檔狀態:

請注意,此功能將立即重置設備。

我相信它是不安全的依賴於這種行爲。此外,該文檔還呼籲在多線程應用程序中使用此功能的危險。因此,安全編碼將決定:

  1. 使用設備同步的(如cudaDeviceSynchronize(),或cudaMemcpy()等)

  2. 檢索數據的任何應用程序想保留可能在設備分配,或者最近運行的內核可能已更新(在設備內存中)。

  3. 確保任何主機線程也可能有與之相關聯的設備的活動,也終止

  4. 確保可以在他們的析構函數有設備活動的任何C++對象正確銷燬或失-Scope

  5. 呼叫cudaDeviceReset()爲應用程序停機的一部分。

請注意,調用cudaDeviceReset()作爲應用程序關閉的一部分不應被視爲強制性的。沒有這樣一個習慣用法,許多應用程序都能正常工作。