我正在尝试使用CUDA来并行化模拟退火算法。我使用的GPU是NVIDIA GTX660。我正在努力加快程序的速度,为了做到这一点,我正在考虑更换这个
int r= rand();
if (condition)
{
r += 1;
}
与
int r = rand() + (condition)*1;
我理解跳转/分支指令(比如if-then-else命令)是执行速度最慢的,但除非我的理解不正确,否则类型转换涉及内存访问,然后在访问之前将新位置的数字复制为int。 '条件'的结果是否可以存储在寄存器中并在ALU中输入而不进行修改?如果是这样,这不是一个更快的方法来计算变量r的值?以上内容在每个帖子上运行。
答案 0 :(得分:2)
通常,你会非常努力地避免在GPU上进行分支,因为这通常是CPU需要暂停所有不通过该分支的线程的执行点,执行那些执行的操作,然后暂停这些操作,然后执行操作另一个分支。
话虽这么说,分支不会发生,因为你写if
;它发生是因为你使用例如<
根据您所比较的内容为寄存器赋值,但这非常取决于您的实际情况以及您所使用的语言/架构 - 我的知识来自第一代CUDA和可能不再完全适用了。