主要内容

並列forル,プ(parfor)を使用したアルゴリズムの高速化

生成コド内の並列forルプ(parfor)

並列为ル,プ(parforルプ)を含むmatlab®コドからmex関数またはc / c++コドを生成して,実行を高速化できる場合があります。

標準のmatlabル,プと同様,parforル,プは,ある範囲の値にわたって一連のステ,トメント(ル,プ本体)を実行します。しかしル,プとは異なり,parforル,プの反復はタ,ゲットハ,ドウェアの複数のコアで並列に実行できます。

反復を並列に実行することで,生成されたコ,ドの実行速度が大幅に改善される場合があります。詳細は,Parforル,プによる実行速度の改善を参照してください。

メモ

並列実行は,元のMATLABコードではなく,生成された墨西哥人関数またはC / c++コードのみで行われます。Matlabコ,ドを高速化するには,parforルプからmex関数を生成します。次に,mex関数をコ,ドから呼び出します。詳細は,Matlabアルゴリズムを高速化するためのワ,クフロ,を参照してください。

Matlabコ,ドでparforを使用するには,并行计算工具箱™のラ▪▪センスが必要です。

MATLAB编码器™ソフトウェアは,开放多处理(OpenMP)アプリケーションインターフェイスを使用して共有メモリ,マルチコアコードの生成をサポートします。分散型の並列処理が必要な場合は,并行计算工具箱製品を使用してください。既定では,MATLAB编码器は使用可能なすべてのコアを使用します。使用するスレッドの数を指定すると,追加のコアが使用可能な場合でも,MATLAB编码器はスレッドに対し指定数までのコアしか使用しません。詳細は,parforを参照してください。

ル,プ本体は複数のスレッドで並列に実行できるため,一定の制限に従わなければなりません。MATLAB编码器ソフトウェアがparforの仕様に準拠しないル,プを検出すると,エラ,が発生します。詳細は,Parforの制限を参照してください。

Parforル,プによる実行速度の改善

parforル,プは複数のスレッドを同じル,プで同時に計算できるため,類似のル,プより実行速度が上がる場合があります。

parforル,プの本体の各実行は,反復と呼ばれます。スレッドは任意の順序で,また互いに独立して反復を評価します。各反復は独立しているため,これらを同期する必要はありません。スレッド数がルプ反復数と同じである場合,各スレッドはルプの1の反復を実行します。スレッド数より反復数が多い場合,一部のスレッドは1回を超えるル,プ反復を実行します。

たとえば100回の反復からなるループが20のスレッドで実行される場合,各スレッドは同時にループを5回ずつ反復します。反復数が多い,または個々の反復処理が長いなどの理由でループの実行に時間がかかる場合,複数のスレッドを使用して実行時間を大幅に削減できます。ただし,この例では,スレッドの作成と削除などの並列処理によるオーバーヘッドのため,速度は20倍にならない可能性があります。

Parforル,プを使用する場合

以下の場合にparforを使用します。

  • 簡単な計算の反復が多数ある。parforはルプの反復をグルプに分け,各スレッドにより反復の1のグルプが実行されるようにします。

  • ル,プ反復の実行に時間がかかる。parforは異なるスレッド上で反復を同時に実行します。この同時実行では,個々の反復にかかる時間は削減されませんが,ループ処理にかかる全体的な時間は大幅に削減される可能性があります。

Parforル,プを使用しない場合

以下の場合,parforは使用しないでください。

  • ル,プの反復が他の反復に依存する。反復を並列に実行すると誤った結果になる場合があります。

    ル,プの反復が他の反復に依存する場合にparforの使用を避けるため,MATLAB编码器では変数の厳密な分類が指定されています。詳細は,Parforル,プ内での変数の分類を参照してください。MATLAB编码器ソフトウェアがparfor仕様に準拠しないル,プを検出した場合は,コ,ドを生成せずにエラ,を出力します。

    リダクションは,ル,プ反復は独立していなければならないというル,ルに対する例外です。“リダクション変数”は,すべての反復に同時に依存するが反復順序には依存しない値を累積します。詳細にいては,リダクション変数を参照してください。

  • 単純な計算を実行する数回の反復しかない。

    メモ

    反復回数が少ないループについては,並列処理のオーバーヘッドがあるために実行が高速化されない場合があります。こうしたオーバーヘッドには,スレッドの作成,スレッド間のデータ同期,スレッドの削除などにかかる時間が含まれます。

Parforル,プの構文

  • parforル,プには,次の構文を使用します。

    parfor (i = InitVal:EndVal)

  • 最大数のスレッドを指定するには,次の構文を使用します。

    parfor (i = InitVal:EndVal,NumThreads)

詳細は,parforを参照してください。

Parforの制限

  • parforル,プは次の構文をサポ,トしていません。

    parfor (i=初始值:步骤:endVal) parfor i=初始值:步骤:endVal

  • 开放多处理(OpenMP)アプリケーションインターフェイスをサポートするコンパイラを使用しなければなりません。サポトされるコンパラを参照してください。OpenMPをサポ;MATLAB编码器parforルプをル,プとして扱います。生成されたmex関数またはc / c++コドでは,ルプ反復は単一スレッドで実行されます。

  • OpenMPアプリケーションインターフェイスはJIT墨西哥人コンパイルと互換性がありません。JITコンパ@ @ルがOpenMPをサポ@ @トしないを参照してください。

  • ルプンデックスの型は,タゲットハドウェアにおいて整数型で表現可能でなければなりません。生成されたコド内でマルチワドタプを必要としない型を使用してください。

  • スタンドアロンコ,ド生成のparfor。コードジェネレーターでテンプレートmakefileアプローチを使用する原因となるような設定変更は行わないでください。プロジェクトまたは構成でテンプレ,トmakefileを使用を参照してください。

  • parforル,プの本体では以下の構成を使用しないでください。

    • 入れ子にされたparforル,プ

    • 打破および返回ステ,トメント

    • グロ,バル変数

    • MATLABクラスのリダクション

    • 変数字符のリダクション

    • 外部cコ,ドを使用したリダクション

    • 外部関数呼び出し

    • 関数の▪▪ンラ▪▪ン化

    • ル,プの展開

    • 变长度输入宗量/varargout