最近の投稿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();
}