[英]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.