繁体   English   中英

用大型矩阵编译函数

[英]sympy compiling functions with large matrices

我一直在使用sympy来处理微分方程组。 我象征性地编写方程,使用autowrap通过cython编译它们,然后将结果函数传递给scipy ODE求解器。 这样做的一个主要好处是,我可以使用sympy jacobian函数象征性地解决jacobian ,编译它,以及它也可以用于ODE求解器。

这对于大约30个变量的系统来说非常有用。 最近我尝试用150个变量来做,发生的事情是我在编译jacobian函数时耗尽了内存。 这是在Windows上使用anaconda和用于python的Microsoft Visual C ++ 14工具。 基本上在编译jacobian(现在是一个22000个元素的向量)时,链接步骤中的内存使用量上升到大约7GB(在我的8GB笔记本电脑上),最后崩溃。

在我去尝试拥有更多内存的机器之前,有人有一些建议吗? 其他操作系统或其他C编译器是否可能改善这种情况?

我知道很多人都做这类工作,所以如果有答案的话,对社区的很大一部分人来说都是有益的。

编辑:回应乔纳森的一些评论:

是的,我完全清楚这是一个N ^ 2问题。 雅可比是所有偏导数的矩阵,因此它的大小为N ^ 2。 这种扩展没有真正的方法。 但是,22000个元素的数组几乎不会在运行时产生内存问题 - 我只在编译期间遇到问题。

基本上我们有三个层次可以解决这个问题。

1)在没有jacobian的情况下解决ODE问题,或以某种方式将jacobian拆分为不具有150x150矩阵。 这将解决根本问题,但它肯定限制了我能做的事情,而且我还不确定编译雅可比功能是不可能的

2)改变一些关于sympy自动生成C代码的方式,将其拆分为多个块,为中间表达式使用更多函数,以某种方式使.c文件更小。 有更多同情经验的人可能对此有一些想法。

3)改变C编译方式,以便减少内存需求。

我认为通过发布一个更加面向#3( 大型数组的文字引用 - 编译器内存不足 )的单独问题,我会得到不同的受众回答。 事实上,这正是发生的事情。 或许#3的答案是“你不能”,但这也是有用的信息。

按照http://www.sympy.org/scipy-2017-codegen-tutorial/上发布的大量示例,我能够将其编译。

关键的事情是1)而不是使用autowrap ,直接编写C代码并对其进行更多控制。 除此之外,这允许将参数列表作为向量传递而不是扩展它。 这需要一些努力才能工作(通过distutils等设置编译器标志等),但最终它运行良好。 以上面链接的课程回购作为一个例子有很大帮助。

2)使用公共子表达式消除( sympy.cse )来显着减少雅可比元素的表达式的大小。

(1)在这种情况下,本身没有那么多帮助(虽然我能够用它来大大提高小型号的性能)。 代码仍然是200 MB而不是原来的300 MB。 但是将它与(2)( cse )相结合,我能够将它降低到1.7 MB(尽管有14000个临时变量)。

cse发生在我的笔记本电脑约20-30分钟。 之后,它会快速编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM