サーバーのイメージ画像

※2022/11/28 更新:R2022bで直接スレッドワーカーの数を指定できるようになりました。
※2022/04/03 初稿

MATLABではMATLAB本体のビルトインの関数はマルチスレッドで実行されるようになっていますが、並列処理をおこなうParallel Computing Toolboxで立ち上がる並列処理専用のプロセス(これをワーカーと言います)はMATLABのメインプロセスとは別にそれぞれ別プロセスとして起動していました。

バージョンR2020aから登場したスレッドベースの並列処理を使うことで、ワーカーが別プロセスではなく同じプロセス内に別スレッドで起動できるようになっています。

ヘビーユーザーほど一度作ったプログラムをコピペで再利用する方も多いとは思いますが、バージョン毎のリリースノートを眺めることでもっと効率の良い書き方があるのではと発見することができます。

【MathWorks】Parallel Computing Toolboxのリリースノート

MATLABのParallel Computing Toolboxのリリースノート
MATLABのParallel Computing Toolboxのリリースノート

さて、このスレッドベースの並列処理をおこなうには、

parpool
% あるいは
parpool('local')Code language: Matlab (matlab)

と書いていたところを

parpool('threads')Code language: Matlab (matlab)

とするだけです。

MATLABには自動的に並列プールを張る設定があるので、並列for 文のparfor を実行すると自動的にデフォルトのクラスタープロファイルでparpool が張られます。

従来のプロセスベースの並列プールに比べて、スレッドベースの並列プールでは、ワーカーの起動やデータの転送がめちゃくちゃ速いです。

スレッドベースの並列処理に対応しているのはまだまだ限定的で、こちらのドキュメント(Run MATLAB Functions in Thread-Based Environment)にあるようにR2022a時点でMATLAB本体、Image Processing Toolbox、 Signal Processing Toolboxの一部の関数のみですが、もしサポートしているなら劇的に速くなる可能性があります。

私もあるユーザーを支援した際に、parpool(‘threads’)を入れただけでモンテカルロ・シミュレーションが2倍以上速くなったということがありました。

従来のプロセスベースの並列プールでは

parpool(4)Code language: Matlab (matlab)

のように数値を入れることで並列処理のワーカー数を指定することができました。

しかし、スレッドベースの並列プールではこうしたオプションがR2022a時点でありません。

parpool('threads', 4)Code language: Matlab (matlab)

とするとエラーになります。マシンの物理コア数と同じ数のワーカーが立ち上がるしかないのです。

ドキュメントを色々と調べていると、同じようにスレッドベースの並列プールを使うbackgroundPool でNumWorkers の箇所にこのような説明がありました。

If you have the Parallel Computing Toolbox, NumWorkers is equal to the number of physical cores you have. For example, if you run MATLAB on a machine with four physical cores, the value is 4. You can reduce this value using maxNumCompThreads before first usage of backgroundPool.

【MathWorks】backgroundPool のドキュメントのNumWorkers の説明より

これを応用すれば、parpool('threads') でも行けるのではと思ったらドンピシャで、たとえば4スレッドベースにする場合は

maxNumCompThreads(4);
parpool('threads')
parfor n=1:1000
  % some parallel computing
endCode language: Matlab (matlab)

のように、スレッドベースの並列プールを張る前にスレッド数を指定すればワーカー数を変更することができました。これで並列処理を思いのコア数で回せますね。

R2020b のアップデートで直接指定可能に

※2022/11/28 更新

2022年9月にリリースされたR2022b で嬉しいお知らせが。

Parallel Computing Toolbox のリリースノートにスレッドプールでワーカー数を直接指定できるようになったと記載があります。

R2022bのMATLABのParallel Computing Toolboxのリリースノート
R2022bのMATLABのParallel Computing Toolboxのリリースノート

R2022b からはparpool('threads', 4)の書き方で行けます。便利ですね。

R2022a 以前では、記事の上の方にある方法でスレッド数を指定できますのでR2020a からR2022a では上記を参考にしてみてくださいね。

Categories:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です