MATLAB のマルチスレッド機能とは
技術計算におけるマルチスレッドでは、計算やリソース利用の効率を高めるために、単一のプロセス内で複数のスレッドを同時に実行します。マルチスレッド機能を活用すると、タスクを複数の CPU コア間に分割して同時に実行し、計算量の多いアプリケーションのパフォーマンスを向上させることができます。この手法は、特に行列計算、フーリエ変換、画像処理など、並列処理が可能な演算では、実行時間の短縮につながります。しかし、共有リソースの管理には注意が必要で、競合状態やデッドロックなどの問題を回避する対策も求められます。
MATLAB でのマルチスレッド処理は容易に実行できます。MATLAB® と Simulink® では、主に 2 つの手法でマルチコアとマルチプロセッサ構成のコンピューターを有効活用できます。1 つは MATLAB の組み込みマルチスレッド機能で、もう 1 つは Parallel Computing Toolbox™ の関数を用いた明示的な並列処理です。コンピューターの計算能力を最大限に活用することで、MATLAB アプリケーションや Simulink モデルをより高速かつ効率的に実行できます。
MATLAB のマルチスレッド機能の明示的/暗黙的処理と逐次処理の比較。
MATLAB の組み込みマルチスレッド機能
MATLAB の組み込みマルチスレッド機能は、実行時に内部ライブラリを利用して計算を自動的に並列処理することで、線形代数や数値関数、たとえば fft、eig、mldivide、svd、sort など、多くの関数でパフォーマンスが大幅に向上します。MATLAB では、この処理が暗黙的に行われるため、手動で有効にする必要はありません。計算に使用するスレッド数を制御する場合は、maxNumCompThreads 関数を使用できます。
Simulink も同様に、サブシステム、コシミュレーション、データフローに対応した組み込みマルチスレッドを提供しています。Simulink は、必要に応じて、対象となるモデルやブロックを複数のスレッドでまとめて実行できるよう構成します。Simulink でパフォーマンスの向上が可能と判断されると、該当するモデルが複数のスレッドで自動的に実行されるため、実行時間の短縮につながります。
MATLAB ワーカーを使用した明示的な並列処理
Parallel Computing Toolbox には、並列プールを作成、利用するための関数が用意されており、スレッドやプロセスを通じて追加のハードウェアリソースを利用して、アプリケーションのパフォーマンス向上や処理時間の短縮を実現できます。MATLAB と Simulink では、並列 for ループ (parfor)、並列キュー (parfeval)、複数データによる単一プログラムの並列実行 (spmd)、Simulink の並列シミュレーション (parsim)、その他の並列プログラミング機能を使って、並列プールを活用することができます。
ますます充実する MATLAB と Simulink の関数や機能を活用することで、追加のコーディングを行うことなく、並列計算リソースを有効に活用することができます。たとえば、Simulink では、一部のインターフェースでフラグや設定を変更するだけで、簡単に並列処理サポートを有効にできます。
スレッドベースの並列プール
スレッドベースの並列プールを使用することで並列処理が可能になり、1 つの MATLAB プロセス内で複数のスレッドに計算を分散することができます。このプールは通信のオーバーヘッドが小さく、共有メモリへのアクセスが可能ですが、使用は 1 台のコンピューター上での計算に限られます。MATLAB では backgroundPool を用いて追加のスレッドワーカーを 1 つ有効にできますが、Parallel Computing Toolbox では parpool("Threads") で複数のスレッドワーカーを使用できます。
プロセスベースの並列プール
Parallel Computing Toolbox では、複数のワーカープロセス (計算エンジン) を使用して、MATLAB アプリケーションをローカルマシンやリモートクラスター上で並列実行することも可能です。これらのプロセスワーカーは、計算をシングルスレッドで実行するよう初期設定されています。
マルチスレッドとは異なり、プロセスベースの並列プールによる明示的な並列処理は、MATLAB Parallel Server™ で有効化された計算クラスタを活用することで、MATLAB ワーカーを使用した並列アプリケーションを1 台のコンピューターの枠を超えて拡張することができます。
製品使用例および使い方
ソフトウェア リファレンス
参考: 並列処理, GPU コンピューティング