CUDA线程分歧和分支,示例

CUDA线程分歧和分支,示例,cuda,Cuda,我有一些例子让我感到奇怪的头痛: 我产生了一个线程分歧,但我无法确定哪个分支或哪个语句是首先计算的 第一个示例: 我有以下内核,我从1个块中的2个线程开始。 [0]=0,a=0 输出 我假设因为两个线程在同一个扭曲中,所以它们在lockstep中执行,(a)和(b)都同时读取a[0]和a 第二个示例: 与第一个零件完全相同,但现在删除了else if零件: __global__ void branchTest_kernel( float* a){ int tx = threadIdx.x;

我有一些例子让我感到奇怪的头痛: 我产生了一个线程分歧,但我无法确定哪个分支或哪个语句是首先计算的

第一个示例:
我有以下内核,我从1个块中的2个线程开始。 [0]=0,a=0

输出

我假设因为两个线程在同一个扭曲中,所以它们在lockstep中执行,(a)和(b)都同时读取a[0]和a

第二个示例:
与第一个零件完全相同,但现在删除了else if零件:

__global__ void branchTest_kernel( float* a){

  int tx = threadIdx.x;

  if(tx==0){
     a[1] = a[0] + 1;  (a)
  }else{
     a[0] = a[1] + 1;  (b)
  }


} 
输出

是什么原因导致这种行为,现在突然(b)是第一,和(a)第二。。。(可能是最内部的分支) 有人能解释一下分支的先行规则吗?或者在哪里可以找到这些信息

我在实现Gauss-Seidel解算器时遇到了以下示例:
CUDA中的warp内没有分支执行顺序的优先规则-行为未定义。编译器、汇编器和JIT运行时可以自由地对指令进行重新排序,而且您绝对不能尝试依赖您根据经验推断的顺序,因为它可能会发生变化(正如您所发现的)。在这种情况下,强制形式正确性的唯一方法是使用原子内存访问操作,这将强制序列化。更好的是,寻找另一种算法


在Gauss-Seidel情况下,传统方法是对矩阵或计算网格的图形分解中的每种颜色使用单独的内核启动。

[已编辑!]-->提供了错误的输出。您确定为第二种情况提供了正确的代码吗?没有条件,否则如果?你要发布多少个线程?哈哈,至少我接受了:-),我在这个问题和答案上迷失了方向:-)
a[0] = 1  
a[1] = 1 
__global__ void branchTest_kernel( float* a){

  int tx = threadIdx.x;

  if(tx==0){
     a[1] = a[0] + 1;  (a)
  }else{
     a[0] = a[1] + 1;  (b)
  }


} 
a[0] = 1  
a[1] = 2