6

在一个 CUDA 程序中,我最近使用

return x==INFINITY || x==-INFINITY;

INFINITY从 math.h 到哪里

return !isfinite(x);

并且对得到不同的结果感到非常惊讶。gnu.org建议它们实际上应该表现类似。我错过了什么吗?是否不允许INFINITY在 CUDA 内核中使用?

编辑: 我刚刚发现isinf并注意到使用

return isinf(x);

给出与 INFINITY 检查相同的结果。为什么不是 isfinite(x)==!isinf(x)

4

5 回答 5

7

isfinite(a)是一样的!isnan(a) && !isinf(a)。如果x是 NaN,那么isfinite(x)isinf(x)都是假的。

于 2010-12-03T22:27:50.803 回答
2

isinf()仅检查+INFINITYor -INFINITY

!isfinite()检查+INFINITY,-INFINITYNaN.

于 2010-12-03T22:51:10.000 回答
1

浮点比较不一定有效。例如,很有(1.0f + 3.0f != 2.0f + 2.0f)可能 isfinite 完全有可能认为小于特定常量的值等于 INFINITE 或 -INFINITE,而您编写的是文字相等。

于 2010-12-03T22:08:39.417 回答
1

许多 GPU 和 SIMD 单元并不完全符合 IEEE754,尤其是对于无穷大和 NaN 周围的边缘情况。就在昨晚,我注意到我使用的一个特定向量处理器声称 ∞+1 ≠ ∞ ,并且 x == x 即使对于 x ∈ NaN。

于 2010-12-03T22:12:37.867 回答
0

在最近的文章Checking if a matrix contains nans or infinite values in CUDA 中,Robert Crovella 建议使用isinf()来检查 CUDA 中的无限值。

下面我提供了一个使用isinf()和利用 CUDA Thrust 检查数组中无限值的示例。也许它可以作为其他用户的参考。下面的例子相当于 Matlab 的d_result=isinf(d_data);. 它与我为上面引用的问题发布的示例不同,当前一个检查每个单独的元素是无限的,而另一个检查整个数组是否包含至少一个NaN并且等效于 Matlab 的sum(isnan(d_data));.

#include <thrust/sequence.h>

#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust\device_vector.h>
#include <thrust\reduce.h>

#include <float.h>

// --- Operator for testing inf values
struct isinf_test { 
    __host__ __device__ bool operator()(const float a) const {
        return isinf(a);
    }
};

void main(){

    const int N = 10;

    thrust::host_vector<float> h_data(N);
    for (int i=0; i<N; i++)
        h_data[i] = rand()/RAND_MAX;

    h_data[0] = FLT_MAX/FLT_MIN;

    thrust::device_vector<float> d_data(h_data);
    thrust::device_vector<float> d_result(h_data);

    thrust::transform(d_data.begin(), d_data.end(), d_result.begin(), isinf_test());

    for (int i=0; i<N; i++) {
        float val = d_result[i];
        printf("Isinf test for element number %i equal to %f\n",i,val);
    }

    getchar();

}
于 2014-05-07T17:00:08.680 回答