CUDA 多精度库 CAMPARY:错误和示例

问题描述

我需要在 GPU 中处理多精度(实数)数组(使用 CUDA)。 为此,我尝试使用 CAMPARY(在 Internet 上一瞥建议使用此库)。 这个库在 GPU 和 cpu 中工作,但是,我在运行最基本的代码时遇到了问题。

cpu 中的一个简单代码是:

1º-CODE

#include <time.h>
#include "/home/CAMPARY/Doubles/src_cpu/multi_prec.h"

#define prec 2

int main()
{
    const char *A = "1.1111111111111112222222222222222333333333333333";

    const char *B = "0.000000000000002";


    multi_prec<prec> a(A);
    multi_prec<prec> b(B);
    multi_prec<prec> c;

    c = a + b;

    printf("---> a\n");
    a.prettyPrint();

    printf("---> b\n");
    b.prettyPrint();

    printf("---> c\n");
    c.prettyPrint();
}

输出:将A和B转换为a和b是不合适的。 "a" 和 "b" 的第二个组件不捕获超出双精度的数字。使用“multi_prec_certif.h”也会发生同样的情况

---> a
Prec = 2
   Data[0] = 1.11111111111111116045e+00
   Data[1] = 8.73223582987855410854e-17
---> b
Prec = 2
   Data[0] = 2.00000000000000015541e-15
   Data[1] = 0.00000000000000000000e+00
---> c
Prec = 2
   Data[0] = 1.11111111111111315886e+00
   Data[1] = 8.89209139735039237336e-17

2º-CODE

#include <time.h>
#include "/home/anxo/CAMPARY/Doubles/src_cpu/multi_prec.h"

#define prec 2

int main()
{
    double *A = new double[2];
    double *B = new double[2];
    double *E = new double[2];

    A[0] = 1.1111111111112;
    A[1] = 1.e-16;
    B[0] = 1.e-1;
    B[1] = 1.e-24;


    multi_prec<prec> a(A,2);
    multi_prec<prec> b(B,2);
    multi_prec<prec> c;

    c = a + b;

    printf("---> a\n");
    a.prettyPrint();

    printf("---> b\n");
    b.prettyPrint();

    printf("---> c\n");
    c.prettyPrint();
}

输出:当我手动将数字分成双打时,“a”和“b”具有正确的组成部分;但是,“+”操作(和其他)不保留多精度(参见“c”)。使用“multi_prec_certif.h”也会发生同样的情况

---> a
Prec = 2
   Data[0] = 1.11111111111119997830e+00
   Data[1] = 9.99999999999999979098e-17
---> b
Prec = 2
   Data[0] = 1.00000000000000005551e-01
   Data[1] = 9.99999999999999923700e-25
---> c
Prec = 2
   Data[0] = 1.21111111111120006711e+00
   Data[1] = 1.67332741531132522676e-17

最后,你知道我是否可以将多精度数的数组直接传输到GPU,还是必须将它们分解为标准双精度数并在GPU内部重新组合?

谢谢!!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)