MATLAB码与C(C++)与IPP码计算结果的区别
Difference between computation results of MATLAB code and C(C++) with IPP code
我需要提高 MATLAB 代码的计算速度。为此,我使用英特尔 IPP 库用 C 语言重写了我的程序,以便对向量进行操作。在这里我遇到了一个问题:经过一些步骤后,MATLAB 中的主计算圈程序和我的 C 程序转到算法的不同路径。发生这种情况是因为计算不是绝对相等的,并且我的程序与 MATLAB 计算结果相比累积了错误。出于这个原因,我的程序不能计算正确的梯度,整个优化算法不能很好地计数。所以我的计算速度提高了,但失去了计算效率 - 第 100 步 MATLAB 计算优化误差为 0.004,C 程序计算误差为 0.05,这在我的任务中很重要。
我检查了哪个函数给了我错误,以及我发现了什么:常见的运算(如 ippsAdd_64f_A53、ippsSub_64f_A53、ippsMul_f64_A53、ippsDiv_64f_A53和通常的 C 运算 ,-,*,/) 等于 MATLAB 结果并且总和误差为零,但 math.h 双曲函数在包含 75699 个元素的数组上给出总和误差大约 -3..-5e-13。英特尔函数ippsCosh_64f_A53和其他函数给出的总和误差约为 -1..-5e-14。
您知道一个用于计算高精度双曲和指数函数的库吗?或者,也许Visual Studio 2012中有一些编译器设置可以帮助我?
在安装了英特尔并行工作室 XE 2013 的 VS 2012 中以 Ipp64f 数据类型(双精度)进行的所有计算。
PS:总和误差是在 MATLAB 中计算的。我将 C 程序中的数组保存到 4 级 mat 文件中,然后导入到 MATLAB 中,在那里我汇总了 MATLAB 数组和导入数组之间的差异,如 sum(M_cosh - C_cosh);
不是答案,更多的是扩展评论:
你写
我需要提高 MATLAB 代码的计算速度
并询问
是的,你知道一个计算高精度三角函数和 指数函数?
我知道有几个这样的库,但它们实现的浮点数比当前 CPU(主要是 32 位和 64 位)上通常提供的位数多,并且在软件中实现了对这些数字的算术。 为了提高计算速度,这样的库是无用的,它们提高的精度是以增加执行时间为代价的。 对于许多其他用户来说,这是一个合理的权衡。
我不知道有任何广泛使用或备受推崇的库在机器编号上实现精度保持算法。 这里没有篇幅来详细介绍,但要介绍这个问题,你可能比开始阅读 Kahan 的求和算法更糟糕。
Mathworks在透露Matlab实现的算法方面有些腼腆。 然而,Matlab的大多数计算内核都是用C(或C++,我相信)编写的,并编译成库。它们中的许多现在也是多线程的。 如果您尝试编写优于 Matlab 的代码,则必须编写多线程、高性能的数字代码。
得知 Matlab 实现的算法确实具有精度保持功能,我一点也不感到惊讶。 毕竟,Mathworks试图为市场提供一种工具,该工具可以解决各种问题,而无需用户考虑低级问题,例如机器精度是否足以满足问题和数据集的特定组合。
最后。你的第一次尝试没有成功,我并不感到惊讶,尽管击败Matlab的速度令人印象深刻。 我怀疑地期待着,当你报告成功时,你会感到惊喜,你自己的代码在时间上优于 Matlab 并产生令人满意的结果。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- WebGL2 和 C++ 上的浮点计算结果不同
- 术语的计算结果不是采用0个参数的函数
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- 在C++中,是否可以编写一个条件的lambda,即只是一个计算结果为真或假的条件
- C++ 函数指针的计算结果为 1
- 为什么 02000 的计算结果为 1024
- 如何让编译器忽略这个计算结果为 false 的 if-constexpr?
- 为什么需要 FPU 重置以防止 NaN 结果传播到下一个计算结果?
- C++:术语的计算结果不是采用 1 个参数的函数
- 如果满足嵌套条件,则计算结果未显示结果C
- 为什么这个条件运算符的计算结果为 int?
- 在线程错误 C2064 中:term 的计算结果不为 0 个参数的函数
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- 提升线程:术语的计算结果不为 0 个参数