並列プログラミング ライブラリの TParallel.For の使用

提供: RAD Studio
移動先: 案内検索

並列プログラミング ライブラリの使用 への移動


並列プログラミング ライブラリ(PPL)には、さまざまな機能の中でも特に、使いやすい並列 for ループが新しく含まれています。

TParallel.For は、Delphi では、無名メソッドを引数として受け取るのに対して、C++ では、イテレータ イベント関数を作成して TParallel.For ループ呼び出しの際に渡します。

次の例は、並列ループを組み込むことがいかに簡単であるかを示すためのものです。特に、従来の forTParallel.For に置き換えて、数が素数かどうかを調べる方法を示しています。

Delphi の場合:

以下は、素数かどうかを調べる関数です。

 
function IsPrime (N: Integer): Boolean;
var
 Test: Integer;
begin
 IsPrime := True;
 for Test := 2 to N - 1 do
   if (N mod Test) = 0 then
   begin
     IsPrime := False;
     break; {jump out of the for loop}
   end;
end;

以下は、従来の方法で反復処理を行い、1 と Max 値の間にある素数の数を調べるコードです。それぞれの数は順に確認され、素数の総数が変数(Tot は整数)に格納されます。

 
const
 Max = 50000; // 50K

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

PPL を使用する場合、これを実現するには、for コマンドをクラス関数 TParallel.For の次のような呼び出しに置き換えます(コードを無名メソッドとして渡しています)。

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

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

C++ の場合:

以下は、素数かどうかを調べる関数です。

bool IsPrime(int N){
	bool aPrime=true;
	for (int Test=2; Test < N-1; Test++) {
		if(N % Test == 0){
		aPrime = false;
		break;
		}
	}
	return aPrime;
}

以下は、従来の方法で反復処理を行い、1 と Max 値の間にある素数の数を調べるコードです。それぞれの数は順に確認され、素数の総数が変数(Tot は整数)に格納されます。

int Max=50000;
Tot=0;

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

PPL を使用する場合、これを実現するには、for コマンドをクラス関数 TParallel.For の以下の呼び出しに置き換えます(コードをイテレータ イベントとして渡しています)。

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

関連項目