У меня есть неизвестная проблема, когда я передаю двойное число высокой точности в функцию CUDA
, используя MEXFILE
, и результаты отличаются.Пожалуйста, посмотрите на приведенный ниже пример:
// includes, system
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//include, mexFunction
#include "mex.h"
#include "gpu/mxGPUArray.h"
__global__ void calculate( double i_2j, double i_2jm1, double inj, double injm1, double h, double a, double* g)
{
//*g = (0.0000000006253315801371527100000000000000 - 0.0000000000000000000000000000000000000000)/0.0003125000000000000100000000000000000000 - 0.5*1543.2000000000000000000000000000000000000000*(0.0000000012966958634259257000000000000000 + 0.0000000012966958634259257000000000000000);
*g = (i_2j - i_2jm1)/h - 0.5*a*(inj + injm1);
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
double i_2j;
double i_2jm1;
double inj;
double injm1;
double h;
double a;
i_2j = (double)mxGetScalar(prhs[0]);
i_2jm1 = (double)mxGetScalar(prhs[1]);
inj = (double)mxGetScalar(prhs[2]);
injm1 = (double)mxGetScalar(prhs[3]);
h = (double)mxGetScalar(prhs[4]);
a = (double)mxGetScalar(prhs[5]);
double g = 10;
double *d_g;
cudaMalloc (&d_g, sizeof( double));
calculate<<<1,1>>>(i_2j,i_2jm1,inj,injm1, h, a, d_g);
cudaMemcpy(&g, d_g, sizeof(double), cudaMemcpyDeviceToHost);
printf ("%.40f \n", g);
}
Когда я вызываю функцию:
check_pre(0.0000000006253315801371527100000000000000,0.0000000000000000000000000000000000000000,0.0000000012966958634259257000000000000000,0.0000000012966958634259257000000000000000, 0.0003125000000000000100000000000000000000, 1543.2000000000000000000000000000000000000000)
В результате я получаю: 0.0000000000000000000001934886220713464500
Но когда я ставлюточное число для функции, которую я получил в результате, равно 0
, это должно быть ноль по сравнению с MATLAB
, я думаю, что моя проблема в том, когда я передаю двойное значение функции.Что я могу сделать, чтобы получить правильный результат?