运行并发CUDA内核,从c++;包装函数 我有C++代码,调用CUDA代码。我使用的是GTX680GPU。 目前它是这样运行的: 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 }

运行并发CUDA内核,从c++;包装函数 我有C++代码,调用CUDA代码。我使用的是GTX680GPU。 目前它是这样运行的: 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 },c++,concurrency,cuda,pthreads,C++,Concurrency,Cuda,Pthreads,每个函数都是这样的: 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(); //ca

每个函数都是这样的:

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()后同步所有内容

我能做这个吗?如果是这样的话,你能描述一下是如何做到的吗

(注意,FnUB-())在它里面有几个C++函数,必须连续运行——大概意味着我需要使用超过1个CPU线程,以便同时调用FnS2()和FnEa()。 编辑:添加到此问题,以确保其足够清晰。

C++函数CalthCuaAdfnx()是形式,例如:

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
}
void call_cuda_fn_x(){
…/ /一些C++工作
卷积
(mat1,mat2,…);
CUDA_CHECK_RETURN(cudaThreadSynchronize());//在调用下一个CUDA代码之前,请等待GPU工作完成。
马图穆尔
(mat1,mat2,…);
CUDA_CHECK_RETURN(cudaThreadSynchronize());//等待GPU工作完成。
……/一些更多的C++工作
}

注意,我需要调用C++函数中的CUDATRACKSCONTRORIZIZEN()。从CPU的角度看,

< P>内核调用是异步的,所以如果您连续调用2个内核,将调用第二个内核,而不必等待第一个内核完成。这只意味着控制立即返回到CPU

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

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

谢谢Itachi。但是在fn_2()中,我有几个cudaThreadSynchronize()调用。(我必须这样做,因为fn_2()中的内核调用需要是顺序的)。这不意味着我的C++线程挂在CnAutoRealStudio()调用内核fn2()中吗?是否使用FixaLimeSimultFn2()调用更多的内核从FNY2()调用其他C++函数:CARLYCUADAYFNXX();叫_cuda_fn_y();他们称CUDA代码,例如:mat_mul(arg1,arg2);CUDA_CHECK_RETURN(cudaThreadSynchronize());-mat_mul在哪里?全球?这不应该是个问题
\uu syncthreads()
同步内核内的线程
cudaEventSynchronize()
同步内核执行等cuda事件。因此,我认为这里没有问题。缺少这个答案。它没有提到对同一个流发出的cuda调用是序列化的,即使是异步调用,比如内核。如果您不使用多个流来启动打算并发运行的内核,您将不会有好的结果。您是否阅读了并发内核执行的指南,或者研究了该指南?Robert-谢谢。非常有用。所以GTX680可以运行并发内核-很好。并且(如我所理解的),在我的C++函数不依赖于CUDA代码的结果(即,如果没有“CuaAdRead>0”{…})时,我可以同时运行多个流,每个流都依次运行其代码,所有调用的都来自同一个CPU线程——也不错。在C++代码依赖于CUDA结果的情况下,我仍然不知道该怎么做——但我现在已经接近一半了:谢谢。如果主机代码依赖于CUDA结果,那么您可能(假定)需要将CUDA结果从设备复制到主机。将设备发送到主机
cudaMemcpyAsync
,将这些结果发送到启动生成这些结果的内核的同一个流中。然后在主机代码中使用该数据之前,为该流发出
cudaStreamSynchronize
。由于各种原因,在linux而不是windows(WDDM)上实现/观察并发内核执行可能更容易