Разные выходные данные при отладке и запуске "в живую" и станное деление

Здравствуйте!

Начал изучать cuda и столкнулся с проблемами

1: программа при запуске в nsight(запуск, остановка на бряке, и продолжение выполнения) дает одни результаты(верные), а при запуске "в живую" - мусор вроде"1.#QNAN0". Складывается впечатление что некоторые нити отрабатывают не полностью(хотя sleep() перед возвращением не помогает).

2: в double массиве a[tid], содержится число 395.31, его делю на id нити,будем считать что он равен числу 3(16 и 23 строки в коде).
395.31/3 = 131.77
Почему эта-же операция на gpu, дает мне результат
131.770004272461 ?

Можно конечно округлять, но это ведь костыль

Код примерно следующий (может содержать ошибки, но суть та-же):

  1. __global__ void func(double *a, double *b, double *c, double *data1, double *data2)
  2. {
  3. int thid = threadIdx.x;
  4. int blid = blockIdx.x;
  5. int tid = blockDim.x * thid + blid;
  6.  
  7. c[*period*blid+thid]=0; // с - двумерен, здесь на всякий случай обнуляем
  8.  
  9. if (tid <= *period * *timeline)
  10. {
  11. a[tid]=0;                        
  12. for (int i=0; i<thid; i++)        //среднее значение части data1
  13.         {
  14.         a[tid]= a[tid]+data[blid+i];
  15.         }
  16. a[tid]= a[tid]/thid;  //делю на номер нити, здесь возникает ошибка  2
  17.  
  18. b[tid]=0;                        
  19. for (int i=0; i<thid; i++)        //среднее значение части data2
  20.         {
  21.         b[tid]= b[tid]+data[blid+i];
  22.         }
  23. b[tid]= b[tid]/thid;  //ошибка  2 повторяется.
  24.  
  25. c[*period*blid+thid] = a[tid] + b[tid];
  26. }
  27. }
  28.  
  29. void main()
  30. {
  31. ...
  32.     cudaEvent_t     start, stop;
  33.     cudaEventCreate( &start );
  34.     cudaEventCreate( &stop );
  35.     cudaEventRecord( start, 0 );
  36. ...
  37. выделение
  38. перемещение
  39.  
  40. func<<<timeline,period>>>( dev_a, dev_b, dev_c, dev_data1, dev_data2 );
  41.  
  42.     cudaEventRecord( stop, 0 );
  43.     cudaEventSynchronize( stop );
  44.     float   elapsedTime;
  45.     cudaEventElapsedTime( &elapsedTime, start, stop );
  46. ...
  47. возвращение
  48. очистка
  49. ...
  50. }

Forums: 

А почему вы решили, что если

А почему вы решили, что если что-то "нормально" делится на 3, то это что-то будет иметь нормальное же (а не приблизительное) двоичное представление?