Вывод из приложения fortran не отображается в Matlab

У меня возникают проблемы с выводом из приложения fortran, выполняемого из Matlab. Мы используем Matlab для вызова ряда приложений fortran и отображения вывода и результатов.

Я использую gfortran в OSX для создания одной из этих программ, которая выполняет большой объем вывода в файл и небольшой вывод в стандартный вывод для отслеживания прогресса. Вывод на стандартный вывод выполняется в основном с помощью операторов print *, но я также пробовал писать (*, *). Программа использует OpenMP, но ни один из операторов print * или write (*, *) не выполняется в параллельных секциях OpenMP. Все работает нормально, когда программа выполняется с терминала. Однако, когда программа выполняется изнутри Matlab, нет вывода из stdout. Однако вывод файла работает нормально.

Кроме того, тот же код, скомпилированный с помощью ifort Intel, без проблем отображает свой вывод в Matlab. К сожалению, у меня нет постоянного доступа к компилятору Intel.

Я уверен, что вывод будет на стандартный вывод (а не на стандартный поток), и я попытался очистить оба кода из кода (вызовите flush (6) и вызовите flush (0)), но это, похоже, не вызывает разница.

Я не уверен, что могло быть причиной этого. Есть предположения?

некоторая важная информация: ОС: OSX 10.6.8 (64-битный режим)

Матлаб: R2012b

gfortran: 4.7.2 (получено через fink)

флаги компиляции: -cpp -fopenmp -ffree-line-length-0 -fno-range-check -m64 -static-libgfortran -fconvert = little-endian -fstrict-aliasing

РЕДАКТИРОВАТЬ:

Я провел еще несколько тестов, создав простую программу приветствия:

program printTest
write (*,*) 'hello'
end program

составлено с помощью ...

gfortran test.f90 -o test

который демонстрирует такое же поведение.

Я также пробовал компилировать с более ранней версией gfortran (4.2.1), которая дала некоторые интересные результаты. он отлично работает в терминале, но в Matlab я получаю следующее:

! ./ test dyld: сбой ленивого связывания символа: символ не найден: __gfortran_set_std Ссылка на: /Users/sah/Desktop/./test Ожидается в: /Applications/MATLAB_R2012b.app/sys/os/maci64/libgfortran.2.dylib

dyld: символ не найден: __gfortran_set_std Ссылка из: /Users/sah/Desktop/./test Ожидается в: /Applications/MATLAB_R2012b.app/sys/os/maci64/libgfortran.2.dylib

./test: Ловушка трассировки / точки останова

Это заставляет меня думать, что это проблема с библиотекой. использование -static-libgfortran в этом случае дает тот же результат.


person Scot Halverson    schedule 27.09.2012    source источник
comment
Как вы выполняете программу из Matlab?   -  person IanH    schedule 28.09.2012
comment
Обычно в реальной программе Matlab используется следующий метод: system (['cd', handles.indir, '; chmod u + x ./qp.exe', ... '; ./ qp.exe']) ; программа копируется в каталог и затем выполняется. Я также пробовал перейти в каталог и запустить! Qp.exe   -  person Scot Halverson    schedule 28.09.2012
comment
Хорошо - если слева от системного вызова нет ничего (no [xxx, yyy] = system (...)   -  person IanH    schedule 28.09.2012


Ответы (3)


Я считаю, что Matlab - это однопоточное приложение. Когда вы вызываете многопоточную исполнительную программу, я видел различные проблемы с передачей вывода обратно в Matlab. Вы думали о перекомпиляции в файл Fortran mex?

person macduff    schedule 27.09.2012
comment
Matlab имеет некоторые параллельные возможности. См. Пример структуры цикла parfor. Вдобавок мне кажется странным, что один и тот же точный код на одном и том же компьютере в одинаковых условиях работает, если он скомпилирован с помощью компилятора Intel. Что касается компиляции в файл mex, нет, я еще не пробовал. До сих пор я пытался избежать этого из-за изменений в остальной части системы, которые для этого потребуются. - person Scot Halverson; 28.09.2012
comment
Правда, надстройки Matlab обеспечивают многопоточную производительность, но я вполне уверен, что это однопоточное приложение. - person macduff; 28.09.2012
comment
Это вполне могло быть. Однако моя редакция выше показывает, что проблема не является результатом параллельной обработки openMP. Простая программа, которая просто печатает "привет", даже не работает в моей настройке. - person Scot Halverson; 01.10.2012

Я не уверен, что файл mex будет печататься на стандартный вывод лучше, чем отдельный исполняемый файл.

Есть другие варианты. Один из них - записать (добавить) всю вашу диагностику в файл и просто просмотреть файл, когда захотите. Emacs, например, автоматически "возвращает" содержимое файла каждую секунду или в зависимости от того, какой интервал вы установили. Другой вариант - преобразовать исходный код fortran в исходный код Matlab (см. F2matlab) и сохранить все это в Matlab.

bb

person Ben Barrowes    schedule 28.09.2012
comment
Спасибо за предложения. Вывод в файл может быть жизнеспособным вариантом, хотя меня это не очень волнует. Преобразование в код Matlab, вероятно, не сработает. Исполняемый файл построен из ~ 20 000 LOC, и моя главная цель - сделать его быстрым (отсюда и OpenMP). Я думаю, что преобразование в код Matlab было бы шагом в неправильном направлении, учитывая это. - person Scot Halverson; 28.09.2012

Согласно документации по системным функциям

[status, result] = system ('command') возвращает статус завершения в переменную статуса и возвращает результат команды в переменную результата.

[status, result] = system ('command', '- echo') также принудительно выводит вывод в командное окно.

Поэтому вы должны использовать параметр '-echo' для системного вызова, чтобы увидеть вывод непосредственно в командном окне.

system(['cd "',handles.indir,'";chmod u+x ./qp.exe',... ';./qp.exe'], '-echo')

или вы можете присвоить stdout переменной:

[ret txt] = system(['cd "',handles.indir,'";chmod u+x ./qp.exe',... ';./qp.exe'])
person angainor    schedule 29.09.2012
comment
К сожалению, не повезло. Я возлагал большие надежды на параметр -echo, но ни один из методов не помог. - person Scot Halverson; 01.10.2012
comment
@ScotHalverson Тестовая программа тоже не работает? Что возвращается системным вызовом в ret и txt при запуске простой тестовой программы? - person angainor; 01.10.2012
comment
нет, не работает и для тестового приложения. ret - 0, текст - пустая строка ('') [ret test] = system ('./ test') ret = 0 test = '' ›› system ('./ test', '-echo') ans = 0 - person Scot Halverson; 01.10.2012
comment
@ScotHalverson ну, это не очень хорошо :) Я думаю, это как-то связано с тем, что вы используете Mac. Может поменять компилятор gfortran? - person angainor; 01.10.2012
comment
Я пробовал несколько версий gfortran, начиная с версии 4.2.3, и все они, похоже, демонстрируют эту проблему. На данный момент я ограничен gfortran. g95 не поддерживает OpenMP, и мне неизвестны другие компиляторы F / OSS fortran, которые поддерживают. - person Scot Halverson; 01.10.2012
comment
@ScotHalverson Я больше имею в виду провайдера вашего гфортрана. Вот список двоичных дистрибутивов. Кроме того, в Xcode этого нет? Недавно они выпустили инструменты командной строки, которые значительно меньше всех xcode. - person angainor; 01.10.2012
comment
Я считаю, что Xcode не содержит gfortran. Я пробовал пару дополнительных версий компилятора по вашей ссылке, но снова испытываю то же самое. - person Scot Halverson; 01.10.2012