首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >库达数学与C++数学

库达数学与C++数学
EN

Stack Overflow用户
提问于 2016-12-15 22:29:02
回答 1查看 2.2K关注 0票数 1

我用C++在CPU上实现了相同的算法,在GPU上用CUDA实现了相同的算法。在这个算法中,我必须数值求解一个积分,因为它没有解析答案。我要积分的函数是曲线的一个奇怪的多项式,在最后有一个exp函数。

在C++中

代码语言:javascript
复制
for(int l = 0; l < 200; l++)
{
    integral = integral + (a0*(1/(r_int*r_int)) + a1*(1/r_int) + a2 + a3*r_int + a4*r_int*r_int + a5*r_int*r_int*r_int)*exp(-a6*r_int)*step;
    r_int = r_int + step;
}

在数据自动化系统

代码语言:javascript
复制
for(int l = 0; l < 200; l++)
{
    integral = integral + (a0*(1/(r_int*r_int)) + a1*(1/r_int) + a2 + a3*r_int + a4*r_int*r_int + a5*r_int*r_int*r_int)*__expf(-a6*r_int)*step;
    r_int = r_int + step;
}

输出:

CPU: dose_output=0.00165546 GPU: dose_output=0.00142779

我认为math.h的exp函数和CUDA的__expf函数并不是计算相同的东西。我试图删除--use_fast_math编译器标志,认为这是原因,但这两种实现似乎都有大约20%的差异。

我正在使用CUDA来加速医学物理算法,而这种差异并不是很好,因为我不得不认为其中一个输出比另一个更真实,这对病人来说显然是灾难性的。

区别来自于函数本身吗?否则,我认为它可能来自于a_i因素的模件副本或我获取它们的方式。

编辑:“完整”代码

代码语言:javascript
复制
float a0 = 5.9991e-04;
float a1 = -1.4694e-02;
float a2 = 1.1588;
float a3 = 4.5675e-01;
float a4 = -3.8617e-03;
float a5 = 3.2066e-03;
float a6 = 4.7050e-01;

float integral = 0.0;

float r_int = 5.0;
float step = 0.1/200;

for(int l = 0; l < 200; l++)
{
    integral = integral + (a0*(1/(r_int*r_int)) + a1*(1/r_int) + a2 + a3*r_int + a4*r_int*r_int + a5*r_int*r_int*r_int)*exp(-a6*r_int)*step;
    r_int = r_int + step;
}

cout << "Integral=" << integral << endl; 

我建议在gpu和cpu上运行这部分。来自卡尔顿种子数据库的值

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-19 13:25:27

您正在使用CUDA API中exp()的不太精确的实现。

基本上,您可以在设备上使用三个版本的exp():

  • exp(),更精确的
  • (),这是一个单精度的“等效”。
  • __expf(),它是上一个版本的固有版本,但不太准确。

您可以在数据自动化系统文档的数学函数附录中更多地了解数学函数的不同实现,包括双精度、单精度和内部版本:

D.2.本征函数 本节中的函数只能在设备代码中使用。 在这些函数中,不太准确,但标准函数的一些功能的更快版本-- .They的同名--以__ (如__sinf(x))作为前缀。当它们映射到较少的本地指令时,它们会更快。

在同一页中,您将看到您删除的编译器选项只是防止每个函数被其内部版本所取代。在您解释使用exp()的内部版本时,删除此标志对您没有任何影响:

编译器有一个选项(-use_fast_math),它强制表8中的每个函数编译为其内部对应函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41174364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档