【MATLAB】forループの並列化による高速化

自動車業界を中心にフロントローディングによる開発効率向上のため、モデルベース開発(MBD)が盛んに行われてしばらく経ちますが、1Dモデルが巨大化していくにつれ、処理の遅さが問題となる場合があります。

前回の記事では行列を用いて方程式を立てた際に、もしゼロの塊(ブロック)があるときはその部分を区分け(分割)し、計算を簡略化することで処理スピードの高速化を狙うための基礎知識について書きました。

本記事では、1D CAEのツールとしてMATLABを用いた場合に、forループの並列化による処理の高速化方法を紹介します。

MATLABにおける『forループ』

MATLABの制御文にはfor文if文while文shitch文try-catch文(例外処理)がありますが、parfor文を用いることでループ処理の並列化を行うことができます。

複数コアを搭載したCPUも持つPCでfor文からparfor文に変更することで、どの程度高速化するか確認してみたいと思います。

確認方法は変数がオーバーフローしないように繰り返し1に近い小数を掛けていくプログラムとしたいと思います。全く意味がないプログラムになってしまっていますが、今回は計算速度の違いを確認するだけを目的にしたいと思います。

カヲル
カヲル

計算時間はストップウォッチ タイマー関数のtic関数とtoc関数で確認できるよ!

もし、計算した順序で差が出た場合に切り分けができるように、本検証では「for文 ⇒ parfor文 ⇒ for文」の順序で計算を実行したいと思います。

clear; clc;

A = [1:10; 11:20; 21:30; 31:40; 41:50];
B = A; C = A;

% ===== for文の計算時間確認 ① =====
tic;
for i = 1:1:2*10^7
    A = (1 + 1*10^-5) * A;
end
toc;

% ===== parfor文の計算時間確認 =====
tic;
parfor i = 1:1:2*10^7
    B = (1 + 1*10^-5) * B
end
toc;

% ===== for文の計算時間確認 ② =====
tic;
for i = 1:1:2*10^7
    C = (1 + 1*10^-5) * C;
end
toc;

A
B
C

上記プログラムを実行すると筆者の環境では以下のように出力されました。

parfor文を使うことで計算時間を約\(1/45\)に出来ていることが分かります。

経過時間は 1.776573 秒です。
経過時間は 0.037729 秒です。
経過時間は 1.662309 秒です。

A =

1.0e+88 *

0.0722    0.1444    0.2166    0.2888    0.3609    0.4331    0.5053    0.5775    0.6497    0.7219
0.7941    0.8663    0.9384    1.0106    1.0828    1.1550    1.2272    1.2994    1.3716    1.4438
1.5159    1.5881    1.6603    1.7325    1.8047    1.8769    1.9491    2.0213    2.0934    2.1656
2.2378    2.3100    2.3822    2.4544    2.5266    2.5988    2.6709    2.7431    2.8153    2.8875
2.9597    3.0319    3.1041    3.1763    3.2484    3.3206    3.3928    3.4650    3.5372    3.6094

B =

1.0e+88 *

0.0722    0.1444    0.2166    0.2888    0.3609    0.4331    0.5053    0.5775    0.6497    0.7219
0.7941    0.8663    0.9384    1.0106    1.0828    1.1550    1.2272    1.2994    1.3716    1.4438
1.5159    1.5881    1.6603    1.7325    1.8047    1.8769    1.9491    2.0213    2.0934    2.1656
2.2378    2.3100    2.3822    2.4544    2.5266    2.5988    2.6709    2.7431    2.8153    2.8875
2.9597    3.0319    3.1041    3.1763    3.2484    3.3206    3.3928    3.4650    3.5372    3.6094

C =

1.0e+88 *

0.0722    0.1444    0.2166    0.2888    0.3609    0.4331    0.5053    0.5775    0.6497    0.7219
0.7941    0.8663    0.9384    1.0106    1.0828    1.1550    1.2272    1.2994    1.3716    1.4438
1.5159    1.5881    1.6603    1.7325    1.8047    1.8769    1.9491    2.0213    2.0934    2.1656
2.2378    2.3100    2.3822    2.4544    2.5266    2.5988    2.6709    2.7431    2.8153    2.8875
2.9597    3.0319    3.1041    3.1763    3.2484    3.3206    3.3928    3.4650    3.5372    3.6094

まとめ

今回は、forループを行う際にparfor文へ置き換えることで環境やプログラムによりますが、処理が大幅に早くする方法について紹介しました。

ただし、parfor文へ単純には置き換えられない場合もあるので注意が必要です。詳細はMathWorksのヘルプセンターを参考にしてみてください。