Utilisation de TParallel.For de la bibliothèque de programmation parallèle
Remonter à Utilisation de la bibliothèque de programmation parallèle
Entre autres fonctionnalités, la bibliothèque de programmation parallèle (PPL) inclut une nouvelle boucle for parallèle facile à utiliser.
La fonction TParallel.For accepte des méthodes anonymes dans Delphi, alors que dans C++ vous créez une fonction d'événement itérateur et la transmettez dans le cadre de l'appel à la boucle TParallel.For.
L'exemple suivant montre qu'il est très simple d'insérer une boucle parallèle. Il montre également comment déterminer si un nombre est un nombre premier en remplaçant la fonction for
traditionnelle par la fonction TParallel.For.
Delphi :
Voici une fonction pour calculer un nombre premier :
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;
Il s'agit de la manière traditionnelle de créer une boucle et de contrôler le nombre de nombres premiers entre 1 et la valeur Max
. Chaque nombre est contrôlé en séquence et le total est stocké dans une variable (ici Tot
est un entier) :
const
Max = 5000000; // 5M
for I := 1 to Max do
begin
if IsPrime (I) then
Inc (Tot);
end;
En utilisant la PPL, on peut obtenir le même résultat en remplaçant la commande for
par un appel à la fonction de classe TParallel.For transmise dans le code sous la forme d'une méthode anonyme :
TParallel.For(1, Max, procedure (I: Integer)
begin
if IsPrime (I) then
TInterlocked.Increment (Tot);
end);
C++ :
Voici une fonction pour calculer un nombre premier :
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;
}
}
Il s'agit de la manière traditionnelle de créer une boucle et de contrôler le nombre de nombres premiers entre 1 et la valeur Max
. Chaque nombre est contrôlé en séquence et le total est stocké dans une variable (ici Tot
est un entier) :
int Max=5000000;
Tot=0;
for (int I=1; I<=Max; I++) {
if(IsPrime(I)){
Tot++;
}
}
En utilisant la PPL, on peut obtenir le même résultat en remplaçant la commande for
par un appel à la fonction de classe TParallel.For transmise dans le code sous la forme d'un événement itérateur :
void __fastcall TFormThreading::MyIteratorEvent(TObject *Sender,int AIndex)
{
if(IsPrime(AIndex)){
TInterlocked::Increment(Tot);
};
}
TParallel::For(NULL,1,Max,MyIteratorEvent);