2016-12-29 6 views
1

Thrust :: sort/uniqueはNaN、Infを処理できますか?私のCUDAカーネルで

// declaring data 
float * data = new float[size]; 
[...] 
[fill data] 
[...] 

// sorting 
thrust::sort(data, data + size, thrust::greater<float>()); 

// unique 
thrust::unique(thrust::device, data, data + size); 

出力:

data = 

0.1000 
0.1000 
0.1000 
    0 
-0.3000 
-0.2000 
-0.1000 
-Inf 
-Inf 
-Inf 
NaN 
Inf 
Inf 
Inf 
-Inf 
-Inf 
NaN 
Inf 
Inf 
Inf 
Inf 

私の出力、あなたはMATLABで見ることができ、ここでソートされていないと、重複は削除されません。ユニークと並べ替えはまったく機能していません。推論では配列へのポインタがサポートされていませんか?

+5

IEEE754のNaN値をソートすることは不可能です。(定義上)NaNは比較できないためです。標準のC++比較演算子(およびその推力相当)は、NaNを他の数またはそれ自身と比較することはできません。 – talonmies

答えて

2

NaNuncomparableであるため、比較対象アルゴリズムはNaNの値を含むデータでは正しく動作しません。 Infおよび-Infは比較可能であり、比較を実行する推力またはC++標準ライブラリアルゴリズムで動作します。

ここでの唯一の解決策は、まず、(thrust::remove_ifisnanを使用ファンクタまたはラムダ式で、このために使用することができる)NaN値を削除し、データ上の比較に基づくアルゴリズムを実行することです。したがって、このような何か:

次ん
#include <iostream> 
#include <thrust/remove.h> 
#include <thrust/unique.h> 
#include <thrust/sort.h> 

int main() 
{ 
    const int N=18; 
    unsigned int data[N] = { 
     0x3e99999a, 0x7f800000, 0xff800000, 0x7fffffff, 0x3e4ccccd, 0x3dcccccd, 
     0x3e99999a, 0x7f800000, 0xff800000, 0x7fffffff, 0x3e4ccccd, 0x3dcccccd, 
     0x3e99999a, 0x7f800000, 0xff800000, 0x7fffffff, 0x3e4ccccd, 0x3dcccccd }; 

    float* input = reinterpret_cast<float*>(&data[0]); 

    { 
     std::cout << "Input" << std::endl; 
     auto it = input; 
     for(; it != input+N; ++it) { std::cout << *it << std::endl; } 
     std::cout << std::endl; 
    } 

    auto pred = [](const float& v){ return isnan(v); }; 
    auto input_end = thrust::remove_if(input, input+N, pred); 
    thrust::sort(input, input_end); 
    input_end = thrust::unique(input, input_end); 

    { 
     std::cout << "Output" << std::endl; 
     auto it = input; 
     for(; it != input_end; ++it) {std::cout << *it << std::endl; } 
     std::cout << std::endl; 
    } 

    return 0; 
} 

NaNエントリが削除された場合に

~/SO$ nvcc --std=c++11 -arch=sm_52 inf_nan.cu 
~/SO$ ./a.out 
Input 
0.3 
inf 
-inf 
nan 
0.2 
0.1 
0.3 
inf 
-inf 
nan 
0.2 
0.1 
0.3 
inf 
-inf 
nan 
0.2 
0.1 

Output 
-inf 
0.1 
0.2 
0.3 
inf 

が一意の値をソートし、抽出する完全に可能であるが、入力されたデータにInf-Infが含まれます。

関連する問題