关于异步计算的问题,请各位大大帮忙

小弟初学cuda,现在遇到一些问题:

有一大块数据(大约300300300),我要从中找出符合条件的某些数据,并把这些数据和对应下标放到一个新数组,作为kernel函数的传入值。

但“找符合条件的数据”所花的时间挺长,我想通过异步并发来隐藏掉这块时间,于是想到用一个512*2的数组d_surBuffer作为缓冲,
找到512个数据就传入kernel进行计算,同时cpu接着找,并把找到的数据放到另一半d_surBuffer空间里

Deposition_kernel<<<num_blocks,num_threads>>>(d_surBuffer, pCurr); //pCurr为0或1,表示了当前处理的是d_surBuffer的前一半还是后一半数据

我这样的思路对不对,要不要再用到流或者事件来控制?

CPU和kernel之间是自动协调好的么?
如果不是的话,会不会我在找第三组512个数据的时候,覆盖了第一组数据,导致第一个kernel运算出错?

表述的不太清楚,希望有大大可以帮助小弟一下

你的思路我感觉是可行的,cpu查找;cudaMemcpy; for(){ kernel<<<>>>; cpu查找;cudaMemcpy;} 不知道这样可以不?“如果不是的话,会不会我在找第三组512个数据的时候,覆盖了第一组数据,导致第一个kernel运算出错?”,不会的吧,你找第三组数据的时候,kernel是在执行第二组数据,可以覆盖之前的第一组数据吧?

谢谢你
假如kernel执行时间很长呢?
按照kernel启动直接返回的规则来说,cpu会等kernel处理完第二组数据的时候再去找第三组么?
以我现在的理解,cpu只是不停做循环时遇到kernel启动就交给GPU排队了吧
这样的话岂不是会出现kernel实际还在执行第一组(时间很长),CPU已经全部找完进入空闲了。。。

有点晕了。。

这一个好方案。假设你找数据的CPU函数叫search_cpu,那你如果这样写程序:

Search_cpu(…);

cudaMemcpyH2D;

Deposition_kernel<<>>(…)

Search_gpu(…);

cudaMemcpyH2DAsync(stream2);

Deposition_kernel<<>>(…)

那你就能将第二次search_gpu及cudamemcpy与第一次kernel调用overlap起来。

“按照kernel启动直接返回的规则来说,cpu会等kernel处理完第二组数据的时候再去找第三组么?
”,你这句话自相矛盾,前面既然说是异步启动了,后面cpu怎么会等待kernel处理完才查找呢?当然是kernel处理和cpu查找同时进行了。
“这样的话岂不是会出现kernel实际还在执行第一组(时间很长),CPU已经全部找完进入空闲了。。。
”这句话是正确的,你可以按照王鹏给你的方案,使用多流,这样可以进一步隐藏传输数据的时间,不过这就涉及到多流了

我试试 十分感谢

谢谢你 我试试看