我现在有个for循环
initNet();
kernel<<<>>>();
for(int i=0;i<num;i++){
degreesum();
linker();
kernel();
__sync();
}
其中linker()用于每次kernel执行完数据的一个更新操作,数据都存储在host端。如何实现这种CPU端跟DEVICE端的同步?
我现在有个for循环
initNet();
kernel<<<>>>();
for(int i=0;i<num;i++){
degreesum();
linker();
kernel();
__sync();
}
其中linker()用于每次kernel执行完数据的一个更新操作,数据都存储在host端。如何实现这种CPU端跟DEVICE端的同步?
我现在有个疑问,kernel<<<>>>();函数执行的时候,是同时回去执行host端的代码?还是执行完后,才回去执行host端的代码?
LZ您好:
kernel是异步返回的,也就是说不等kenrel执行完毕,CPU就会开始执行后面的代码。
如果后面的代码是一般的CPU代码,那么一般无需担心。
如果后面是cudaMemcpy(),这是同步版本的copy函数,那么会等kernel执行完毕,数据copy完毕,CPU才继续向下执行。
如果后面是异步版本的copy函数,那么该函数对device端而言会等待同一stream中前面的kernel执行完毕才开始copy,而对于host端而言,会直接返回,继续执行后面的代码,如果此时需要用到copy回来的数据,请手工予以同步。
大致如此,祝您好运~
LZ您好:
您的问题描述较为简略,这里根据个人猜测简单说一下:
1:如果您的kernel每次执行生成的数据,下次循环也只是kernel使用,俺么无需copy回host,就留在device端的global memory中,下次循环kernel直接使用即可。
2:如果您确实需要每次循环都回拷数据供CPU使用,那么您可以考虑同步版的copy函数(cudaMemcpy()),这样可以保证kernel计算完成,回拷完成以后,CPU才继续向下执行。
3:以及,如果把数据都存放在host端,或者每次都copy数据,将极大地影响GPU的计算效率。
大致如此,供您参考。
多谢版主,受益匪浅