#matlab #gfortran #mex
#matlab #gfortran #mex
Вопрос:
Я хотел бы скомпилировать код fortran в Matlab 2017b, Win10, чтобы получить mex-файл. Кто-нибудь знает, как обойти ограничение matlab при выборе компилятора Intel и заставить его использовать вместо него gfortran?
У меня есть простой пример кода fortran, «timestwo.f».
#include "fintrf.h"
C======================================================================
#if 0
C
C timestwo.F
C .F file needs to be preprocessed to generate .for equivalent
C
#endif
C
C timestwo.f
C
C Computational function that takes a scalar and doubles it.
C This is a MEX-file for MATLAB.
C Copyright 1984-2011 The MathWorks, Inc.
C
C======================================================================
C Gateway routine
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
C Declarations
implicit none
C mexFunction arguments:
mwPointer plhs(*), prhs(*)
integer nlhs, nrhs
C Function declarations:
mwPointer mxGetPr
mwPointer mxCreateDoubleMatrix
integer mxIsNumeric
mwPointer mxGetM, mxGetN
C Pointers to input/output mxArrays:
mwPointer x_ptr, y_ptr
C Array information:
mwPointer mrows, ncols
mwSize size
C Arguments for computational routine:
real*8 x_input, y_output
C-----------------------------------------------------------------------
C Check for proper number of arguments.
if(nrhs .ne. 1) then
call mexErrMsgIdAndTxt ('MATLAB:timestwo:nInput',
'One input required.')
elseif(nlhs .gt. 1) then
call mexErrMsgIdAndTxt ('MATLAB:timestwo:nOutput',
'Too many output arguments.')
endif
C Validate inputs
C Check that the input is a number.
if(mxIsNumeric(prhs(1)) .eq. 0) then
call mexErrMsgIdAndTxt ('MATLAB:timestwo:NonNumeric',
'Input must be a number.')
endif
C Get the size of the input array.
mrows = mxGetM(prhs(1))
ncols = mxGetN(prhs(1))
size = mrows*ncols
C Create Fortran array from the input argument.
x_ptr = mxGetPr(prhs(1))
call mxCopyPtrToReal8(x_ptr,x_input,size)
C Create matrix for the return argument.
plhs(1) = mxCreateDoubleMatrix(mrows,ncols,0)
y_ptr = mxGetPr(plhs(1))
C Call the computational subroutine.
call timestwo(y_output, x_input)
C Load the data into y_ptr, which is the output to MATLAB.
call mxCopyReal8ToPtr(y_output,y_ptr,size)
return
end
C-----------------------------------------------------------------------
C Computational routine
subroutine timestwo(y_output, x_input)
real*8 x_input, y_output
y_output = 2.0 * x_input
return
end
Официально этот выпуск Matlab в Windows поддерживает только коммерческий компилятор Fortran Intel ifor. Есть ли какие-либо обходные пути для этого? Изначально я установил MinGW в качестве официального дополнения matlab, но я заметил, что этот конкретный выпуск не содержит gfortran.
Поэтому я вручную установил ту же версию (но с gfortran) и соответствующим образом изменил переменные среды.
Генерация кода на C в Mex работает без сбоев, но когда я попытался выбрать g-fortran, я получил следующее
>> mex -setup
MEX configured to use 'MinGW64 Compiler (C)' for C language compilation.
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. You will be required
to update your code to utilize the new API.
You can find more information about this at:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
To choose a different language, select one from the following:
mex -setup C
mex -setup FORTRAN
Error using mex
No supported compiler or SDK was found. For options, visit https://www.mathworks.com/support/compilers.
и, следовательно, когда я пытаюсь скомпилировать функцию, она ищет только компилятор Intel.
>> mex -v timestwo.F
Verbose mode is on.
Warning: MATLAB FORTRAN MEX Files are now defaulting to -largeArrayDims and 8 byte integers.
If you are building a FORTRAN S-Function, please recompile using the -compatibleArrayDims flag.
You can find more about adapting code to use 64-bit array dimensions at:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
No MEX options file identified; looking for an implicit selection.
... Looking for compiler 'Intel Visual Fortran Composer XE 2013 with Microsoft SDK 7.1' ...
... Looking for environment variable 'IFORT_COMPILER14' ...No.
... Looking for environment variable 'IFORT_COMPILER13' ...No.
Did not find installed compiler 'Intel Visual Fortran Composer XE 2013 with Microsoft SDK 7.1'.
... Looking for compiler 'Intel Visual Fortran Composer XE 2013 with Microsoft Visual Studio 2013' ...
... Looking for environment variable 'IFORT_COMPILER14' ...No.
... Looking for environment variable 'IFORT_COMPILER13' ...No.
Did not find installed compiler 'Intel Visual Fortran Composer XE 2013 with Microsoft Visual Studio 2013'.
... Looking for compiler 'Intel Parallel Studio XE 2015 for Fortran with Microsoft SDK 7.1' ...
... Looking for environment variable 'IFORT_COMPILER15' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2015 for Fortran with Microsoft SDK 7.1'.
... Looking for compiler 'Intel Parallel Studio XE 2015 for Fortran with Microsoft Visual Studio 2013' ...
... Looking for environment variable 'IFORT_COMPILER15' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2015 for Fortran with Microsoft Visual Studio 2013'.
... Looking for compiler 'Intel Parallel Studio XE 2015 for Fortran with Microsoft Visual Studio 2015' ...
... Looking for environment variable 'IFORT_COMPILER15' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2015 for Fortran with Microsoft Visual Studio 2015'.
... Looking for compiler 'Intel Parallel Studio XE 2016 for Fortran with Microsoft SDK 7.1' ...
... Looking for environment variable 'IFORT_COMPILER16' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2016 for Fortran with Microsoft SDK 7.1'.
... Looking for compiler 'Intel Parallel Studio XE 2016 for Fortran with Microsoft Visual Studio 2013' ...
... Looking for environment variable 'IFORT_COMPILER16' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2016 for Fortran with Microsoft Visual Studio 2013'.
... Looking for compiler 'Intel Parallel Studio XE 2016 for Fortran with Microsoft Visual Studio 2015' ...
... Looking for environment variable 'IFORT_COMPILER16' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2016 for Fortran with Microsoft Visual Studio 2015'.
... Looking for compiler 'Intel Parallel Studio XE 2017 for Fortran with Microsoft SDK 7.1' ...
... Looking for environment variable 'IFORT_COMPILER17' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2017 for Fortran with Microsoft SDK 7.1'.
... Looking for compiler 'Intel Parallel Studio XE 2017 for Fortran with Microsoft Visual Studio 2013' ...
... Looking for environment variable 'IFORT_COMPILER17' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2017 for Fortran with Microsoft Visual Studio 2013'.
... Looking for compiler 'Intel Parallel Studio XE 2017 for Fortran with Microsoft Visual Studio 2015' ...
... Looking for environment variable 'IFORT_COMPILER17' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2017 for Fortran with Microsoft Visual Studio 2015'.
... Looking for compiler 'Intel Parallel Studio XE 2017 for Fortran with Microsoft Visual Studio 2017' ...
... Looking for environment variable 'IFORT_COMPILER17' ...No.
Did not find installed compiler 'Intel Parallel Studio XE 2017 for Fortran with Microsoft Visual Studio 2017'.
Error using mex
No supported compiler or SDK was found. For options, visit https://www.mathworks.com/support/compilers.
Кому-нибудь удалось использовать gfortran вместо этого?
Заранее спасибо!
Комментарии:
1. Ifort можно бесплатно загрузить для некоммерческих целей и, возможно, более производителен, чем gfortran.
2. Привет, @Lingo, где вы видите, что Ifort можно бесплатно загрузить в некоммерческих целях? Matlab ищет только версии Intel Visual Fortran Composer XE.
3. Привет, я помню, как несколько лет назад скачал и успешно использовал его. Попробуйте начать отсюда software.intel.com/content/www/us/en/develop/articles / … выберите свой яд, он, вероятно, попросит вас заполнить какую-то регистрацию, а затем разрешить загрузку.
4. @Lingo только что получил компилятор Intel fortran. Я попробую.
5. Просто обратите внимание, Intel oneAPI теперь доступен бесплатно (как в beer) и в коммерческих целях.
Ответ №1:
Простой способ — использовать старый проект Gnumex, который «компилирует файлы matlab mex с помощью gcc на платформах Windows», как они описали. Однако gfortran может работать только для 32-разрядной версии, а для 64-разрядной версии есть некоторые проблемы.
Проблема возникает из MATLAB. Когда MATLAB использует компилятор, он вызывает множество библиотек, которые хранятся в ${MATLABroot}externlibwin64
, и предоставляет только библиотеку .lib для версии Windows. Mingw может успешно подключиться к .библиотека lib под 32-разрядной, но не 64-разрядной. Другим подходящим способом решения этой проблемы является то, что вы можете использовать reimp
для преобразования всех .библиотека lib в .a. Затем измените установочный файл C:Users${Yourname}AppDataRoamingMathWorksMATLAB${MATLABversion}mex_FORTRAN_win64.xml
и ${MATLABroot}binwin64mexoptsintel_fortran_*_vs*.xml
заставьте MATLAB использовать gfortran и ссылку на библиотеку .a.