Verwenden von TParallel.For aus der Parallel Programming Library

Aus RAD Studio
Wechseln zu: Navigation, Suche

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