我有c ++代码,它调用CUDA代码。我正在使用GTX 680 GPU。 目前它的运行方式如下:
fn_1(); //calls CUDA code (indirectly)
fn_a(); //calls CUDA code (indirectly), must run AFTER fn_1
fn_2(); //calls CUDA code (indirectly), must run AFTER fn_1
fn_b(); //calls CUDA code (indirectly), must run AFTER fn_2
fn_3(); //calls CUDA code (indirectly), must run AFTER fn_2
fn_c(); //calls CUDA code (indirectly), must run AFTER fn_3
并且每个函数都是这样的:
void fn_*(){
call_cuda_fn_x(); //calls CUDA code
call_cuda_fn_y(); //calls CUDA code, must run AFTER call_cuda_fn_x
}
其中一些功能并未充分利用我的GPU(GTX 680)。 因此,我想让fn_2()和fn_a()同时运行,然后在fn_2()完成后立即调用fn_3()和fn_b()。然后在调用fn_c()后同步所有内容。
fn_1();
fn_2(); also launch fn_a()
fn_3(); also launch fn_b()
fn_c();
synchronise() //ensure that fn_a() && fn_b() && fn_c() have finished.
我可以这样做吗?如果是这样,你能勾画出如何做到吗?
(注意,例如fn_b()里面有几个c ++函数,必须按顺序运行 - 大概这意味着我需要使用多个cpu线程,以便同时调用fn_2()和fn_a()? - 即我不能只依赖于调用我所有的CUDA内核而只能在最后进行同步)
编辑:添加到此问题,以确保其足够清晰..
c ++函数call_cuda_fn_x()的形式如下:
void call_cuda_fn_x(){
.... //some c++ working
convolve<<<n_blocks, n_threads, n_floats*sizeof(float)>>>
(mat1, mat2, .. );
CUDA_CHECK_RETURN(cudaThreadSynchronize()); //Wait for the GPU work to finish, BEFORE calling the next CUDA code.
mat_mul<<<n_blocks, n_threads, n_floats*sizeof(float)>>>
(mat1, mat2, .. );
CUDA_CHECK_RETURN(cudaThreadSynchronize()); //Wait for the GPU work to finish.
.... //some more c++ working
}
请注意我需要在这个c ++函数中调用cudaThreadSynchronize()。
答案 0 :(得分:0)
内核调用从CPU的角度来看是异步的,所以如果你连续调用2个内核,第二个内核将被调用而不等待第一个完成。它只表示控件立即返回CPU。
因此,您可以按以下顺序启动。
fn_1()
cudaEventSynchronize()
fn_2()
fn_a()
cudaEventSynchronize()
fn_b()
fn_3()
cudaEventSynchronize()
fn_c()