的cudaThreadSynchronize()要求

问题描述:

我有这样的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()。我试图用&运行没有,结果是一样的?!? (理论上它不应该)

任何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