求解答

敢问一下如果在很多并行的核函数中调用同一个设备函数时,会不会相互之间互相影响啊?或者说会导致设备函数调用结果一模一样?

楼主您好,如果cuda里,一个__global__/__kernel__函数不依赖于任何全局信息(例如__device__和__constant__的变量,纹理引用之类的),也没有内部状态(这个不能有,cuda不支持静态局部变量)等,那么给他确定的输入将得到确定的输出(使用smid, clock计数之类的不被视作确定输入)。

只要您能确保上述条件等,那么您可以安全的多次同时调用它。

实际上,不使用全局状态(包括static的局部变量),不使用内部状态等的上文说的这种函数叫做纯函数(pure function), 纯函数是可以在任何固定输入时会得到固定输出的(以及包括被同时调用多个副本/被重入/被递归等),而在cuda里确保一个函数是纯函数的要求已经基本写在第一段了。请您参考。

符合这个,即可安心调用。

版主的意思是当N个并行线程几乎同时调用同一个设备函数时(所输入参数不同)会产生N个设备函数的副本似的,相互之间可以说没任何关系?

“副本”,实际上代码只有1份,但有多个不同的执行状态。

我给你举个符合我1#的例子,
device int Chris(int i) {return a + 1;}
Chris是一个纯函数,当它没有被inline的时候,你觉得Chris被调用1次和调用10000次会有什么不同么?

这是其一。

其二,实际上你一直这么做,例如sinf之类的,只要你不打开use_fast_math的时候,实际上你就是在调用一个插值的device函数(不考虑是否其被inline), 你觉得你一个线程sinf()和多个线程sinf(), 它们会有什么影响么?

:slight_smile: