Пример взят с сайта MathWorks и иллюстрирует основные (базовые) принципы программирования параллельной программы-функции.
Копия работающей функции, т.е. задача (Task), для которой значение labindex
равно 1, создает магический квадрат (magic square) с числом строк и столбцов равным числу выполняющихся копий (numlabs
) и рассылает матрицу с помощью labBbroadcast
остальным копиям. Каждая копия вычисляет сумму одного столбца матрицы. Все эти суммы столбцов объединяются с помощью функции gplus
, чтобы вычислить общую сумму элементов изначального магического квадрата.
function total_sum = colsum
if labindex == 1
% Send magic square to other labs
A = labBroadcast(1,magic(numlabs))
else
% Receive broadcast on other labs
A = labBroadcast(1)
end
% Calculate sum of column identified by labindex for this lab
column_sum = sum(A(:,labindex))
% Calculate total sum by combining column sum from all labs
total_sum = gplus(column_sum)
end
Существуют альтернативные методы получения данных копиями функций, например, создание матрицы в каждой копии или чтение каждой копией своей части данных из файла на диске и т.д.
В прикрепленном файле ml_session.PNG
(см. ниже) демонстрируется запуск функции colsum
в окне системы Matlab с использованием 4-х вычислительных процессов и максимальным временем счета 1 минута.
Функция хранится как файл colsum.m
в каталоге ng5
пользователя (полный путь: /home/u1303/ng5
). После запуска imm_sch_f(4,1,'colsum',1,{});
, а в более поздних версиях (с учетом переименования служебной функции в imm_sch
)
job = imm_sch(4,1,@colsum,1);
выдается сообщение вида:
Job output will be written to: /home/u1303/ng5/Job1.mpiexec.out
в котором указано имя сформированной работы Job1
.
Проверив состояние работы и убедившись, что она закончилась, можно выдать результаты счета.
Прикрепленный файл | Размер |
---|---|
ml_session.PNG | 73.66 КБ |