並列プログラミング ライブラリの TParallel.For の使用
並列プログラミング ライブラリの使用 への移動
並列プログラミング ライブラリ(PPL)には、さまざまな機能の中でも特に、使いやすい並列 for ループが新しく含まれています。
TParallel.For は、Delphi では、無名メソッドを引数として受け取るのに対して、C++ では、イテレータ イベント関数を作成して TParallel.For ループ呼び出しの際に渡します。
次の例は、並列ループを組み込むことがいかに簡単であるかを示すためのものです。特に、従来の for
を TParallel.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);