CUDA中的整数最小值/最大值

15

我在CUDA数学API文档中看到了单精度和双精度的最小/最大操作函数(例如fminf())。我认为这些函数已被高度优化。但是,我发现没有针对整数的类似函数。这是真的吗?有什么原因呢?

1个回答

17

整数有最小值/最大值设备函数,但它们都通过重载的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 中有文档记录。


3
就其价值而言,这些内在函数可以直接映射到硬件指令。如果你使用 cuobjdump --dump-sass 将二进制文件反汇编,你会发现像 IMNMX 这样的指令 = "整数最小值或最大值"(一个谓词选择该指令执行 min() 还是 max())。 - njuffa
对我来说,带有__nv_min的代码无法编译。它需要哪个计算能力? - Serge Rogatch
@SergeRogatch 你只需使用 max,重载解析器将处理它。要么你没有使用 nvcc 编译文件,或者忘记包含 cuda_runtime.h。确保没有用于 max 的宏定义。我认为 math_functions.hpp 中有这些重载。 - chappjc
@chappjc,只使用min编译是可以的,肯定是nvcc的问题,因为文件中有很多其他的CUDA代码。已经包含了cuda_runtime.h。但是__nv_min无法编译(提示函数未定义)。 - Serge Rogatch
@SergeRogatch 那就可以了。不打算直接使用。 - chappjc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接