2010-08-31 74 views
2

我有這樣的CUDA程序:的cudaThreadSynchronize()要求

for (int i=0;i<100000;i++) { 
    if (i%2 == 0) { 
    bind_x(x) // bind x to texture 
    kernel_code<<A,B>>(M,x,y) // calculate y = M*x 
    } 
    else { 
    bind_x(y) 
    kernel_code<<A,B>>(M,y,x) // calculate x = M*y 
    } 

    cudaThreadSynchronize(); 

    if (i%2 == 0) 
    unbind_x(x) 
    else 
    unbind_x(y) // unbind x from texture 
} 

我聽說,如果我不把cudaThreadSynchronize(); CPU將繼續無需等待內核結束所以......我應該打電話運行在unbind_x()之前的cudaThreadSynchronize()。我試圖用&運行沒有,結果是一樣的?!? (理論上它不應該)

回答

4

任何CUDA操作(除特殊的異步操作外)都將自動導致cudaThreadSynchronize()。所以結果應該是一樣的。

+2

除此之外......「異步操作」包括cudaMemcpyAsync系列,但重要的是其他內核啓動。 – Tom 2010-08-31 10:51:46

+0

當然。很自然,如果kernel_code <<>>()以異步模式運行,那麼其他內核也將以異步模式運行。謝謝你的補充。 – KoppeKTop 2010-08-31 11:11:00

+0

但是我的綁定和解除綁定不是內核調用。在內核中,我必須從紋理內存中提取x,而如果沒有同步,可能已經解除綁定 – w00d 2010-08-31 15:13:38