【问题标题】:Integer min/max in CUDACUDA 中的整数最小值/最大值
【发布时间】:2015-05-01 06:50:51
【问题描述】:

我在CUDA Math API 文档中看到有用于单精度和双精度最小/最大操作的函数(例如fminf())。我假设这些都是高度优化的,等等。似乎没有像这样的整数函数。这是真的?有什么原因吗?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    整数有最小/最大设备函数,但它们都是用重载的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);
    }
    

    它们没有在 Integer Intinsics 部分中列出,因为在 math_functions.hpp 中,max 函数被重载来为您调用这些函数。 __nv* 函数记录在 device_function_decls.hpp 中。

    【讨论】:

    • 这些内在函数直接映射到硬件指令是值得的。如果你用cuobjdump --dump-sass 反汇编你的二进制文件,你会发现类似IMNMX = "integer minimum or maximum" 的指令(一个谓词选择这是执行min() 还是max()
    • 对我来说,__nv_min 的代码无法编译。它需要哪种计算能力?
    • @SergeRogatch 您只需使用max,重载决议就会处理它。要么您没有使用 nvcc 编译文件,要么您忘记包含 cuda_runtime.h。但请确保您没有用于 max 的宏。我认为 math_functions.hpp 有重载
    • @chappjc,只编译min,肯定是nvcc,因为文件中还有很多其他的CUDA代码。 cuda_runtime.h 包括在内。但是__nv_min 无法编译(它说函数未定义)。
    • @SergeRogatch 它正在工作。不打算直接使用。
    猜你喜欢
    • 2013-06-27
    • 2012-11-20
    • 2012-08-09
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多