Utilisation de TParallel.For de la bibliothèque de programmation parallèle

De RAD Studio
Aller à : navigation, rechercher

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);

Voir aussi