CUDA signbit()是否消除了分歧?

CUDA signbit()是否消除了分歧?,cuda,nvidia,Cuda,Nvidia,我看到有人建议使用可以消除翘曲发散并提高性能。如果这是正确的,那么它是如何在GPU中实现的?是否有一些专用硬件用于此功能,例如特殊功能单元(SFU)在CUDA 6.5之前(包括CUDA 6.5)的版本中,signbit()的实现是开放的。它可以在头文件math\u functions.h中找到。对于CUDA的较新版本,您可以使用cubobjdump--dump sass检查机器代码,以了解它是如何实现的 查看CUDA 6.5中的头文件,可以看到signbit()是一个映射到内联函数的宏,内联函数

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

在CUDA 6.5之前(包括CUDA 6.5)的版本中,
signbit()
的实现是开放的。它可以在头文件
math\u functions.h
中找到。对于CUDA的较新版本,您可以使用
cubobjdump--dump sass检查机器代码,以了解它是如何实现的

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

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


一般来说,CUDA程序员不需要经常担心分支,特别是当涉及到带有小实体的
if-then-else
构造时。编译器经常使用select类型指令的谓词(相当于C/C++三元运算符的机器)将这些指令呈现为无分支代码。它还可以将统一分支与谓词结合起来。

在CUDA 6.5之前(包括CUDA 6.5)的CUDA版本中,
signbit()
的实现是公开的。它可以在头文件
math\u functions.h
中找到。对于CUDA的较新版本,您可以使用
cubobjdump--dump sass检查机器代码,以了解它是如何实现的

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

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


一般来说,CUDA程序员不需要经常担心分支,特别是当涉及到带有小实体的
if-then-else
构造时。编译器经常使用select类型指令的谓词(相当于C/C++三元运算符的机器)将这些指令呈现为无分支代码。它还可以将统一分支与谓词结合起来。

如果它是在硬件中实现的,我会非常惊讶。检查符号只需要返回IEEE 754符号位的状态,而这通常是通过位掩码来完成的。就硬件而言,我的问题是,如果它只是一个简单的宏,那么它就会被if条件所取代!但我想情况并非如此。如果你想提供答案,请查看CUDA versions@njuffa中的头文件
math_functions.h
,我会投赞成票。如果它是在硬件中实现的,我会非常惊讶。检查符号只需要返回IEEE 754符号位的状态,而这通常是通过位掩码来完成的。就硬件而言,我的问题是,如果它只是一个简单的宏,那么它就会被if条件所取代!但我想情况并非如此。如果你想提供答案,请查看CUDA versions@njuffa中的头文件
math_functions.h
,我会投赞成票。