簡體   English   中英

CUDA主機-設備同步

[英]CUDA HOST - DEVICE synchrony

我已經在CUDA上工作了一段時間,並對同步有疑問。 考慮我有以下代碼。 我在main中以兩種不同的樣式調用同一內核。 我知道,第一次,內核將被觸發,並且控制權立即返回到主機,並顯示“ gpu調用”。 從函數觸發內核呢? 內核調用之后,控件將立即返回主機還是等待內核完成然后返回主機?

換句話說,如果我只想在內核執行后才打印“ gpu調用”,那么在這種情況下,從函數調用內核是否可以避免使用流和cudastreamsynchronize()?

int initializedevvar(bool *s1, bool *s2, bool *s3, bool *s4){
initialize<<<1,1>>>(state1, state2, state3, state4);
return 0;
}
    __global__ void initialize(bool* Mcheckin, bool *Mcheckout, bool 
 *Scheckin, bool *Scheckout){
            Mcheckin[0] = true;
            Mcheckout[0] = true;
            Scheckin[0] = false;
            Scheckout[0] = false;
        }
void main(){
    bool *state1, *state2, *state3, *state4;

               cudaMalloc(&state1, sizeof(bool));
    cudaMalloc(&state2, sizeof(bool));
    cudaMalloc(&state3, sizeof(bool));
    cudaMalloc(&state4, sizeof(bool));
    initialize<<<1,1>>>(state1, state2, state3, state4);
    std::cout<<"gpu call"<<endl;
    ...
    ...
    auto dummy = initializedevvar(state1, state2, state3, state4);
    std::cout<<"gpu call"<<endl;
    cudaFree(state1);
    cudaFree(state2);
    cudaFree(state3);
    cudaFree(state4);}

內核啟動是異步的,無論它是從main調用還是從另一個函數調用。 在內核開始執行之前,控制權立即返回給宿主線程,並且宿主線程將在內核啟動后繼續執行任何宿主代碼。

您的兩種情況的行為應完全相同。

您不能使用函數調用啟動來“規避”使用同步函數(流或其他方法)。 如果只希望在內核完成后打印“ gpu調用”,則在print語句之前需要某種同步功能。

看起來這應該很容易測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM