Verwenden von TParallel.For aus der Parallel Programming Library
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);