我在CUDA数学API文档中看到了单精度和双精度的最小/最大操作函数(例如fminf()
)。我认为这些函数已被高度优化。但是,我发现没有针对整数的类似函数。这是真的吗?有什么原因呢?
整数有最小值/最大值设备函数,但它们都通过重载的max()
调用。请查看device_functions.hpp:
__DEVICE_FUNCTIONS_STATIC_DECL__ int max(int x, int y)
{
return __nv_max(x, y);
}
__DEVICE_FUNCTIONS_STATIC_DECL__ unsigned int umax(unsigned int x, unsigned int y)
{
return __nv_umax(x, y);
}
__DEVICE_FUNCTIONS_STATIC_DECL__ long long llmax(long long x, long long y)
{
return __nv_llmax(x, y);
}
__DEVICE_FUNCTIONS_STATIC_DECL__ unsigned long long ullmax(unsigned long long x,
unsigned long long y)
{
return __nv_ullmax(x, y);
}
它们没有列在整数 Intrinsic 部分中,因为在 math_functions.hpp 中,max
函数被重载为为您调用这些函数。__nv*
函数在 device_function_decls.hpp 中有文档记录。
cuobjdump --dump-sass
将二进制文件反汇编,你会发现像IMNMX
这样的指令 = "整数最小值或最大值"(一个谓词选择该指令执行min()
还是max()
)。 - njuffa__nv_min
的代码无法编译。它需要哪个计算能力? - Serge Rogatchmax
,重载解析器将处理它。要么你没有使用 nvcc 编译文件,或者忘记包含 cuda_runtime.h。确保没有用于max
的宏定义。我认为 math_functions.hpp 中有这些重载。 - chappjcmin
编译是可以的,肯定是nvcc
的问题,因为文件中有很多其他的CUDA代码。已经包含了cuda_runtime.h
。但是__nv_min
无法编译(提示函数未定义)。 - Serge Rogatch