Verwenden von TParallel.For aus der Parallel Programming Library

Aus RAD Studio

Nach oben zu Verwenden der Parallel Programming Library


Neben vielen anderen Leistungsmerkmalen enthält die Parallel Programming Library (PPL) einen neue, einfach zu verwendende "Parallel-for"-Schleife.

TParallel.For akzeptiert in Delphi anonyme Methoden, während Sie in C++ eine Iterator-Ereignis-Funktion erstellen und diese als Teil des TParallel.For-Schleifenaufrufs übergeben.

Das folgende Beispiel demonstriert, wie einfach die parallele Schleife eingesetzt werden kann. Es wird ermittelt, ob eine Zahl eine Primzahl ist, indem die herkömmliche for-Schleife durch die TParallel.For-Schleife ersetzt wird.

Delphi:

Funktion zum Berechnen einer Primzahl:

 
function IsPrime(N: Integer): Boolean;
var
  Test, k: Integer;
begin
  if N <= 3 then
    IsPrime := N > 1
  else if ((N mod 2) = 0) or ((N mod 3) = 0) then
    IsPrime := False
  else
  begin
    IsPrime := True;
    k := Trunc(Sqrt(N));
    Test := 5;
    while Test <= k do
    begin
      if ((N mod Test) = 0) or ((N mod (Test + 2)) = 0) then
      begin
        IsPrime := False;
        break; { jump out of the for loop }
      end;
      Test := Test + 6;
    end;
  end;
end;

Dies ist die herkömmliche Art zum Durchlaufen einer Schleife und zum Ermitteln der Anzahl der Primzahlen zwischen 1 und Max. Alle Zahlen werden nacheinander überprüft und die Gesamtanzahl in einer Variable gespeichert (hier ist Tot eine Ganzzahl):

 
const
 Max = 5000000; // 5M

for I := 1 to Max do
 begin
   if IsPrime (I) then
     Inc (Tot);
 end;

Mit der PPL kann dies erreicht werden, indem die for-Anweisung durch einen Aufruf der Klassenfunktion TParallel.For ersetzt und deren Code als anonyme Methode übergeben wird:

 
TParallel.For(1, Max, procedure (I: Integer)

 begin
   if IsPrime (I) then
     TInterlocked.Increment (Tot);
 end);

C++:

Funktion zum Berechnen einer Primzahl:

bool TForm1::IsPrime(int N){
	int Test, k;
	bool aPrime;
	if (N <= 3){
	   return N > 1;
	}
	else if (((N % 2) == 0) || ((N % 3) == 0)){
		return false;
	}else{
		aPrime = true;
		k = (int)sqrt(N);
		Test = 5;
		while (Test <= k){
			if (((N % Test) == 0) || ((N % (Test + 2)) == 0)){
				aPrime = false;
				break; //jump out of the for loop
			}
			Test = Test + 6;
		}
		return aPrime;
	}
}

Dies ist die herkömmliche Art zum Durchlaufen einer Schleife und zum Ermitteln der Anzahl der Primzahlen zwischen 1 und Max. Alle Zahlen werden nacheinander überprüft und die Gesamtanzahl in einer Variable gespeichert (hier ist Tot eine Ganzzahl):

int Max=5000000;
Tot=0;

for (int I=1; I<=Max; I++) {
	if(IsPrime(I)){
		Tot++;
	}
}

Mit der PPL kann dies erreicht werden, indem die for-Anweisung durch einen Aufruf der Klassenfunktion TParallel.For ersetzt und deren Code als Iterator-Ereignis übergeben wird:

void __fastcall TFormThreading::MyIteratorEvent(TObject *Sender,int AIndex)
{
	if(IsPrime(AIndex)){
		TInterlocked::Increment(Tot);
	};
}
TParallel::For(NULL,1,Max,MyIteratorEvent);

Siehe auch