gpt4 book ai didi

c++ - rint 不存在于 Visual Studio 2010 math.h 中,相当于 CUDA rint

转载 作者:太空狗 更新时间:2023-10-29 19:53:20 27 4
gpt4 key购买 nike

我正在将 CUDA 代码移植到 C++ 并使用 Visual Studio 2010。CUDA 代码使用 rint 函数,它似乎不存在于 Visual Studio 2010 math.h 中,所以看来还得自己实现了。

根据这个link , CUDA rint 函数

将 x 舍入为浮点格式中最接近的整数值,中间情况舍入为零。

我想我可以使用转换为 int 的方法来丢弃小数部分,有效地向零舍入,所以我最终得到了以下函数

inline double rint(double x)
{
int temp; temp = (x >= 0. ? (int)(x + 0.5) : (int)(x - 0.5));
return (double)temp;
}

它有两种不同的转换,一种是int,一种是double

我有三个问题:

  1. 对于“小”数字,上述函数是否完全等同于 CUDA rint?对于不能表示为 int 的“大”数字,它会失败吗?
  2. 是否有计算效率更高的方法(而不是使用两次转换)来定义 rint

非常感谢您。

最佳答案

CUDA 文档中引用的 rint() 描述不正确。使用浮点结果舍入为整数映射 IEEE-754 (2008) 指定的舍入模式如下:

trunc()   // round towards zero
floor() // round down (towards negative infinity)
ceil() // round up (towards positive infinity)
rint() // round to nearest or even (i.e. ties are rounded to even)
round() // round to nearest, ties away from zero

通常,这些函数按照 C99 标准中的描述工作。对于 rint(),标准指定函数根据当前舍入模式(默认为最接近或偶数舍入)进行舍入。由于 CUDA 不支持动态舍入模式,所有定义为使用当前舍入模式的函数都使用舍入模式“舍入到最近或偶数”。这里有一些例子显示了 round() 和 rint() 之间的区别:

argument  rint()  round()
1.5 2.0 2.0
2.5 2.0 3.0
3.5 4.0 4.0
4.5 4.0 5.0

round() 可以很容易地按照您发布的代码行进行模拟,我不知道 rint() 的简单模拟。请注意,您不希望使用到整数的中间转换,因为“int”支持的数值范围比可以用“double”精确表示的整数更窄。而是酌情使用 trunc()、ceil()、floor()。

由于 rint() 是当前 C 和 C++ 标准的一部分,我对 MSVC 不包含此函数感到有点惊讶;我建议检查 MSDN 以查看是否提供替代品。如果您的平台支持 SSE4,则可以使用 smmintrin.h 中定义的 SSE 内在函数 _mm_round_sd()、_mm_round_pd(),并将舍入模式设置为 _MM_FROUND_TO_NEAREST_INT ,实现CUDA的rint()的功能。

虽然(根据我的经验)SSE 内在函数可以跨 Windows、Linux 和 Mac OS X 移植,但您可能希望避免使用特定于硬件的代码。在这种情况下,您可以尝试以下代码(经过简单测试):

double my_rint(double a)
{
const double two_to_52 = 4.5035996273704960e+15;
double fa = fabs(a);
double r = two_to_52 + fa;
if (fa >= two_to_52) {
r = a;
} else {
r = r - two_to_52;
r = _copysign(r, a);
}
return r;
}

请注意,MSVC 2010 似乎也缺少标准的 copysign() 函数,因此我不得不替换为 _copysign()。上面的代码假定当前的舍入模式是舍入到最接近的偶数(默认情况下)。通过添加 2**52 它确保舍入发生在整数单位位。请注意,这还假定执行纯 double 计算。在对中间结果使用更高精度的平台上,可能需要将“fa”和“r”声明为易变的。

关于c++ - rint 不存在于 Visual Studio 2010 math.h 中,相当于 CUDA rint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14919512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com