int main()
{
...
initial<<<...>>>();
cudaThreadSynchronize();
for(double t=dt;t<dt*5;t=t+dt)
{
step1<<<grid,block>>>(d_Vx,d_Vy,d_VxT,d_VyT);
cudaThreadSynchronize();
bool tf=1;
step2<<<grid,block>>>(d_rho,d_VxT,d_VyT);
cudaThreadSynchronize();
for(int step=0;step<4000;step=step+1)
{
if(tf)
{poisson<<<grid,block>>>(d_p,d_pT,d_rho);}
else
{poisson<<<grid,block>>>(d_pT,d_p,d_rho);}
tf= !(tf);
/*host coda*/
}
cudaThreadSynchronize();
step3<<<grid,block>>>(d_Vx,d_Vy,d_VxT,d_VyT,d_p);
cudaThreadSynchronize();
}
...
return 0;
}
我的觀念可能不太清楚,想要請教一下同步的事情。
以上是我的程式碼,大概就是先配置好變數後其他事情通通都在GPU上運作
我看visual profiler中kernel的運行是依照順序進行的,而kernel的呼叫是早於運行(不加同步的話)
所以呼叫的時間被執行時給隱藏,即使我的每一步的資料有相依性,但因為kernel式串行運作所以保障資料同步
但如果我要加入host在kernel間且資料是要kernel算完的話,則需要先同步等待GPU算完,
然後再要求GPU等待直到CPU算完把資料丟回去
如此才確保資料的正確性。我想確認這樣的理解有沒有錯?
因為我發現我把同步拿掉後時間會省下很多,但計算的資料應該沒有錯誤,所以想確認一下。
另外,我看visual profiler在cudaMemcpy時有些會標[sync]有些則沒有,原因是什麼?
是說某些cudaMemcpy並沒有自動同步的效果嗎?