for-закольцовывание по распределенному диапазону
forvariable= drange(colonop) statement ... statement end
Общий формат:
for variable = drange(colonop)
statement
...
statement
end colonop является выражением формы start:increment:finish или start:finish. Значение приращения по умолчанию равно 1. colonop секционирован по codistributed.colon в numlabs смежные сегменты почти одинаковой длины. Каждый сегмент становится итератором для обычного цикла for на отдельном работнике.
Наиболее важным свойством тела цикла является то, что каждая итерация должна быть независимой от других итераций. Логически итерации можно выполнять в любом порядке. В теле контура не допускается связь с другими работниками. Функции, выполняющие связь: gop, gcat, gplus, codistributor, codistributed, gather, и redistribute.
Можно получить доступ к частям совместно распределенных массивов, которые являются локальными для каждого работника, но невозможно получить доступ к другим частям совместно распределенных массивов.
break оператор может использоваться для преждевременного завершения цикла.
Найдите ранг магических квадратов. Доступ только к локальной части распределенного по коду массива.
r = zeros(1, 40, codistributor()); for n = drange(1:40) r(n) = rank(magic(n)); end r = gather(r);
Выполнить аппроксимацию пи по Монте-Карло. Каждый работник инициализируется в разное состояние случайных чисел.
m = 10000; for p = drange(1:numlabs) z = rand(m,1) + i*rand(m,1); c = sum(abs(z) < 1) end k = gplus(c) p = 4*k/(m*numlabs);
Попытка вычислить числа Фибоначчи. Это не сработает, потому что тела цикла зависимы.
f = zeros(1, 50, codistributor()); f(1) = 1; f(2) = 2; for n = drange(3:50) f(n) = f(n-1) + f(n-2) end