Использование памяти удвоилось при передаче матрицы в общий объект

У меня есть линейный набор уравнений, где A x = b, а A — большая матрица, а b также известна. Матрица A настроена с помощью python. Теперь я хочу инвертировать матрицу A, чтобы получить x.

A и b передаются программе на Fortran 90 через общий объект. Я скомпилировал программу на Фортране, используя numpy.f2py:

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])

При вызове программы на фортране использование памяти удваивается, видимо, из-за внутренней копии матрицы A и b. Однако, когда у меня есть вектор x, меня больше не интересуют A или b. Есть ли способ избежать этой внутренней копии и передачи A программе на фортране?

У меня уже была идея сохранить A и b на HD и прочитать их из программы Fortran, но это занимает очень много времени и не подходит для матриц того размера, с которым я имею дело.


person RoSt    schedule 30.10.2016    source источник
comment
Является ли исходный массив(ы) F упорядоченным?   -  person hpaulj    schedule 30.10.2016
comment
Нет, это C заказал. Но преобразование в F заказано не должно быть проблемой.   -  person RoSt    schedule 30.10.2016
comment
Преобразование из порядка C в порядок F требует копии   -  person ali_m    schedule 31.10.2016
comment
Это правда. Я подумал о немедленной настройке массива в порядке F.   -  person RoSt    schedule 31.10.2016


Ответы (1)


Внутренняя копия не будет сделана, если массивы находятся в F-порядке.

[Как заставить порядок массива numpy соответствовать стилю fortran? to-fortran- стиль][1]

person RoSt    schedule 02.11.2016