Можно разгрузить расчеты, чтобы запуститься в фоновом режиме при помощи batch. Если для вашего кода нужен доступ к файлам, можно использовать дополнительные опции, такие как 'AttachedFiles' или 'AdditionalPaths', сделать данные доступными. Можно закрыть или продолжить работать в MATLAB, в то время как расчеты происходят и восстанавливают результаты позже.
Подготовьте и скопируйте вспомогательные файлы для этого примера при помощи следующей команды.
prepareSupportingFiles;
Создайте кластерный объект с помощью parcluster. По умолчанию, parcluster использует ваш кластерный профиль по умолчанию. Проверяйте, что ваш кластерный профиль по умолчанию на вкладке MATLAB Home, в разделе Environment, параллельно> Выбирает Default Cluster.
c = parcluster();
Поместите свой код в функции и представьте его как пакетное задание при помощи batch. Для примера пользовательской функции смотрите функцию поддержки myFunction. Задайте ожидаемое количество выходных аргументов и массива ячеек с входными параметрами к функции.
Если ваш код использует параллельный пул, используйте 'Pool' аргумент пары "имя-значение", чтобы создать параллельный пул с количеством рабочих, которых вы задаете. batch использует дополнительного рабочего, чтобы запустить саму функцию.
По умолчанию, batch изменяет первоначальную рабочую директорию рабочих к текущей папке клиента MATLAB. Может быть полезно управлять первоначальной рабочей директорией в рабочих. Например, вы можете хотеть управлять им, если ваш кластер использует различную файловую систему, и поэтому пути отличаются, такой как тогда, когда вы подчиняетесь от клиентской машины Windows до кластера Linux.
Чтобы сохранить первоначальную рабочую директорию рабочих и использовать их значение по умолчанию, установите 'CurrentFolder' к '.'.
Чтобы изменить первоначальную рабочую директорию, установите 'CurrentFolder' к папке по вашему выбору.
Этот пример использует параллельный пул с тремя рабочими и выбирает временное местоположение для первоначальной рабочей директории.
job = batch(c,@myFunction,1,{}, ...
'Pool',3, ...
'CurrentFolder',tempdir);batch разгружает расчеты в вашей функции параллельному рабочему, таким образом, можно продолжить работать в MATLAB, в то время как расчеты происходят.
Если вы хотите с блоком MATLAB, пока задание не завершается, используйте wait функция на объекте задания.
wait(job);
Чтобы получить результаты, используйте fetchOutputs на объекте задания.
Если ваш код имеет ошибку, то fetchOutputs выдает ошибку. Можно получить доступ к информации об ошибке путем проверки Error свойство Task объекты в задании. В этом примере код зависит от файла, который не могут найти рабочие.
getReport(job.Tasks(1).Error)
ans =
'Error using myFunction (line 4)
Unable to read file 'mydata2.dat'. No such file or directory.'
По умолчанию, batch автоматически анализирует ваш код и передает требуемые файлы рабочим. В некоторых случаях необходимо явным образом передать те файлы - например, когда вы определяете имя файла во времени выполнения.
В этом примере, myFunction получает доступ к вспомогательному файлу mydata.dat, который batch автоматически обнаруживает и передает. Функция также доступы mydata1.dat, но это разрешает имя файла во времени выполнения, таким образом, автоматический анализ зависимостей не обнаруживает его.
type myFunction.m function X = myFunction()
A = load("mydata.dat");
X = zeros(flip(size(A)));
parfor i = 1:3
B = load("mydata"+i+".dat");
X = X + A\B;
end
end
Если данные находятся в месте, к которому могут получить доступ рабочие, можно использовать аргумент пары "имя-значение" 'AdditionalPaths' задавать местоположение. 'AdditionalPaths'добавляет этот путь к пути поиска файлов MATLAB рабочих и делает данные видимыми им.
pathToData = pwd;
job(2) = batch(c,@myFunction,1,{}, ...
'Pool',3, ...
'CurrentFolder',tempdir, ...
'AdditionalPaths',pathToData);
wait(job(2));Если данные находятся в месте, к которому не могут получить доступ рабочие, можно передать файлы рабочим при помощи 'AttachedFiles' аргумент пары "имя-значение".
job(3) = batch(c,@myFunction,1,{}, ...
'Pool',3, ...
'CurrentFolder',tempdir, ...
'AttachedFiles',"mydata"+string(1:3)+".dat");Можно закрыть MATLAB после представления задания и получить результаты позже. Прежде чем вы закроете MATLAB, обратите внимание на ID задания.
job3ID = job(3).ID
job3ID = 19
Когда вы открываете MATLAB снова, можно найти задание при помощи findJob функция.
job(3) = findJob(c,'ID',job3ID);
wait(job(3));В качестве альтернативы можно использовать Джоба Монитора, чтобы отследить задание. Можно открыть его от вкладки MATLAB Home, в разделе Environment, параллельно> Монитор Джобс.
Чтобы получить результаты пакетного задания, используйте fetchOutputs функция. fetchOutputs возвращает массив ячеек с выходными параметрами функционального запуска с batch.
X = fetchOutputs(job(3))
X = 1×1 cell array
{420×1680 double}
Когда вы получили все необходимые выходные параметры и больше не нуждаетесь в объекте задания, удаляете его, чтобы очистить его данные и постараться не использовать ресурсы излишне.
delete(job)
clear job