Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
47
Добавлен:
24.02.2016
Размер:
183.81 Кб
Скачать

Литература:

1. Солодовников В. В., Дмитриев А. Н., Егупов Н. Д. Спектральные методы расчёта и проектирования систем управления. — М.: Машиностроение, 1986. — 440 стр., ил.

2. Методы классической и современной теории автоматического управления: Учебник в 3-х т. Т.2: Синтез регуляторов и теория оптимизации систем автоматического управления. / Под ред. Н. Д. Егупова. — М.: Изд–во МГТУ им. Н. Э. Баумана, 2000 — 748 с., ил.

Предпосылки.

Дальнейшим шагом по повышению скорости работы является компиляция m–функций в MEX–файлы или в исполняемые приложения. Дело в том, что процесс интерпретации циклов очень медленный и имеет следующий характер: интерпретатор читает строку кода и компилирует её. Если это происходит в цикле, то операция компиляции происходит всякий раз при чтении строки, на этом теряется достаточно много времени. Этого можно избежать, если функция будет откомпилирована в MEX-файл.

MEX–файл представляет из себя бинарный файл, который загружается интерпретатором MATLAB и может быть выполнен в его среде. В отличии от m–файлов, которые являются платформа–переносимыми, MEX–файлы являются машинно–ориентированными и поэтому имеют для платформ различные расширения (для Windows это dll, для Linux — mexlx, и т.д.).

MEX–файлы вызываются в среде MATLAB так же, как и m-файлы.

Для включения возможности компиляции MEX–файлов необходимо, что бы на компьютере был установлен один из следующих компиляторов: ANSI С/C++ или Fortran (варианты указаны в документации). Кроме того, если Вы хотите автоматизировать процесс компиляции m–файлов, то ещё нужно установить компонент MATLAB Compiler.

Установка компонента matlab Compiler.

Компонент MATLAB Compiler транслирует m–функцию с языка MATLAB в функцию на языке C/C++ или Fortran.

1. При установке MATLAB выбрать компонент “MATLAB Compiler”:

2. Выберите компонент C Math Library или C++ Math Library, если Вы планируете создавать собственные программы, использующие библиотеки MATLAB.

3. Необходимо сконфигурировать компилятор. Запишите в окне управления MATLAB команду, и ответьте на вопросы диалога:

» mex –setup

@ В директории /bin/ есть интерпретатор Perl (perl.exe) — самый распространённый язык программирования под CGI в Интернет.

4. Теперь можно создавать MEX–файлы из m–функций.

Создание MEX-файлов на основе m-функций.

Внимание! Этот раздел предполагает наличие установленного компонента MATLAB Compiler.

Для создания MEX–файла из m–файла, последний должен быть представлен как m–функция, например:

function g = squibo(n)

g = zeros(1,n);

g(1)=1;

g(2)=1;

for i=3:n

g(i) = sqrt(g(i-1)) + g(i-2);

end

Сохраните функцию и введите такую команду:

» tic; for i = 1:10; squibo(10000); end; toc

elapsed_time =

4.7600

»

Теперь используем возможности компилятора, для чего введите команду:

» mcc squibo

» tic; for i = 1:10; squibo(10000); end; toc

elapsed_time =

3.0500

»

То есть мы получили прирост скорости, однако он невелик, всего около 35%. Для повышения скорости необходимо использовать директивы: -r (все числа действительные), -i (размеры матрицы фиксированы):

» mcc –ri squibo

» tic; for i = 1:10; squibo(10000); end; toc

elapsed_time =

0.0510

»

Теперь скорость вычислений заметно возросла. Директивы влияют на код входного языка компилятора. Это и обуславливает разную скорость. Директивы –r и –i можно заменить указанием в m–файле pragma–директив. Указание в m–файле директивы %#inboundsэквивалентно директиве –i компилятора, а директивы%#realonlyэквивалентно –r. При указании pragma–директив, выше указанные директивы можно опустить.

Компиляция двух функций в один MEX-файл

Часто в m–файле (1) осуществляется вызов другой m-функции (2). При компиляции (1), функция (2) может быть тоже откомпилирована (заменена аналогичной API–функцией), а может быть осуществлено обращение из MEX–файла к интерпретатору для вычисления этой функции (2). Обращение к интерпретатору (даже если функция (2) является MEX–файлом) нежелательно из–за потери скорости, особенно в цикле. Необходимо, чтобы функции (1) и (2) были скомпилированы в единый MEX–файл. Чтобы определить, для каких функций будет осуществляться вызов интерпретатора из MEX–файла, при компиляции указывается директива –w. Например:

function g = squibo(n)

%#realonly

%#inbounds

g = zeros(1,n);

g(1)=1;

g(2)=1;

for i=3:n

g(i) = sqrt(g(i-1)) + g(i-2) + myfunc(i);

end

function z = myfunc(x)

%#realonly

%#inbounds

temp1 = x * 10 * sin(x);

z = round(temp1);

» mcc squibo

» tic; squibo(10000); toc

elapsed_time =

2.3700

» mcc –w squibo

Warning: MATLAB callback of 'myfunc' will be slow (line 8)

Для предотвращения вызовов, обе функции должны быть скомпилированы в один MEX–файл таким образом:

» mcc -w squibo myfunc

» tic; squibo(10000); toc

elapsed_time =

0.0490

»

Разница очевидна.

Принципы оптимизации, указанные в части 3 справедливы и для MEX–файлов.

Создание MEX-файлов на C/C++.

Создание MEX–файлов на входном языке компилятора позволяет максимально использовать производительность компьютера, так как вы можете написать наиболее оптимальный код. Перед вами открываются все возможности языка C++ (например, создание классов), можно делать вставки на Ассемблере, при этом сохраняются возможности графического интерфейса MATLAB. Написание MEX–файлов “руками” оправдано для критичных по времени вычислений, например, статистические испытания объекта.

Для создания MEX–файлов на входном языке компилятора необходим непосредственно ANSI C/C++ или Fortran компилятор. Для возможности компиляции в среде MATLAB при его установке выбирать дополнительные компоненты MATLAB Compiler, C Math Library или C++ Math Library необязательно!

С помощью команды mex -setup в окне управления MATLAB осуществляется конфигурирование системы , если ещё этого не сделано:

» mex –setup

Все примеры будут рассмотрены для языка C/C++. Использовался компилятор MS VC++ 5.0.

Каждый MEX–файл включает следующие фрагменты кода:

  • Точка входа;

  • Анализ корректности входных/выходных аргументов;

  • Связывание с локальными переменными входных и выходных аргументов;

  • Тело программы;

  • Выход из программы.

Соседние файлы в папке METOD