このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
並列コードのプロファイル
この例では、並列プール内のワーカーで並列プロファイラーを使用して並列コードをプロファイルする方法を説明します。
並列プールを作成します。
numberOfWorkers = 3; pool = parpool(numberOfWorkers);
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 3).
mpiprofile
を有効にして、並列プロファイル データを収集します。
mpiprofile on
並列コードを実行します。この例の目的上、一連の値に対して反復するシンプルな parfor
ループを使用します。
values = [5 12 13 1 12 5]; tic; parfor idx = 1:numel(values) u = rand(values(idx)*3e4,1); out(idx) = max(conv(u,u)); end toc
Elapsed time is 51.886814 seconds.
コードの終了後、mpiprofile viewer
を呼び出して並列プロファイラーから結果を表示します。このアクションは、プロファイル データの収集停止も行います。
mpiprofile viewer
レポートには、ワーカーで実行される各関数の実行時間に関する情報が表示されます。各ワーカーで最も長い時間を要する関数を調べることができます。
通常、合計実行時間が最長と最短のワーカーを比較すると便利です。これを行うには、レポートの [最長と最短合計時間] をクリックします。この例では、あるワーカーで conv
が複数回実行され、他のワーカーより大幅に長い時間を要したことが観察されます。この観察は、作業負荷がワーカー間に均等に分散されていなかった可能性を示唆しています。
各反復の作業負荷が不明の場合は、次のサンプル コードのように反復をランダム化することを推奨します。
values = values(randperm(numel(values)));
parfor
ループ内の各反復の作業負荷が既知の場合は、parforOptions
を使用して、ワーカーのサブレンジへの反復の分割を制御します。詳細については、parforOptions
を参照してください。
この例では、values(idx)
が大きくなるほど、反復の計算量が多くなります。values
内の値の連続するペアにはそれぞれ、最大および最小の計算量が表示されています。作業負荷がより良く分散されるように、parfor
の反復をサイズ 2
のサブレンジに分割する parfor
のオプション セットを作成します。
opts = parforOptions(pool,"RangePartitionMethod","fixed","SubrangeSize",2);
並列プロファイラーを有効にします。
mpiprofile on
前と同じコードを実行します。parfor
のオプションを使用するには、parfor
の 2 番目の入力引数に渡します。
values = [5 12 13 1 12 5]; tic; parfor (idx = 1:numel(values),opts) u = rand(values(idx)*3e4,1); out(idx) = max(conv(u,u)); end toc
Elapsed time is 33.813523 seconds.
並列プロファイラーの結果を可視化します。
mpiprofile viewer
このレポートの [最長と最短合計時間] を選択して、合計実行時間が最短と最長のワーカーを比較します。今回はすべてのワーカーで、conv
の複数回の実行に同様な時間がかかっています。今回の作業負荷はより良く分散されています。