Tag: 科学计算

Python运行时:重新编译和重用C库

我正在开发一种用于对用户定义函数进行数值分析的工具。 我们的想法是在Python中创建一个方便的UI,用户可以在其中输入C函数,然后按下按钮 – 并接收一些输出数据。 计算可能需要几分钟或几小时,因此不能接受仅限Numpy的性能。 我尝试了以下方法:基于Python的UI调用gcc,从用户函数编译dll,这是我在Cython包装中使用的基于C的核心算法所使用的。 它工作,但由于没有办法完全卸载python模块,我不能重新编译用户定义的函数,直到整个UI程序关闭并再次运行。 我现在看到的唯一方法是分离计算核心和UI进程,然后通过共享内存/消息传递使它们进行交互。 当用户想要更新他的function时,程序终止核心,重新编译DLL并再次启动核心。 在这种情况下你能建议任何常见做法吗? 谢谢!

浮点优化 – 指南

我们需要通过在C / C ++中实现特定算法来解决的大多数科学计算问题要求精度远低于双精度。 例如, 1e-6 1e-7精度覆盖了99%的ODE求解器或数值积分的情况。 即使在我们确实需要更高精度的极少数情况下,通常数值方法本身也会失败,然后才能达到接近双精度的精度。 示例:即使在因舍入误差而求解标准nostiff常微分方程时,我们也不能期望从简单的Runge-Kutta方法获得1e-16精度。 在这种情况下,双精度要求类似于要求更好地逼近错误答案。 然后,在大多数情况下,积极的浮点优化似乎是一个双赢的局面,因为它使您的代码更快(更快!)并且它不会影响您的特定问题的目标准确性。 也就是说,确保特定的实现/代码对fp优化是稳定的似乎非常困难。 古典(有点令人不安)的例子:GNL,GNU科学图书馆,不仅是市场上的标准数字图书馆,而且它是一个写得很好的图书馆(我无法想象自己做得更好)。 但是,GSL对fp优化不稳定。 实际上,例如,如果使用intel编译器编译GSL,那么除非打开-fp-model strict标志关闭fp优化,否则它的内部测试将失败。 因此,我的问题是:是否存在编写代码的一般准则,这些准则对于积极的浮点优化是稳定的。 这些指南语言(编译器)是否具体。 如果是这样,那么C / C ++(gcc / icc)的最佳实践是什么? 注1:这个问题不是询问gcc / icc中的fp优化标志是什么。 注2:这个问题并不是要求关于C / C ++优化的一般指导原则(比如不要对很多小型函数使用虚函数)。 注3:这个问题并不是要求大多数标准fp优化列表(比如x / x – > 1)。 注4:我坚信这不是类似于传统的“最酷的服务器名称”的主观/偏离主题的问题。 如果您不同意(因为我没有提供具体示例/代码/问题),请将其标记为社区维基。 我对答案比对获得一些状态点更感兴趣(不是它们不重要 – 你明白了!)。