运行并发CUDA内核,从c ++包装器函数调用

时间:2014-01-31 12:51:32

标签: c++ concurrency cuda pthreads

我有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()。

1 个答案:

答案 0 :(得分:0)

内核调用从CPU的角度来看是异步的,所以如果你连续调用2个内核,第二个内核将被调用而不等待第一个完成。它只表示控件立即返回CPU。

因此,您可以按以下顺序启动。

fn_1()
cudaEventSynchronize()
fn_2()
fn_a()
cudaEventSynchronize()
fn_b()
fn_3()
cudaEventSynchronize()
fn_c()