我记得我在一本专著上看到说CPU对KERNEL调用是异步的,调用完成后即执行后续操作。但CUDA 编程手册上说对——GLOBAL——函数调用是同步的?哪个正确?
LZ您好:
对于host而言,kernel是异步返回的,即不等kernel实际在device端执行完毕,host端函数已经返回。
以及,您引述的手册上的内容,能否给出原文?
祝您编码顺利~
1、在CUDA编程指南中4.2.1.4限定中有一段话“对一个_global_函数的调用是同步的,意味着设备执行完成前返回”,应该是把异步写成同步了。
2、既然是异步,那我在很多示例中并没看到CPU进行显式同步就进行了CUDAMEMCPY的操作,以将KERNEL执行结果COPY至HOST端,是否可以认为CUDAMEMCPY操作时会自动进行同步,以确保KERNEL执行完毕。谢谢!
LZ您好:
1:我刚才翻看了CUDA 5 自带的CUDA C Programming Guide,并无4.2.1.4章节。如果您看的是其他更老版本的手册或者是某个翻译版的手册,那么请以5.0或者5.5版官方英文版手册为准。
2:这个问题分为两点:
a)同一个stream(包括默认stream)中的kernel后面的copy函数总是会等到kernel结束才执行copy,无论是同步版的cudaMemcpy()还是异步版的cudaMemcpyAsync()。
b)对于host端而言,cudaMemcpy()是同步返回的,而cudaMemcpyAsync()是异步返回的(不等真正执行完就返回的)。但这并不影响和kernel之间的配合。
大致如此,供您参考。
祝您编码顺利~