如题,在global函数中调用device函数,但是好像给的N个内核都会调用这个函数,但是由于异构编程需要将gpu中的大量数据拷贝回host ,这样会损耗大量时间,所以我的问题是,有没有一种方法能够不通过检查线程ID来限制调用device函数的内核数目来避免竞态的出现呢。
您确定您理解您的话的意思么?
(1)是否需要来回复制数据到host memory, 和您是否需要“检查线程ID"无关的。
(它只取决与你的逻辑实现)
(2)是否发生竞态和调用__device__函数无关的。
因为您的问题的主要部分都不存在逻辑性,因此无法回答。
建议您重新整理下您的语言,这是为了你负责,也是为了论坛上的其他看贴的会员负责。
感谢您的莅临。
感谢版主大人的热心回复
因为device函数中存在状态参数的改变 如果N个内核调用它就会造成N个状态的改变,这就产生了竟态。
但是把device函数的工作交给cpu执行的话,就需要传送大量数据到cpu 所以会产生时间的额外消耗,我的意思是调用device函数的时候能不能限制调用它的内核数,而不是与分配给global函数的内核数量一样。
我明白你的意思了。
你要考虑到一个事实:
无论是__global__还是__device__,实际上能引入内部状态的只有全局device变量。
那么你可以简单的通过不使用,不修改全局__device__变量/数组,此时你的__global__或者__device__将变成纯函数(即,他们只工作在自己的形参上)。
而此时,你可以通过给不同的参数(例如工作缓冲区)来隔离多个执行的副本的。
(以及,认真的说,任何引入内部状态的函数在任何环境(例如CPU上,C内部的static变量)都不是个好的写作风格。强烈建议你听从上文建议,修改成只依赖于参数列表的pure function。这不会浪费你多少时间,却可以立刻解决此问题)
请您考虑这点。
(而不是在你原有的思路上修修补补。那样不好)
嗯 谢谢版主
嗯嗯。其实道理很简单,一个可能会导致竞态的实现,修改起来极大困难。
那么,为何不简单的修改下使用的变量的位置,变成不存在竞争的实现呢?
修改付出的一次性成本很低(甚至比你坚持原本的,反复小修小改的成本还低)。
以后的维护成本也同样降低。
感谢您考虑此建议。