所以,我有一个代码,在格子上使用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子句中的代码,但是随着我添加越来越多的线程,这将如何扩展?
关于如何估计性能损失/收益的任何参考也将受到欢迎.
谢谢!
我正在尝试找到避免CUDA 内核中线程发散(分支或扭曲发散)的方法。
例如,我有以下条件赋值(a和b是char值,x和y是unsigned 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)来获得适当的整数结果来为每种情况添加(即,1,0或0,1)。
似乎没有常规的int绝对值函数,但我看到的是:
计算| X ?是 | + …