相关疑难解决方法(0)

分支分歧,CUDA和动力学蒙特卡罗

所以,我有一个代码,在格子上使用Kinetic Monte Carlo来模拟某些东西.我正在使用CUDA在我的GPU上运行此代码(尽管我相信同样的问题也适用于OpenCl).

这意味着我将格子分成小的子格子,每个线程都在其中一个上运行.由于我在做KMC,每个线程都有这样的代码:

   While(condition == true){
     *Grab a sample u from U[0,1]*
      for(i = 0; i < 100;i++){
         *Do some stuff here to generate A*
          if(A > u){
              *Do more stuff here, which could include updates to global memory*
               break();
           }
      }
   }
Run Code Online (Sandbox Code Playgroud)

A对于不同的线程是不同的,因此u和100只是一个随机数.在代码中,这可能是1000甚至10000.

那么,当一个线程通过时,我们不会有分支差异吗?这会影响性能有多严重?我知道答案取决于if子句中的代码,但是随着我添加越来越多的线程,这将如何扩展?

关于如何估计性能损失/收益的任何参考也将受到欢迎.

谢谢!

performance cuda montecarlo

3
推荐指数
1
解决办法
2452
查看次数

使用条件分配避免 CUDA 内核中的线程发散

我正在尝试找到避免CUDA 内核中线程发散分支扭曲发散)的方法。

例如,我有以下条件赋值(abchar值,xyunsigned int值):

if (a == b) { ++x; }
else        { ++y; }
Run Code Online (Sandbox Code Playgroud)

或者,或者:

if (a == b) { ++x; }
if (a != b) { ++y; }
Run Code Online (Sandbox Code Playgroud)

如何重写上述操作以避免分支?

我查看了类型转换内在函数,但没有从boolto转换可用int。我在想可能有一些技巧可以使用min,max和绝对值(例如,__sad)来获得适当的整数结果来为每种情况添加(即,1001)。

似乎没有常规的int绝对值函数,但我看到的是:

计算| X ?是 | + …

cuda

1
推荐指数
1
解决办法
331
查看次数

标签 统计

cuda ×2

montecarlo ×1

performance ×1