instrinsics, , C99, :
isnan()
inf :
isinf()
, , , , ββ . , , , , . CUDA , . for , .
, , () , , , , .
, , - , , , , .
( ):
$ cat t383.cu
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define DSIZEW 10000
#define DSIZEH 2000
#define nTPB 256
#define BLKS 16
__global__ void isnan_test(float *data, int width, int height, bool *result){
int idx = threadIdx.x+blockDim.x*blockIdx.x;
while (idx < width){
for (int i = 0; i < height; i++)
if (isnan(data[(i*width) + idx])) *result = false;
idx += gridDim.x+blockDim.x;
}
}
int main(){
float *d_data, *h_data;
bool *d_result, h_result=true;
const char type = '0';
cudaMalloc((void **)&d_data, sizeof(float)*DSIZEW*DSIZEH);
cudaMalloc((void **)&d_result, sizeof (bool));
h_data=(float *)malloc(sizeof(float)*DSIZEW*DSIZEH);
for (int i=0; i<DSIZEH*DSIZEW; i++)
h_data[i] = rand()/RAND_MAX;
cudaMemcpy(d_data, h_data, sizeof(float)*DSIZEW*DSIZEH, cudaMemcpyHostToDevice);
cudaMemcpy(d_result, &h_result, sizeof(bool), cudaMemcpyHostToDevice);
isnan_test<<<BLKS,nTPB>>>(d_data, DSIZEW, DSIZEH, d_result);
cudaMemcpy(&h_result, d_result, sizeof(bool), cudaMemcpyDeviceToHost);
if (!h_result) {printf("error in no-NAN check\n"); return 1;}
float my_nan = nanf(&type);
cudaMemcpy(d_data, &my_nan, sizeof(float), cudaMemcpyHostToDevice);
isnan_test<<<BLKS,nTPB>>>(d_data, DSIZEW, DSIZEH, d_result);
cudaMemcpy(&h_result, d_result, sizeof(bool), cudaMemcpyDeviceToHost);
if (h_result) {printf("error in NAN check\n"); return 1;}
printf("Success\n");
return 0;
}
$ nvcc -arch=sm_20 -o t383 t383.cu
$ ./t383
Success
$
, cuda /, .
(BLKS) (nTPB), - , GPU .