Документация
Можно использовать WLAN Toolbox™ вместе с MATLAB ® Coder™ к:
- Создайте файл MEX, чтобы ускорить ваше приложение MATLAB.
- Сгенерируйте ANSI ® / ISO ® совместимый исходный код C/C++, который реализует ваши функции MATLAB и модели.
- Сгенерируйте независимый исполняемый файл, который запускается независимо от MATLAB на вашем компьютере или другой платформе.
В общем случае кодом, вы генерируете использование тулбокса, является портативный код С ANSI. Для того, чтобы использовать генерацию кода, вам нужна лицензия MATLAB Coder . Для получения дополнительной информации смотрите Начало работы с MATLAB Coder (MATLAB Coder) .
Используя MATLAB Coder
Создание файла MEX MATLAB Coder может существенно ускорить ваш код MATLAB. Это — также удобный первый шаг в рабочем процессе, который в конечном счете приводит к абсолютно автономному коду. Когда вы создаете файл MEX, он запускается в среде MATLAB. Его вводы и выводы доступны для контроля точно так же, как любая другая переменная MATLAB. Можно затем использовать средства MATLAB для визуализации, верификации и анализа.
Самый простой способ сгенерировать файлы MEX из вашего кода MATLAB при помощи codegen (MATLAB Coder) функция в командной строке. Например, если у вас есть существующая функция, myfunction.m , можно ввести команды в командной строке, чтобы скомпилировать и запустить MEX-функцию. codegen (MATLAB Coder) добавляет специфичное для платформы расширение этого имени. В этом случае, «mex» суффикс добавляется.
codegen myfunction.m myfunction_mex;
В рамках вашего кода можно запустить определенные команды или как сгенерированный код C или при помощи движка MATLAB. В случаях, где изолированная команда еще не сделала, чтобы генерация кода поддержала, можно использовать coder.extrinsic (MATLAB Coder) команда, чтобы встроить команду в ваш код. Это означает, что сгенерированный код повторно входит в среду MATLAB, когда это должно запустить ту конкретную команду. Это также полезно, если вы хотите встроить команды, которые не могут сгенерировать код (такой как функции построения графика).
Чтобы сгенерировать независимые исполняемые файлы, которые запускаются независимо от среды MATLAB, создайте проект MATLAB Coder в Интегрированной среде разработки (IDE) MATLAB Coder . В качестве альтернативы можно вызвать codegen (MATLAB Coder) команда в среде командной строки с соответствующими параметрами конфигурации. Независимый исполняемый файл требует, чтобы вы записали свой собственный main.c или main.cpp функция. Смотрите Генерирующие Автономные Исполняемые файлы C/C++ из кода MATLAB (MATLAB Coder) для получения дополнительной информации.
Setup Компилятора C/C++
Перед использованием codegen (MATLAB Coder) , чтобы скомпилировать ваш код, необходимо настроить компилятор C/C++. Для 32-битных платформ Windows, MathWorks ® предоставляет компилятор по умолчанию MATLAB. Если ваша установка не включает компилятор по умолчанию, можно предоставить собственный компилятор. Для текущего списка поддерживаемых компиляторов см. Поддерживаемые и Совместимые Компиляторы на веб-сайте MathWorks. Установите компилятор, который подходит для вашей платформы, затем считайте Подготовку C или Компилятора C++ (MATLAB Coder) . После установки, в командной строке MATLAB, запускают mex -setup . Можно затем использовать codegen (MATLAB Coder) функция, чтобы скомпилировать ваш код.
Функции и системные объекты та генерация кода поддержки
Все функции WLAN Toolbox и Системные объекты поддерживают генерацию кода.
Смотрите также
Функции
- codegen (MATLAB Coder) | mex
Похожие темы
- Рабочий процесс генерации кода (MATLAB Coder)
- Сгенерируйте код С от видео кода MATLAB
MathWorks MATLAB
Запуск графического пользовательского интерфейса производится с использованием технологии X Window, следующей командой:
/opt/shared/matlab/r2013b/bin/matlab
module load matlab/r2013b matlab
Графический интерфейс должен запускаться только на узлах кластера, с помощью интерактиыного режима PBS (‘qsub -I -X …’), но не на интерфейсном сервере.
Общие сведения
Есть несколько вариантов запуска MATLAB-программ с использованием кластера:
Запуск MATLAB-программ в пакетном режиме на отдельных узлах. Для этого в описании сценария запуска задачи необходимо вызвать MATLAB командой
matlab -nodisplay -nodesktop -nojvm -nosplash -r "myfunc"
при условии, что в текущей директории есть файл myfunc.m , в котором определена функция myfunc . В этом случае число одновременно запущенных расчетов ограничено числом имеющихся у нас лицензий. Можно запустить одновременно пять расчетов.
Компиляция программ MATLAB в исполняемые файлы для запуска на любом числе компьютеров. Для этого используется компилятор Matlab Compiler. Для запуска этого компилятора требуется отдельная лицензия.
Запуск в параллельном режиме с использованием распределенных массивов и тех функций ядра MATLAB, для которых существует параллельная реализация. Для этого необходимо создать массив, который будет передаваться в качестве аргумента функциям MATLAB как распределенный (distributed). Этот вариант потребует изменений в MATLAB-программе. Подробнее можно прочитать в документации к Parallel Computing Toolbox. В этом режиме можно использовать 16 и более параллельных процессов.
Вызов функций matlab из C-программы. Подробнее об этом методе можно прочитать в документации к функции »mex».
Пожалуй, самый простой способ, это способ, не требующий компиляции, т.е. способ № 1. О нём подробнее рассказано в следующем разделе.
Запуск MATLAB-программ в пакетном режиме
Простую программу на matlab можно запустить в пакетном режиме. В качестве примера возьмем такую программу:
function myfunc A = rand(5); csvwrite('eig.txt',eig(A));
Эта программа генерирует случайную квадратную матрицу, вычисляет вектор её собственных значений и записывает этот вектор в файл eig.txt .
Запишем эту программу в файл myfunc.m ,
в той же директории создадим файл для запуска расчета run_myfunc.sh следующего содержания:
#!/bin/bash #PBS -l walltime=00:10:00 #PBS -l select=1:ncpus=1 cd $PBS_O_WORKDIR module load matlab/r2013b matlab -nodisplay -nodesktop -nojvm -nosplash -r "myfunc"
через некоторое время после постановки расчета в очередь командой qsub run_myfunc.sh в этой же директории будет создан файл eig.txt , содержащий пять вещественных или комплексных чисел, вычисленных с одинарной точностью.
MATLAB Compiler
Документация:
Ниже приведены ссылки на официальные страницы с описанием текущей версии MATLAB Compiler. Хотя там рассматривается более новая версия, чем установлена у нас, ссылки всё равно могут быть полезны:
Каждый пользователь перед первым использованием MATLAB Compiler должен создать персональный файл с параметрами компиляции. Для этого на интерфейсном сервере нужно выполнить:
module load matlab/r2013b mbuild -setup
Команда выведет на экран:
Options files control which compiler to use, the compiler and link command options, and the runtime libraries to link against. Using the 'mbuild -setup' command selects an options file that is placed in /mnt/storage/home/hpcuser/.matlab/R2013b and used by default for 'mbuild'. An options file in the current working directory or specified on the command line overrides the default options file in /mnt/storage/home/hpcuser/.matlab/R2013b. To override the default options file, use the 'mbuild -f' command (see 'mbuild -help' for more information). The options files available for mbuild are: 1: /mnt/storage/opt/shared/matlab/r2013b/bin/mbuildopts.sh : Build and link with MATLAB Compiler generated library via the system ANSI C/C++ compiler 0: Exit with no changes Enter the number of the compiler (0-1):
Нужно ввести ‘1‘ и нажать кнопку Enter.
В результате файл со стандартными настройками компиляции будет скопирован в домашнюю директорию пользователя в файл ‘~/.matlab/R2013b/mbuildopts.sh‘
По умолчанию для компиляции используется системный компилятор GCC, но при необходимости файл с опциями может быть скорректирован пользователем.
Для компиляции:
Запустите интерактивную задачу (‘qsub -I -X …’) для получения доступа к узлу кластера.

