什么在 GPU 上更快?将 bool 类型转换为 int 或使用分支语句?
What is faster on GPU? Typecasting bool to int or using a branch statement?
我正在尝试使用 CUDA 来并行化模拟退火算法。我使用的 GPU 是 NVIDIA GTX660。我正在尝试加快程序速度,为此我正在考虑更换此
int r= rand();
if (condition)
{
r += 1;
}
和
int r = rand() + (condition)*1;
我知道 jump/branch 指令(如 if-then-else 命令)执行起来最慢,但除非我的理解不正确,否则类型转换涉及内存访问,然后在访问之前将数字复制到新位置作为 int它。 'condition' 的结果是否可以存储在寄存器中并在不修改的情况下馈入 ALU?如果是这样,那不是计算变量 r 值的更快方法吗?以上在每个线程上运行。
一般来说,您会非常努力地避免在 GPU 上进行分支,因为这通常是 CPU 需要停止所有不通过该分支的线程的地方,执行那些通过该分支的线程,然后停止这些,然后做另一个分支。
也就是说,分支不会发生,因为你写 if
;它发生是因为你使用例如<
根据您比较的内容为寄存器分配一个值,但这非常取决于您的实际情况,以及您所在的 language/architecture – 我的知识来自第一代CUDA,可能不再完全适用。
我正在尝试使用 CUDA 来并行化模拟退火算法。我使用的 GPU 是 NVIDIA GTX660。我正在尝试加快程序速度,为此我正在考虑更换此
int r= rand();
if (condition)
{
r += 1;
}
和
int r = rand() + (condition)*1;
我知道 jump/branch 指令(如 if-then-else 命令)执行起来最慢,但除非我的理解不正确,否则类型转换涉及内存访问,然后在访问之前将数字复制到新位置作为 int它。 'condition' 的结果是否可以存储在寄存器中并在不修改的情况下馈入 ALU?如果是这样,那不是计算变量 r 值的更快方法吗?以上在每个线程上运行。
一般来说,您会非常努力地避免在 GPU 上进行分支,因为这通常是 CPU 需要停止所有不通过该分支的线程的地方,执行那些通过该分支的线程,然后停止这些,然后做另一个分支。
也就是说,分支不会发生,因为你写 if
;它发生是因为你使用例如<
根据您比较的内容为寄存器分配一个值,但这非常取决于您的实际情况,以及您所在的 language/architecture – 我的知识来自第一代CUDA,可能不再完全适用。