6

CUDA プログラムで、最近、次を使用して無限大のテストから切り替えました。

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

math.hINFINITYから

return !isfinite(x);

異なる結果が得られたことに非常に驚きました。gnu.orgは、実際には同様に動作する必要があることを示唆しています。何か不足していますか?INFINITYCUDA カーネルでの使用は許可されていませんか?

編集: 私はちょうど発見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)が false です。

于 2010-12-03T22:27:50.803 に答える
2

isinf()+INFINITYまたはのみをチェックします-INFINITY

!isfinite()+INFINITY-INFINITYまたはをチェックしますNaN

于 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 ∈ NaN に対しても x == x であると主張していることに気付きました。

于 2010-12-03T22:12:37.867 に答える
0

最近の投稿Checking if a matrix contains nans or infinite values in CUDAで、Robert Crovella は、CUDAisinf()で無限値をチェックするために使用することを提案しました。

isinf()以下に、 CUDA Thrustを使用して配列内の無限値をチェックする例を示します。他のユーザーの参考になるかもしれません。以下の例は、Matlab のd_result=isinf(d_data);. 上記の質問に対して投稿した例とは異なります。現在のものは個々の要素が無限であることをチェックし、もう一方は配列全体に少なくとも 1 つ含まれており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 に答える