【问题标题】:Memory usage doubled when passing matrix to shared object将矩阵传递给共享对象时内存使用量翻倍
【发布时间】:2016-10-30 16:33:11
【问题描述】:

我有一组线性方程,其中 A x = b 并且 A 是一个大矩阵,并且 b 也是已知的。 矩阵A是用python设置的。 现在我想反转矩阵A得到x。

A 和 b 通过共享对象传递给 Fortran 90 程序。我使用 numpy.f2py 编译了 Fortran 程序:

import numpy.f2py.f2py2e as f2py2e
import sys, os
sys.argv += "-lmkl_rt -c -m MKL_MODULE MKL_WRAPPER.f90".split()
f2py2e.main() 

最后,我调用了 f90 子程序:

MKL_MODULE.mkl_wrapper.call_dgelsd(A, b, np.shape(A)[0], np.shape(A)[1])

调用 fortran 程序时,内存使用量加倍,显然是由于矩阵 A 和 b 的内部副本。 但是,一旦我有了向量 x,我就不再对 A 或 b 感兴趣了。 有什么办法可以避免内部复制并将 A 传递给 fortran 程序?

我已经有了将 A 和 b 保存到 HD 并从 Fortran 程序中读取它的想法,但这需要很长时间,并且对于我正在处理的大小的矩阵来说并不是一个真正的选择。

【问题讨论】:

  • 原始数组F 是否有序?
  • 不,它的 C 排序。但是转换成Forder应该没问题。
  • 从C订单转换为F订单需要副本
  • 确实如此。我考虑过立即按 F 顺序设置数组。

标签: python numpy shared-objects f2py


【解决方案1】:

如果数组是 F 顺序,则不会进行内部复制

[How to force numpy array order to fortran style? to-fortran 风格][1]

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    相关资源
    最近更新 更多