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

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

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


並列プログラム ライブラリ(PPL)は、ループ関数 TParallel.For を含んでおり、そのループを並列に実行することができます。

並列ループ内で、オペレーションをスレッドセーフのオペレーションに変換しなければなりません。System.SyncObjs ユニットのメンバー(TInterlocked メソッドなど)を使用することができます。

For ループを TParallel.For ループに変換する

Delphi:

For ループ TParallel.For Loop
for I := 1 to 10 do
begin
  // …
end;
TParallel.For(1, 10, procedure(I: Integer)
  begin
    // …
  end);

C++:

Clang 拡張 C++ コンパイラを使用している場合、ラムダ式を使用することができます:

For ループ TParallel.For Loop
for (int i = 1; i <= 10; i++) {
  // …
}
TParallel::For(0, 10, TProc1<int>([](int I){
  // …
}));

代わりに ファンクタを使用することもできます。これは、前世代コンパイラと Clang 拡張コンパイラの両方で動作します:

For ループ TParallel.For Loop
for (int i = 1; i <= 10; i++) {
  // (Loop logic)
}
class TMyFunctor : public TCppInterfacedObject<TProc__1<int> > {
public:
  void __fastcall Invoke(int I) {
    // (Loop logic)
  }
};

// …

TParallel::For(1, 10, System::DelphiInterface<TProc__1<int> >(new TMyFunctor()));

ループが、コールバック関数の外で、コンテキストから 1 つまたは複数の変数にアクセスする必要がある場合に、ファンクタを次のように使用する必要があります:

  1. ファンクタ クラスで変数を宣言し、必要とする変数のコピーか参照を保持します。
  2. それら変数のコピーまたは参照をパラメータとして受け取る、ファンクタ クラスのコンストラクタを宣言し、対応するファンクタ変数を、それらの値で初期化します。
  3. それらの変数を、ファンクタをインスタンス化する際に、コンストラクタに渡します。
  4. プログラム ロジックでは、Invoke() で、それらのファンクタ変数にアクセスすることができます。

例:

class TMyFunctor : public TCppInterfacedObject<TProc__1<int> > {
public:
  TMyFunctor(int a, TB *b) : a(a), b(b) {}
  void __fastcall Invoke(int I) {
    // (Loop logic)
  }
  int a;
  TB *b;
};

// …

TParallel::For(1, 10, System::DelphiInterface<TProc__1<int> >(new TMyFunctor(a, b)));

関連項目