CUDA线程执行顺序

CUDA线程执行顺序,cuda,Cuda,在CUDA中,当我们谈论执行相同代码的并行线程时,它们的执行是否有顺序 例如: 如果,我有4个线程,用于4个元素的1D数组。所有四个线程对数组的某个索引执行一些操作。 线程4是否总是在线程3之后执行,或者执行中没有特定的顺序 谢谢大家! 通常,线程的执行没有顺序。依靠线程的顺序来设计算法是错误的 线程的执行没有确定的顺序,如果需要特定的顺序,那么应该按顺序编程,而不是使用并行执行模型 不过,关于线程执行,可以说有些事情。在CUDA的执行模型中,线程分组为“扭曲”。根据底层设备的计算能力,每个扭曲

在CUDA中,当我们谈论执行相同代码的并行线程时,它们的执行是否有顺序

例如: 如果,我有4个线程,用于4个元素的1D数组。所有四个线程对数组的某个索引执行一些操作。 线程4是否总是在线程3之后执行,或者执行中没有特定的顺序


谢谢大家!

通常,线程的执行没有顺序。依靠线程的顺序来设计算法是错误的

线程的执行没有确定的顺序,如果需要特定的顺序,那么应该按顺序编程,而不是使用并行执行模型

不过,关于线程执行,可以说有些事情。在CUDA的执行模型中,线程分组为“扭曲”。根据底层设备的计算能力,每个扭曲(或半扭曲)都会同时执行——实际上是同时执行。执行将继续,直到代码因等待内存传输而锁定,并计划运行另一个扭曲(或半扭曲)


不过,文档非常详细地说明了您可以对这一问题做出什么样的假设:您最好的执行障碍是内核调用结束。

因此,假设我有一个“计数器”,其值决定了输出索引,并且对所有同时更改其值的线程都是全局的,那么这种方法自然是错误的和不可预测的,因为我不知道哪个线程首先改变计数器的值。对吗?这是正确的。要使“计数器”返回一个准确的数字,您需要做的是让每个线程更新一个本地计数器,将它们存储在一个单独的数组中,然后将数组的元素相加以得到最终的数字。这称为“减少”,也可以并行进行。您还可以使用原子操作。他们并不像早期的建筑那样缓慢。顺便说一句,如果要跟踪谁是第一个,您可以通过编程方式确定第一个更改。@marina.k任何被攻击的序列化/同步都是违反gpu(SIMD)编程范式和CUDA体系结构的。我怀疑与重写的优化算法相比,是否能达到高性能。我从来没有看到过这样的例子,在内核级别上这种同步是必要的,而且速度更快,而且算法无法更改。@djmj:我完全同意。我个人的观点是,如果你使用GPU,你必须接受它的规则=),但这个问题的解决方案是可能的。请再次阅读你的问题和示例。如果线程4与线程3平行且小于翘曲尺寸,那么如何在线程3之后执行线程4。如果比较扭曲执行顺序或块执行,则该问题可能有效。但两者都不能保证。我对并行线程确定所有线程共有的变量的值感到困惑,因此我的问题与它们的执行顺序有关。