Ada Conformity Assessment Authority      Home Conformity Assessment   Test Suite ARGAda Standard
 
Annotated Ada Reference Manual (Ada 2022 with Amendment 1)Legal Information
Contents   Index   References   Search   Previous   Next 

5.6.1 Parallel Block Statements

1/5
{AI12-0119-1} {AI12-0436-1} [A parallel_block_statement comprises two or more sequence_of_statements separated by and where each represents an independent activity that is intended to proceed concurrently with the others.]

Syntax

2/5
{AI12-0119-1} {AI12-0427-1} {AI12-0436-1} parallel_block_statement ::= 
    parallel [(chunk_specification)] [aspect_specificationdo
       sequence_of_statements
    and
       sequence_of_statements
   {and
       sequence_of_statements}
    end do;
3/5
{AI12-0427-1} The chunk_specification, if any, of a parallel_block_statement shall be an integer_simple_expression.

Dynamic Semantics

4/5
{AI12-0119-1} {AI12-0427-1} For the execution of a parallel_block_statement, the chunk_specification and the aspect_specification, if any, are elaborated in an arbitrary order. After elaborating the chunk_specification, if any, a check is made that the determined maximum number of chunks is greater than zero. If this check fails, Program_Error is raised.
5/5
{AI12-0119-1} {AI12-0427-1} {AI12-0436-1} {AI12-0449-1} Then, the various sequence_of_statements are grouped into one or more chunks, each with its own logical thread of control (see Clause 9), up to the maximum number of chunks specified by the chunk_specification, if any. Within each chunk every sequence_of_statements of the chunk is executed in turn, in an arbitrary order. The parallel_block_statement is complete once every one of the sequence_of_statements has completed, either by reaching the end of its execution, or due to a transfer of control out of the construct by one of the sequence_of_statements (see 5.1).
5.a/5
Implementation Note: {AI12-0119-1} {AI12-0436-1} Although each sequence_of_statements of a parallel block represents a separate logical thread of control, the implementation may choose to combine two or more such logical threads of control into a single physical thread of control to reduce the cost of creating numerous physical threads of control. 

Examples

6/5
{AI12-0429-1} Example of a parallel block used to walk a binary tree in parallel:
7/5
{AI12-0119-1} {AI12-0404-1} procedure Traverse (T : Expr_Ptr) is -- see 3.9.1
begin
   if T /= null and then
      T.all in Binary_Operation'Class -- see 3.9.1
   then -- recurse down the binary tree
      parallel do
         Traverse (T.Left);
      and
         Traverse (T.Right);
      and
         Ada.Text_IO.Put_Line
            ("Processing " & Ada.Tags.Expanded_Name (T'Tag));
      end do;
   end if;
end Traverse;
8/5
{AI12-0429-1} Example of a parallel block used to search two halves of a string in parallel:
9/5
{AI12-0119-1} function Search (S : String; Char : Character) return Boolean is
begin
   if S'Length <= 1000 then
       -- Sequential scan
       return (for some C of S => C = Char);
   else
       -- Parallel divide and conquer
       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;  -- Terminates enclosing do
                end if;
             end loop;
          and
             for C of S(Mid + 1 .. S'Last) loop
                if C = Char then
                   return True;  -- Terminates enclosing do
                end if;
             end loop;
          end do;
          -- Not found
          return False;
       end;
   end if;
end Search;

Extensions to Ada 2012

9.a/5
{AI12-0119-1} {AI12-0427-1} {AI12-0436-1} The parallel_block_statement is new. 

Contents   Index   References   Search   Previous   Next 
Ada-Europe Ada 2005 and 2012 Editions sponsored in part by Ada-Europe