我會理解爲什麼結果是無窮大。我寫下面的代碼,我總是收到INF的結果。我的代碼有任何精度問題?無窮大導致雙操作
#include <stdio.h>
#include <stdlib.h>
#include "cuda.h"
#include "curand_kernel.h"
#define NDIM 30
#define NPAR 5
#define DIMPAR NDIM*NPAR
__device__ double uniform(int index){
return (double) 0.767341;
}
__global__ void iteracao(double *pos){
int thread = threadIdx.x + blockDim.x * blockIdx.x;
double tvel;
int i = 0;
double l, r, t;
if(thread < DIMPAR){
do{
t = (double) uniform(thread);
l = (double) 2.05 * t * (pos[thread]);
r = (double) 2.05 * t * (pos[thread]);
tvel = (double) l+t+r;
pos[thread] = tvel;
i++;
}while(i < 10000);
}
}
int main(int argc, char *argv[])
{
double *d_pos, *h_pos;
h_pos = (double *) malloc(sizeof(double) * DIMPAR);
cudaMalloc((void**)&d_pos, DIMPAR * sizeof(double));
int i, j, k, numthreadsperblock, numblocks;
numthreadsperblock = 512;
numblocks = (DIMPAR/numthreadsperblock) + ((DIMPAR % numthreadsperblock)?1:0);
//
printf("numthreadsperblock: %i;; numblocks:%i\n", numthreadsperblock, numblocks);
cudaMemset(d_pos, 0.767341, DIMPAR * sizeof(double));
iteracao<<<numblocks,numthreadsperblock>>>(d_pos);
cudaMemcpy(h_pos, d_pos, DIMPAR * sizeof(double), cudaMemcpyDeviceToHost);
printf("\n");
for(i = 0; i < NPAR; i++){
for(j = i*NDIM, k = j; j < (k+30); j++){
printf("%f,", h_pos[j]);
}
printf("***\n\n");
}
system("PAUSE");
return 0;
}
輸出總是這樣:
numthreadsperblock:512 ;; numblocks:1
inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf inf,inf,inf,inf,inf,inf,inf,inf,*
inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf, Inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,*
inf,inf,inf,inf,inf ,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF ,*
inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf, inf,inf,inf,inf,inf,inf,*
inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,*
最有可能的是你將你的d_pos設置爲垃圾。 cudaMemset對字節值進行操作,並給出一個最可能導致零字節的浮點數。 – Anycorn