Запустите на узле MATLAB GUI , переключите вверху на закладку ‘APPS’ и нажмите на стрелочку справа от строки с иконками:
В выпадающем списке в разделе ‘Application deployment’ нажмите на иконку ‘Application Compiler‘. В результате откроется окно приложения MATLAB Compiler.
Нажмите на иконку ‘+’ справа от поля ‘Add main file‘, выберите файл MATLAB’а с кодом. Например, пусть это будет ‘myfunc.m’
Нажмите на зелёную иконку ‘Package‘ справа.
Когда компиляция завершится, откроется окно с тремя 3 директориями, содержащими 3 варианта скомпилированного приложения:
for_redistribution
for_redistribution_files_only
for_testing
Для запуска полученного исполняемого файла на компьютере без установленного MATLAB необходимо предварительно установить пакет MATLAB Compiler Runtime (MCR). Версия MCR должна совпадать с версией MATLAB, использованного при компиляции (в нашем случае, это ‘R2013b’).
Все дистрибутивы MCR можно свободно скачать с официальной страницы: https://www.mathworks.com/products/compiler/mcr.html
Дистрибутив MCR для Linux x64, соответствующий MATLAB R2013b, также можно взять на кластере — это файл ‘/opt/shared/matlab/r2013b/toolbox/compiler/deploy/glnxa64/MCRInstaller.zip’
На нашем комплексе MCR уже установлен в директорию ‘/opt/shared/matlab/r2013b.mcr‘. При необходимости самостоятельно установить MCR выполните:
unzip MCRInstaller.zip
или, если дистрибутив скачан с сайта:
unzip MCR_R2013b_glnxa64_installer.zip
./install
Запуск скомпилированного приложения из директории ‘for_testing’ осуществляется с помощью скрипта ‘run_myfunc.sh’ (название скрипта зависит от названия модуля), которому в качестве параметра необходимо передать путь до установленного MCR:
./run_myfunc.sh /opt/shared/matlab/r2013b.mcr
Скрипт ‘run_myfunc.sh’ настраивает необходимые переменные окружения в соответсвии с путём до установленного MCR и затем запускает находящийся рядом исполняемый бинарный файл ‘myfunc’.
Нюансы использования компилятора смотрите в MATLAB Compiler User’s Guide R2013b.
Parallel Computing Toolbox
Технология, позволяющая распараллеливать выполнение программ на несколько процессорных ядер, а также использовать NVidia GPU.
Distributed Computing Server
Предоставляет возможность запуска программ MATLAB (в том числе, распараллеливающихся на несколько вычислительных узлов) на кластере, через разные планировщики, включая PBS Pro. Является развитием ‘Parallel Computing Toolbox’. Пользователь работает через стандартный графический интерфейс MATLAB (далее называемый ‘клиент’) и через него получает дополнительные вычислительные ресурсы на кластере. На нашем комплексе возможны два варианта использования, настраиваемые разными способами:
Клиент работает на узле кластера, пользователь взаимодействует с ним с использованием технологии X Window. Этот способ является предпочтительным.
Клиент работает на персональном компьютере пользователя, с которого имеется доступ к кластеру по протоколам SSH/SFTP.
Настройка клиента на кластере
С помощью интерактивной задачи PBS попасть на узел и запустить MATLAB через X Window:
module load matlab/r2013b matlab
В закладке Home открыть Environment → Parallel → Manage Cluster Profiles.
В появившемся окне создать профиль: Add → Custom → PBS Pro
Нажать ‘Edit‘, изменить такие параметры:
JobStorageLocation — директория для временных файлов. В принципе, можно оставить незаполненным, но лучше указать поддиректорию в своей домашней директории или в рабочей области.
NumWorkers = число, сколько ядер процессора будет запрашиваться.
HasSharedFileSystem = true
RshCommand = ssh
Также обратите внимание на SubmitArgumet и ResourceTemplate — с их помощью можно передавать команде ‘qsub’ дополнительные параметры, а также изменять правило генерации ‘select’ для qsub.
Переключиться на закладку ‘Validation results’. Нажать кнопку ‘Validate‘. Все тесты должны завершиться со статусом ‘passed’.
При желании через меню окна ‘Cluster Profiles Manager’ можно переименовать настроенный профиль и установить его как ‘профиль по умолчанию’.
Настройка клиента на ПК
Если клиент работает на операционной системе семейства Windows, необходимо преобразовать закрытую часть персонального RSA ключа в формат, используемый в Unix-системах:
Запустить ‘PUTTYGEN.EXE’
Кнопкой ‘Load’ загрузить свой ранее созданный .ppk-файл
Сохранить в нужном формате: Conversion → Export OpenSSH key
Получившийся файл должен содержать примерно такое:
-----BEGIN RSA PRIVATE KEY----- MIICWgIBAAKBgQCA2/bpBoLogSg51qhIDIU+KaSPhfm3fhTVAIQdgjQwdmsKDQne M0S6QvKfj3+tX5NJdV0WBie2F0NSgRCvtPZj8Z6/edL/fanW7bUBQiDCkspWC/yV . XsaozzouYGPk8OvtAkB8Uo2OK5fOxLTV1pglGNd9WbG/kuWOBYeIlBGCPAhy0jLo Xo91ZfMgwwzP1pP5hIhf86axqD5ATqgveMuit+tj -----END RSA PRIVATE KEY-----
Перейти в директорию на персональном компьютере, в которую установлен MATLAB
Скопировать содержимое поддиректории ‘toolbox\distcomp\examples\integration\pbs\nonshared‘ в ‘toolbox\local\‘
Открыть файл ‘toolbox\local\getSubmitString.m‘ и отредактировать, заменив
submitString = sprintf('qsub -N %s -j oe -o %s %s %s %s', . jobName, quotedLogFile, envString, additionalSubmitArgs, quotedCommand);
submitString = sprintf('qsub -N %s -j oe -V -o %s %s %s', . jobName, quotedLogFile, additionalSubmitArgs, quotedCommand);
Запустить MATLAB, если уже работал — перезапустить.
В закладке Home открыть Environment → Parallel → Manage Cluster Profiles.
В появившемся окне создать профиль: Add → Custom → Generic
Нажать ‘Edit‘, изменить такие параметры:
JobStorageLocation — директория для временных файлов на персональном компьютере
NumWorkers = число, сколько ядер будет запрашиваться.
ClusterMatlabRoot = /opt/shared/matlab/r2013b (директория с MATLAB на кластере)
OperatingSystem = Unix
HasSharedFileSystem = false
Поле IndependentSubmitFcn:
Вместо ‘/mnt/storage/home/hpcuser/matlab’ укажите путь до директории для временных файлов на кластере — или в своей домашней директории, или в своей рабочей области.
Поле CommunicatingSubmitFcn:
Вместо ‘/mnt/storage/home/hpcuser/matlab’ укажите путь до директории для временных файлов на кластере — или в своей домашней директории, или в своей рабочей области.
GetJobStateFcn = @getJobStateFcn
DeleteJobFcn = @deleteJobFcn
Переключиться на закладку ‘Validation results’. Нажать кнопку ‘Validate’. Вас попросят ввести свой логин на кластере, путь до созданного ранее файла с закрытой частью ключа и парольную фразу к этому файлу. Все тесты должны завершиться со статусом ‘passed’.
При желании через меню окна ‘Cluster Profiles Manager’ можно переименовать настроенный профиль и установить его как ‘профиль по умолчанию’.
Запуск параллельной программы
Параллельная программа — это программа, копии которой, запущенные на кластере одновременно, могут взаимодействовать друг с другом в процессе счета.
Программа пользователя должна быть оформлена как функция (не скрипт) и находиться в начале запускаемого файла, т.е. предшествовать возможным другим вспомогательным функциям. Имя файла должно совпадать с именем первой (основной) функции в файле. Одноименная с файлом функция, не являющаяся первой, никогда не будет выполнена, так как независимо от имени всегда выполняется первая функция файла. Файл должен иметь расширение » m » (Пример параллельной программы).
Для выполнения программы пользователя всегда вызывается программа MatLab.
При запуске программы пользователя на кластере в программе MatLab создаётся объект Job ( работа ) с описанием параллельной работы, которое включает определение объекта Task ( задача ), непосредственно связанного с заданной программой. Можно сказать, что копия работающей программы представлена в системе MatLab объектом Task .
Каждый объект Job получает идентификатор ( ID ) в системе MatLab, равный порядковому номеру. Нумерация начинается с 1.
Соответствующее имя работы вида Job1 , выдаваемое при запуске, хранится в переменной окружения MDCE_JOB_LOCATION и может быть использовано в программе, а сам объект доступен пользователю во время сеанса MatLab.
Аналогично пользователь имеет доступ и к объектам Task ( задача ), которые также нумеруются с 1. Идентификатор или номер задачи ( 1,2. ) — это номер соответствующего параллельного процесса ( lab ) и его можно узнать с помощью функции labindex , а общее число запущенных копий с помощью функции numlabs .
Имена работы ( Job1 ), задач ( Task1, Task2 ,…) используются в процессе вычислений для формирования имен файлов и каталогов, связанных с заданной программой. Так, каталог вида Job1 содержит наборы файлов с информацией по задачам. Имена этих файлов начинаются соответственно с Task1, Task2 , … Например, файлы вывода имеют вид Task1.out.mat, Task2.out.mat , … и содержат, в частности, выходные параметры функции пользователя (массив ячеек argsout ).
Программа пользователя, оформленная в виде объекта Job , поступает в распоряжение системы запуска, которая ставит её в очередь на счет с присвоением своего уникального идентификатора.
Система запуска создает каталог вида my_function.1 , например для файла my_function.m . В этом каталоге пользователю может быть интересен, в частности, файл errors (см. Возможные ошибки). Заметим, что пользователь должен сам удалять ненужные каталоги вида имя_функции.номер (номера растут, начиная с 1).
Если ресурсов кластера достаточно, то на каждом участвующем в вычислении процессоре (ядре для многоядерных процессоров) начинает выполняться копия программы-функции пользователя при условии наличия достаточного числа лицензий (в настоящее время система запуска не контролирует число лицензий, доступность лицензий определяется в начале счета).
Пользователь может контролировать прохождение своей программы через систему запуска как в окне системы Matlab, например, с помощью Job Monitor (см. п. Доступ к объекту Job ), так и из командной строки с помощью команд системы запуска (запросить информацию об очереди, удалить стоящую в очереди или уже выполняющуюся программу).
Действия пользователя
Войти на кластер (с помощью PuTTY или MobaXterm) и запустить программу-функцию из командной строки или в окне системы Matlab, указав необходимое для счета число параллельных процессов и максимальное время выполнения в минутах.
В ответ пользователь должен получить сообщение вида:
Job output will be written to: /home/u1303/Job1.mpiexec.out
где Job1 — имя сформированной работы, 1 — идентификатор работы
( /home/u1303 — домашний (личный) каталог пользователя).
Замечание. Для локализации результатов вычислений рекомендуется осуществлять запуск программы (даже в случае запуска встроенных функций Matlab ) из рабочего каталога, специально созданного для данной программы в домашнем каталоге.
Запуск параллельной программы из командной строки
Команда запуска mlrun имеет вид
mlrun -np -maxtime ['']
где
— число параллельных процессов (копий программы)
— максимальное время счета в минутах
— имя файла с одноименной функцией (например, my_function )
— аргументы функции (не обязательный параметр) берутся в одиночные кавычки и представляются в виде
k,
где k — число выходных аргументов функции, а в фигурных скобках список ее входных аргументов. При отсутствии аргументов у функции, что соответствует » 0,<> «, их можно опустить. Например, для файла my_function.m с одноименной функцией без параметров запуск имеет вид:
mlrun -np 8 -maxtime 20 my_function
где 8 — число процессов, 20 — максимальное время счета в минутах.
Запуск параллельной программы в окне Matlab
В командном окне Matlab (Command Window) вызвать служебную функцию imm_sch , которой в качестве параметров передать число процессов, время выполнения и предназначенную для параллельных вычислений функцию с аргументами или без, сохраняя (рекомендуется) или не сохраняя в переменной (например, job ) ссылку на созданный объект Job (имя функции набирается с символом «@» или в одиночных кавычках):
job = imm_sch(np,maxtime,@my_function,k );
job = imm_sch(np,maxtime,'my_function',k,);
Так, для примера выше запуск в окне Matlab будет иметь вид:
job = imm_sch(8,20,@my_function);
Доступ к объекту Job, состояние работы
Все работы хранятся на кластере. При необходимости доступа к работе, на которую в текущий момент отсутствует ссылка, можно (1) в окне Job Monitor правой кнопкой мыши выделить нужную работу и выбрать соответствующую опцию в контекстном меню или (2) по идентификатору ( ID ) определить ссылку на работу (обозначенную ниже job ), используя, например, команды:
c = parallel.cluster.Generic job = c.findJob('ID',1)
Состояние работы ( State ) можно:
(1) увидеть в окне Job Monitor или
(2) выдать в окне Command Window, набрав
job.State
Основные значения состояния работы следующие:
pending (ждет постановки в очередь)
queued (стоит в очереди)
running (выполняется)
finished (закончилась)
Окончания счета (состояние finished ) можно ждать с помощью функции wait , wait(job) или job.wait()
Примечание.
Вышеприведенные команды предназначены для версий MatLab с профилем кластера, т.е. начиная с R2012a. В ранних версиях (с конфигурацией кластера) следует набирать:
s = findResource('scheduler', 'type', 'generic') job = findJob(s,'ID',1)
При этом в поле DataLocation структуры s должен быть текущий каталог (тот, в котором ищем работу). Если каталог другой, то можно выполнить
clear all
и повторить предыдущие команды.
Вывод результатов
В окне Matlab (с R2012a) для работы job и любой ее задачи ( Task ) с номером n=1,2. можно выдать (далее для удобства n=1)
1) протокол сеанса:
job.Tasks(1).Diary
2) информацию об ошибках (поле ErrorMessage ):
job.Tasks(1) или job.Tasks(1).ErrorMessage
3) результаты (значения выходных параметров) работы job в целом (по всем Task -ам):
out = job.fetchOutputs
Тогда для 1 -ой задачи ( Task ) значение единственного выходного параметра:
res = out
В случае нескольких выходных параметров соответственно имеем для 1-го, 2-го, . :
res1 = out
res2 = out
Другой способ выдачи результатов по задачам
out1 = job.Tasks(1).OutputArguments
Замечания.
1. Эту же информацию можно выдать, запустив Matlab в интерактивном текстовом режиме ( matlab -nodisplay ) и набирая затем упомянутые команды.
2. Если ссылка на работу ( job ) отсутствует, то ее можно найти по идентификатору.
3. Для ранних версий (до R2012a) следует использовать следующие команды, чтобы выдать
1) протокол сеанса:
job.Tasks(1).CommandWindowOutput
3) результаты (значения выходных параметров) работы job в целом (по всем Task -ам):
out = job.getAllOutputArguments
Рекомендации
1. Начать работу на кластере рекомендуется с запуска своей последовательной программы в тестовом однопроцессном варианте, например,
mlrun -np 1 -maxtime 20 my_function
где my_function – функция без параметров, максимальное время счета 20 минут.
2. После преобразования последовательной программы в параллельную её работоспособность можно проверить, выполняя шаги, приведенные в пункте Как убедиться в работоспособности программы при рассмотрении примеров с распределенными массивами.
Пример запуска программы
Для запуска программы на кластере используем функцию rand , вызываемую для генерации 2х3 матрицы случайных чисел (традиционный вызов функции: y = rand(2,3) ).
Для получения 4 экземпляров матрицы задаем число процессов, равное 4. Максимальное время счета пусть будет равно 5 минутам.
Запускать функцию будем на кластере «Уран» (umt) в каталоге test , специально созданном заранее в домашнем каталоге пользователя /home/u9999 , где u9999 – login пользователя (см. Схема работы на кластере и Базовые команды ОС UNIX).
Для запуска функции rand из командной строки используется команда mlrun ,
а из системы Matlab – служебная функция imm_sch .
Для запуска из командной строки войти на umt через PuTTY и выполнить команду
mlrun -np 4 -maxtime 5 rand '1,'
Для запуска из окна Matlab войти на umt из MobаXterm, вызвать Matlab командой
matlab &
и в открывшемся окне набрать
job = imm_sch(4,5,@rand,1,);
где job – ссылка на сформированную работу.
Можно работать в системе Matlab, войдя на umt через PuTTY и запустив её в интерактивном текстовом режиме командой
matlab -nodisplay
В ответ на приглашение ( >> ) следует соответственно набрать
job = imm_sch(4,5,@rand,1,);
Выход из Matlab осуществляется по команде exit .
После выполнения mlrun или imm_sch выдается строка вида
Job output will be written to: /home/u9999/test/Job1.mpiexec.out
где Job1 — имя сформированной работы, 1 — идентификатор (номер) работы.
Если ресурсов кластера достаточно, задача войдет в решение (см. Запуск задач на кластере). Иначе для ускорения запуска на кластере небольших (отладочных) задач можно вместо выделенного задаче раздела назначить debug командой вида:
scontrol update job 8043078 partition=debug
где 8043078 — уникальный идентификатор (JOBID) задачи.
Дожидаемся окончания задачи, т.е. job.State должно быть finished .
В окне Matlab контролировать состояние задачи удобно с помощью Job Monitor.
Результаты выдаем с помощью команд:
со всех процессов
out = job.fetchOutputs
а для выдачи матрицы, полученной 1-ым процессом (т.е. Task1 )
Для выдачи результатов ранее посчитанной работы, на которую в текущий момент нет ссылки, следует обеспечить к ней доступ, например используя Job Monitor.
Как запустить m файл в mathlab
Изготовление исполнимых программ из исходных текстов выполняется с помощью компиляторов, переводящих исходный текст программы в эквивалентную ей результирующую программу на языке машинных команд. Основными языками программирования на высокопроизводительных вычислительных системах являются С/C++ и Фортран . Язык С создавался как язык для написания системных приложений, однако в последнее время широко применяется и для написания вычислительных программ. Язык программирования Фортран изначально разрабатывался для написания вычислительных программ. Для него разработано множество библиотек прикладных подпрограмм, в которых реализованы различные вычислительные алгоритмы. Например, библиотека LAPACK содержит широчайший набор подпрограмм для решения различных задач линейной алгебры.
Синтаксис команды компиляции имеет вид:
компилятор [опции] файлы [библиотеки]
- Здесь компилятор — команда вызова компилятора;
- основные опции:
- -o — создать выходной файл с заданным именем (без опции создается a.out);
- -c — не изготавливать исполнимый модуль (при компиляции подпрограмм);
- -O -O1,-O2,-O3 — задание уровня оптимизации;
- -g — выполнить компиляцию в отладочном режиме;
- файлы — компилируемые файлы;;
- библиотеки — подключаемые библиотеки.
В квадратных скобках указываются необязательные компоненты команды.
На UNIX-подобных системах имеется множество компиляторов. Большая часть из них является коммерческими продуктами. Для систем Linux пакет GCC является неотъемлемой частью дистрибутивов, поскольку является базовым компилятором сборки ядра системы и всех ее утилит.
Пакет компиляторов GCC
В него входят компиляторы:
- gcc — компилятор языка С;
- g++ — компилятор языка С++;
- gfortran — компилятор языка Фортран95.
Компиляторы GCC оптимизирующие, поддерживающие три уровня оптимизации (опции -O1, -O2, -O3). На разных программах более эффективной может оказаться та или другая опция. В большинстве случаев наиболее приемлемой бывает опция -O2, при этом ускорение программы может достигать 2-3 раз. Типичные команды компиляции:
- gcc -O2 -o prog prog.c — для языка С;
- gfortran -O2 -o prog prog.f — для языка Фортран.
Помимо этого, на Linux кластерах, являющихся сегодня основным видом высокопроизводительных вычислительных систем, широко используется пакет компиляторов Intel Compiler, наилучшим образом оптимизированный под платформу x86-64, являющуюся основной при построении вычислительных кластеров. Это коммерческй продукты и он приобретен Вычислительным центром СПбГУ.
Пакет компиляторов Intel
- icc — компилятор языка С;
- icpc — компилятор языка С++;
- ifort — компилятор языка f77, f90, f95.
Компиляторы также поддерживают три уровня оптимизации (опции -O1, -O2, -O3, задание опции -O соответствует уровню -O2). Сочетание опций -fast -On, задает режим максимального ускорения программы на соответствующем уровне оптимизации. Для отлаженных программ включение оптимизации обязательно. В большинстве случаев ускорение работы программы может достигать 2-3 раз.
- icc -O2 -o prog prog.c — для языка С;
- ifort -O2 -o prog prog.f — для языка Фортран.
Рассмотрим подробнее работу с компилятором gcc.
Создадим файл с именем ex1.c с помощью команды touch. Откроем его в текстовом редакторе и наберем текст программы на языке С.
Программа ex1.c #include int main(int argc, char* argv[])
Далее следует скомпилировать программу, т.е. перевести в исполнимый код. Для этого выполним следующую команду.
Если программа написана без ошибок, то никакой выдачи информации на терминал не будет, а в рабочем каталоге появится файл с именем a.out. Это исполнимый файл, полученный в результате компиляции программы. Его можно запустить на исполнение(поэтому файлы и называются исполнимыми), набрав в командной строке:
На терминал будет напечатана строка «Hello word».
Для того чтобы поменять имя создаваемого файла c a.out на любое другое необходимо использовать опцию -o:
gcc -o ex1 ex1.c
В результате будет создан исполнимый файл с именем ex1.
Приведем несколько важных опций компилятора gcc (они справедливы и для icc)
- -o файл — Поместить вывод в файл ‘файл‘. Эта опция применяется вне зависимости от вида порождаемого файла, является ли это выполнимый файл, объектный файл, ассемблерный файл или препроцессированный C код. Если ‘-o‘ не указано, по умолчанию выполнимый файл помещается в ‘a.out‘, объектный файл для ‘исходный.суффикс‘ — в ‘исходный.o‘, его ассемблерный код в ‘исходный.s‘ и все препроцессированные C файлы — в стандартный вывод.
- -c — Компилировать или ассемблировать исходные файлы, но не линковать. Стадия ликовки просто не выполняется. Конечный вывод происходит в форме объектного файла для каждого исходного файла.
- -g — Порождает отладочную информацию.
- -O,-O1,-O2,-O3 — Задание уровня оптимизации оптимизации
- -Iдиректория — Добавляет каталог ‘директория‘ в начало списка каталогов, используемых для поиска заголовочных файлов. Ее можно использовать для подмены системных заголовочных файлов, подставляя ваши собственные версии, поскольку эти директории просматриваются до директорий системных заголовочных файлов. Если используется более чем одна опция ‘-I‘, директории просматриваются в порядке слева на право; стандартные системные директории просматриваются последними.
- -Lдиректория — Добавляет каталог ‘директория‘ в начало списка каталогов, используемых для поиска библиотек
- -lбиблиотека — Подключает библиотеку с именем lib’библиотека’.so
Рассмотрим назначение опций более подробно на примерах.
В программах часто используются уже написанные ранее функции. Например, в приведенной выше программе, применялась системная функция вывода информации в стандартный поток printf. Для того чтобы транслятор на этапе создания программы, мог правильно обработать внешнюю функцию необходимо ее предварительно описать, либо внутри программы, либо в специальном заголовочном файле. Такие файлы еще называют include файлами, в языке С они подключаются с помощью специальной директивы #include. На первом этапе трансляции программы, запускается так называемый препроцессор, он находит файл с именем stdio.h, и вставляет его содержимое внутрь программы. Пути поиска задаются с помощью опции
-Iдиректория,
где директория — путь к каталогу, в котором расположен данный файл.
Если используется стандартный заголовочный файл, то опцию -I для его поиска в командной строке компиляции программы указывать необязательно. Существует специальный каталог, где располагаются стандартные заголовочные файлы. Препроцессор автоматически просматривает его при поиске заголовочных файлов. Все сказанное в полной мере относится и к компилятору с языка Фортран. Отличие состоит в синтаксисе подключения include файла:
include ‘файл.h’
Если в команде компиляции не указана опция -c, то компилятор автоматически выполняет операцию компоновки, т.е. изготовление исполнимой программы. В примере для вывода строки «Hello word» применялась стандартная функция printf, следовательно, код этой функции должен быть вставлен в программу. Операцию объедения кода программы и кода внешних функций выполняет компоновщик. Компоновщик (или линковщик — linker) — программа, которая производит компоновку, принимает на вход один или несколько объектных модулей и собирает из них исполняемый модуль. Объектный модуль (или объектный файл — object file) — это файл с промежуточным представлением отдельного модуля программы, полученный в результате обработки исходного кода компилятором. Объектный файл содержит в себе особым образом подготовленный код (часто называемый бинарным), который может быть объединён с другими объектными файлами при помощи редактора связей (линковщика) для получения готового исполняемого модуля либо библиотеки.
В рассмотренном примере используется функция printf, находящаяся в стандартной библиотеке с именем libc. Для программ на языке С эта библиотека автоматически подключается к любой программе, поэтому не потребовалось подключать ее с помощью опций. В тех случаях, когда в программе используются функции входящие в другие библиотеки, то эти библиотеки необходимо указывать компоновщику, иначе компоновщик не сможет собрать исполнимый файл. Рассмотрим следующий пример.
Программа ex2.c #include #include int main(int argc, char *argv[])
Эта программа вычисляет результат возведения в степень 0.1 числа 2 и присваивает результат переменной res и затем выводит ее значение на стандартный поток вывода. Возведение в степень осуществляет функция pow. Заголовочный файл, в котором описан заголовок для этой функции, подключается директивой #include , являющимся стандартным заголовочным файлом для библиотеки математических подпрограмм.
Попробуем скомпилировать программу командой:
gcc -o ex2 ex2.c
В результате получим следующие сообщение об ошибке:
/tmp/ccgSk9AB.o(.text+0x49): In function `main’:
ex2.c: undefined reference to `pow’
collect2: ld returned 1 exit status
Это сообщение говорит, что в функции main, файла ex2.c вызывается функция pow, для которой не найден машинный код на этапе сборки программы. Для того чтобы программа скомпоновалась, необходимо указать компилятору в какой библиотеке следует искать объектный код функции pow. Правильная строка компиляции будет выглядеть следующим образом.
gcc -o ex2 ex2.c -lm
В результате будет создана программа с именем ex2, которая при запуске напечатает:
Подключение библиотеки было выполнено с помощью опции -lm. Файл этой библиотеки находится в каталоге /usr/lib. Полное его название libm, имена файлов библиотек подпрограмм всегда начинаются с префикса lib, за которым идет название библиотеки. При подключении библиотеки к программе в строке компилятора префикс lib заменяется на -l. Таким образом, подключение библиотеки libm осуществляется опцией -lm. Поскольку библиотека стандартная, находится в специальном каталоге, то нет необходимости указывать путь поиска файла библиотеки математических подпрограмм с помощью опции -L. Компилятор сам найдет его в директории /usr/lib. Работа с библиотеками имеет ряд аспектов, которые нуждаются в более подробном рассмотрении.
В рассмотренном ранее примере было упомянуто, что стандартная математическая библиотека находится в системном каталоге /usr/lib. Однако если перейти в каталог /usr/lib, и попробовать найти там файл с именем libm, то такого файла там нет. Зато есть два файла с именами libm.a и libm.so. Почему два и с разными расширениями? Потому что большинство UNIX-подобных систем поддерживают два типа компоновки — статическую и динамическую.
Динамические библиотеки, называемые также библиотеками общего пользования или разделяемыми библиотеками (shared library), загружаются на этапе выполнения программы. Код вызываемых функций не встраивается внутрь исполняемой программы, а вызывается по мере необходимости при запуске программы на исполнение. Такой подход позволяет создавать программы значительно меньшего объема. Динамические библиотеки хранятся обычно в определенном месте и имеют стандартное расширение. В ОС Windows файлы библиотек общего пользования имеют расширение .dll, а в UNIX-подобных системах .so. Если на этапе загрузки программы система не смогла найти необходимый код, то программа не запустится. Будет выдано сообщение об ошибке:
error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory
Статические библиотеки в виде пакетов объектных файлов, присоединяются (линкуются) к исполнимой программе на этапе компиляции (в Windows такие файлы имеют расширение .lib, а в UNIX-подобных .a). В результате этого программа включает в себя все необходимы функции, что делает её автономной, хорошо переносимой, но увеличивает размер.
Статическая библиотека создается специальной командой:
ar rc libимя.a список_объектных_файлов
Объектные файлы создаются компиляцией функций с опцией -c. Рекомендуется каждую функцию (или подпрограмму в Фортране) оформлять в отдельном файле.
Динамическая библиотека создаются компилятором:
gcc -shared -o libимя.so список_объектных_файлов
Для создания объектных файлов компиляция выполняется с опциями -fPIC -c. Опция -fPIC (PIC — Position Independent Code) означает создание позиционно-независимого кода.
Все библиотеки обычно хранятся в каталоге lib. Если с одним и тем же именем имеется две библиотеки и статическая и динамическая, то по умолчанию линковщик будет использовать динамическую библиотеку. Предположим, что в домашнем каталоге пользователя имеется подкаталог lib и в нем находятся два библиотечных файла: libmy.a и libmy.so. Подкаталог includeсодержит заголовочный файл. Тогда команда компиляции
gcc -o prog_shared prog.c -I~/include -L~/lib -lmy
будет использовать динамическую библиотеку.
Для создания исполнимого файла со статической библиотекой потребуется команда:
gcc -static -o prog_static prog.c -I~/include -L~/lib -lmy
Мы создали две версии программы: с использованием динамической и статической библиотек. Во втором случае использовалась опция -static, чтобы компилятор использовал статическую библиотеку libmy.a. Если бы динамической версии библиотеки не было, то эту опцию можно было бы не указывать. Компилятор, не найдя динамической библиотеки автоматически подключает статическую библиотеку. Опция -I~/include заставляет искать заголовочные файлы в пользовательском подкаталоге include. Заметим, что в Фортране использование заголовочных файлов не требуется, и include файлы используются для других целей — определения констант и параметров. Опция -L~/lib указывает компилятору, что при сборке программы, помимо стандартных путей, следует искать библиотеки и в директории lib домашнего каталога пользователя.
При запуске на исполнение разные версии программы, скорее всего, поведут себя по-разному:
- команда
- ./prog_static — выполнится без проблем;
- а при запуске
- ./prog_shared — программа завершится с ошибкой:
- prog_shared: error while loading shared libraries: libmy.so: cannot open shared object file: No such file or directory
Дело в том, что в момент загрузки программы, система ищет необходимые для запуска программы разделяемые библиотеки, чтобы собрать исполнимую программу. Поиск идет по заранее установленному списку директорий. Имена директорий перечислены в системном файле /etc/ld.so.conf. Очевидно, что в этот файл невозможно занести все индивидуальные каталоги пользователей. В этой ситуации на помощь приходят переменные окружения. Как уже говорилось ранее, в UNIX системах существует специальная переменная LD_LIBRARY_PATH, в которой каждый пользователь может перечислить директории для поиска разделяемых библиотек. Добавим к переменной LD_LIBRARY_PATH путь к директории lib, где находится библиотека libmy.so. Делается это командой
export LD_LIBRARY_PATH=$:~/lib (bash)
setenv LD_LIBRARY_PATH $:~/lib (tcsh)
Данной командой мы к ранее установленному значению добавили путь к персональному каталогу пользователя с библиотечными файлами. Если теперь запустить программу
./prog_shared
то она сработает корректно.
Предпочтительное использование динамических библиотек обусловлено тем, что размеры исполнимых модулей в десятки раз меньше, чем у статических. Все системные утилиты собираются с использованием динамических библиотек. А поскольку в системе их несколько тысяч, то экономятся гигантские объемы дискового пространства. Кроме того, исполнимые файлы с использованием динамических библиотек более мобильны. В качестве примера рассмотрим типичную ситуацию. В организации имеется два кластера с различной коммуникационной средой — Ethernet и Infiniband. Если использовать статические MPI библиотеки, то для каждого кластера нужно иметь свою версию программы, а если использовать динамические библиотеки, то программы становится совместимыми. При запуске программы на каждом кластере будет вызываться своя версия коммуникационной библиотеки. Еще одно преимущество динамических библиотек состоит в том, что при обновлении системной библиотеки не потребуется пересборка всех системных утилит и программ пользователей.
При использовании большого количества библиотек и include файлов команда компиляции может оказаться довольно длинной. Чтобы упростить компиляцию, часто используют командные файлы (скрипты), выступающих в качестве интерфейсов к стандартным компиляторам. Такой подход используется в пакете MPI. При сборке библиотек формируются командные файлы для вызова тех или иных компиляторов. Компиляция параллельных MPI-программ выполняется командами:
- mpif77 -O -o progname progname.f — на языке Фортран
- mpicc -O -o progname progname.c — на языке С
- mpicxx -O -o progname progname.cc — на языке С++
Здесь mpif77, mpicc, mpicxx — командные скрипты, вызывающие стандартные компиляторы с настройкой путей к необходимым include-файлам и подключением всех необходимых коммуникационных библиотек библиотек. Использование таких скриптов, в свою очередь, порождает некоторые проблемы. Дело в том, что практически на любом вычислительном кластере имеется множество версий коммуникационных библиотек. Это, во-первых, связано с необходимостью обновления установленных версий, а, во-вторых, с тем, что поставщики коммуникационного программного обеспечения, как правило, предоставляют множество реализаций коммуникационных библиотек. Например, в состав коммуникационного пакета OFED входят три различных реализации MPI (MVAPICH, MVAPICH2, OpenMPI), которые к тому же собираются всеми имеющимися в системе компиляторами. К сожалению, все эти версии не совместимы друг с другом, и поэтому очень важно при работе с MPI программами соблюсти синхронность в использовании коммуникационных библиотек. Это означает, что если программа откомпилирована с использованием некоторой версии MPI, то нужно быть уверенным, что при запуске программы на выполнение будет использована та же самая версия MPI, т.е. будет использована команда mpirun из этой же версии пакета, и будут подключены нужные версии динамических библиотек. Это достигается соответствующими настройками переменных окружения PATH и LD_LIBRARY_PATH.