CUDA signbit()会消除分歧吗?

时间:2016-02-16 13:01:19

标签: cuda nvidia

我看到有人建议使用signbit()可以消除扭曲分歧并提高性能。如果这是正确的,那么它是如何在GPU中实现的?是否有一些专用硬件用于此功能,例如,特殊功能单元(SFU)?

1 个答案:

答案 0 :(得分:4)

{1}的实施在CUDA版本中是公开的,包括CUDA 6.5。它可以在头文件signbit()中找到。对于较新版本的CUDA,您可以使用math_functions.h检查机器代码以查看其实现方式。

查看CUDA 6.5中的头文件,可以看到cubobjdump --dump-sass是一个宏,它映射到一个内联函数,该函数从浮点操作数的原始位表示中提取符号位。在GPU上,这很容易实现,因为整数和浮点操作数共享相同的寄存器文件。在CUDA 6.5的情况下,使用单个右移指令提取符号位。

因此signbit()的实现是无分支且高效的,但是没有专门的硬件指令,因为这是不必要的。

一般来说,CUDA程序员不需要经常担心分支,特别是当signbit()构造小体时。编译器经常使用select-type指令的预测(机器相当于C / C ++三元运算符)将这些代码转换为无分支代码。它也可以将均匀分支与预测结合起来。