【发布时间】:2015-05-01 06:50:51
【问题描述】:
我在CUDA Math API 文档中看到有用于单精度和双精度最小/最大操作的函数(例如fminf())。我假设这些都是高度优化的,等等。似乎没有像这样的整数函数。这是真的?有什么原因吗?
【问题讨论】:
标签: cuda
我在CUDA Math API 文档中看到有用于单精度和双精度最小/最大操作的函数(例如fminf())。我假设这些都是高度优化的,等等。似乎没有像这样的整数函数。这是真的?有什么原因吗?
【问题讨论】:
标签: cuda
整数有最小/最大设备函数,但它们都是用重载的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 的代码无法编译。它需要哪种计算能力?
max,重载决议就会处理它。要么您没有使用 nvcc 编译文件,要么您忘记包含 cuda_runtime.h。但请确保您没有用于 max 的宏。我认为 math_functions.hpp 有重载
min,肯定是nvcc,因为文件中还有很多其他的CUDA代码。 cuda_runtime.h 包括在内。但是__nv_min 无法编译(它说函数未定义)。