Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

5.6.1 Параллельные блоки

Оператор parallel_block_statement состоит из двух или более операторов sequence_of_statements, разделенных ключевым словом and, где каждый представляет собой независимую операцию, которая должна выполняться параллельно с другими.

Синтаксис

parallel_block_statement ::=
parallel [(chunk_specification)] [aspect_specification] do
sequence_of_statements
and
sequence_of_statements
{and
sequence_of_statements}
end do;
Если используется chunk_specification, то это должно быть целое integer_simple_expression.

Динамические семантики

При выполнении parallel_block_statement, chunk_specification и aspect_specification (если присутствуют) обрабатываются в произвольном порядке. После обработки chunk_specification, если она указана, выполняется проверка, что максимальное количество кусков больше нуля. Если проверка не выполняется, генерируется ошибка Program_Error.
Затем различные sequence_of_statements группируются в один или несколько кусков, каждый со своим логическим потоком управления (см. раздел 9), до максимального числа кусков, указанных в chunk_specification (если она есть). Внутри каждого куска каждый sequence_of_statements куска выполняется по очереди в произвольном порядке. Оператор parallel_block_statement завершается, когда каждый из sequence_of_statements завершился, либо достиг конца своего выполнения, либо из-за передачи управления наружу конструкции одним из sequence_of_statements (см. 5.1).

Примеры

Пример использования параллельного блока для обхода бинарного дерева в параллельном режиме:
procedure Traverse (T : Expr_Ptr) is -- см. 3.9.1
begin
if T /= null and then
T.all in Binary_Operation'Class -- см. 3.9.1
then -- рекурсивно спускаемся по бинарному дереву
parallel do
Traverse (T.Left);
and
Traverse (T.Right);
and
Ada.Text_IO.Put_Line
("Обработка " & Ada.Tags.Expanded_Name (T'Tag));
end do;
end if;
end Traverse;
Пример использования параллельного блока для поиска двух половин строки в параллельном режиме:
function Search (S : String; Char : Character) return Boolean is
begin
if S'Length <= 1000 then
-- Последовательный поиск
return (for some C of S => C = Char);
else
-- Параллельное деление и завоевание
declare
Mid : constant Positive := S'First + S'Length/2 - 1;
begin
parallel do
for C of S(S'First .. Mid) loop
if C = Char then
return True; -- Прерывает окружающий do
end if;
end loop;
and
for C of S(Mid + 1 .. S'Last) loop
if C = Char then
return True; -- Прерывает окружающий do
end if;
end loop;
end do;
-- Не найдено
return False;
end;
end if;
end Search;


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API