высокая точность расчетов в функции CUDA - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть неизвестная проблема, когда я передаю двойное число высокой точности в функцию 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, я думаю, что моя проблема в том, когда я передаю двойное значение функции.Что я могу сделать, чтобы получить правильный результат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...