[fpc-pascal] Common OpenMP syntax?

Marc Weustink marc at dommelstein.net
Fri Jul 21 00:58:32 CEST 2006


Steve Williams wrote:
> Florian Klaempfl wrote:
> 
>> I'am currently thinking about implementing OpenMP support in FPC.
>> However, there is currently (to my knowledge) no pascal syntax defined
>> for OpenMp support. Do you think we can find a common syntax to simplify
>> things for users? I've some ideas how it be done, but I want to hear
>> other ideas first so they are maybe better if they aren't influenced by
>> my ideas :)
>>
>> I started also a wiki page about it
>> http://www.freepascal.org/wiki/index.php/OpenMP_support where ideas can
>> be written down and shared.
>>   
> 
> 
> 
> I would suggest something along the lines of the C/C++ implementation, 
> but using the Pascal form of compiler directives.
> 
> Using some of the documented examples in the v2.5 spec:
> 
> Example A.1.1:
> procedure a1(n: Integer; a: PSingleArray; b: PSingleArray);
> var
>  i: Integer;
> begin
>  {$omp parallel for}
>  for i := 1 to n - 1 do
>    b^[i] := (a^[i] + a^[i - 1]) / 2.0;
> end;

Brrr.... using local defines look not native to the language.
Why not something like as (refered in another thread) pascal-fc which 
uses cobegin..coend or known blocks like asm..end; try..end;

for instance:
  omp..end;
  parralel..end;


so:

procedure a1(n: Integer; a: PSingleArray; b: PSingleArray);
var
  i: Integer;
begin
  for i := 1 to n - 1 do
  parallel
    b^[i] := (a^[i] + a^[i - 1]) / 2.0;
  end;
end;



> Example A.5.1:
> uses omp;
> 
> begin
>  omp_set_dynamic(1);
>  {$omp parallel num_threads(10)}
>  begin
>    (* Do work here *)
>  end;
> end;


  uses omp;

  begin
   omp_set_dynamic(1);
//  {$omp parallel num_threads(10)}
// why not:
   omp_set_num_threads(10);
   parallel
     (* Do work here *)
   end;
  end;


> 
> Example A.13.1:
> interface
> 
> function dequeue(var a: Single): Integer;
> procedure work(i: Integer; var a: Single);
> 
> implementation
> 
> procedure a13(var x: Single; var y: Single);
> var
>  ix_next, iy_next: Integer;
> begin
>  {$omp parallel shared(x, y) private(ix_next, iy_next)}
>  begin
>    {$omp critical (xaxis)}
>      ix_next := dequeue(x);
>    work(ix_next, x);
> 
>    {$omp critical (yaxis)}
>      iy_next := dequeue(y);
>    work(iy_next, y);
>  end;
> end;
> 


  procedure a13(var ax: Single; var ay: Single);
  begin
   parallel
   shared
     x: Single; absolute ax;
     y: Single; absolute ay;
   private
     ix_next, iy_next: Integer;
   begin
     // where does xaxis come from ?
     // {$omp critical (xaxis)}
     ix_next := dequeue(x);
     work(ix_next, x);

     // where does yaxis come from ?
     // {$omp critical (yaxis)}
     iy_next := dequeue(y);
     work(iy_next, y);
   end;
  end;


or:


  procedure a13(var ax: Single; shared var y: Single);
  shared var
    x: Single; absolute ax;
// y: Single; absolute ay;
  private var
    ix_next, iy_next: Integer;
  begin
   parallel
     // where does xaxis come from ?
     // {$omp critical (xaxis)}
     ix_next := dequeue(x);
     work(ix_next, x);

     // where does yaxis come from ?
     // {$omp critical (yaxis)}
     iy_next := dequeue(y);
     work(iy_next, y);
   end;
  end;


Marc



More information about the fpc-pascal mailing list