mcpField
M
matlab-use-thread-pool

matlab-use-thread-pool

github.com/matlab開発1.2k69 回インストール1 日前に更新
リポジトリ

matlab-use-thread-pool について

`parfor`、`parfeval`、`spmd` のローカル並列処理でスレッドプールを試す MATLAB スキルです。互換性を推測せず、実行結果と MATLAB の診断に基づいて判断します。

主な機能

  1. 01ローカル並列処理でスレッドプールを試行
  2. 02診断結果に基づく非対応操作への対処
  3. 03Threads を既定プロファイルに設定
  4. 04ブロードキャストとスライスのコピー負荷を区別

活用シーン

  1. 01ローカルの `parfor` 処理を高速化
  2. 02ブロードキャスト配列の転送負荷を軽減
  3. 03プロセスプールとスレッドプールを選択

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-use-thread-pool

インストール後、Claude Code で/matlab-use-thread-poolを入力して読み込まれたか確認します。

同梱ファイルmanifest.yaml

詳細

スレッドベースの並列プールを使用する

ローカルの parfor / parfeval / spmd コードを高速化するため、デフォルトのプロセスベースのプールではなく、parpool("Threads") でスレッドプールを開始することを推奨します。

使用する場面

  • ローカルマシンで parfor、parfeval、または spmd のパフォーマンスを改善したいとユーザーが求めている場合。
  • コードが大きな配列を反復処理に渡したり、ワーカー間でブロードキャストしたりしており、ユーザーが起動の遅さ、シリアル化、またはデータ転送について言及している場合。
  • ユーザーが「プロセスとスレッドのどちらがよいですか?」と尋ねている場合、またはスレッドをデフォルトにしたい場合。

使用しない場面

  • ユーザーがクラスターで実行している場合。スレッドプールはローカル専用です。
  • コードで parsim やその他の Simulink 並列機能を使用している場合。これらにはプロセスベースのプールが必要です。
  • コードで distributed または codistributed 配列を使用している場合。
  • ユーザーが backgroundPool を使用したい場合。これは作業を非同期に実行するためのものであり(たとえば、計算の実行中にアプリの応答性を保つため)、並列処理による高速化のためのものではありません。すべての MATLAB ユーザーがバックグラウンドプールで 1 つのワーカーを使用でき、Parallel Computing Toolbox のライセンスを持つユーザーは複数のワーカーを使用できます。

MATLAB の一般的なパフォーマンス調整(ベクトル化、事前割り当て、プロファイリング)については、matlab-optimize-performance(利用可能な場合)を参照してください。

ワークフロー

  1. スレッドプールで試します。 先にコードを調べず、まず実行します。現在のプールがスレッドプールではない場合にのみ、スレッドプールを作成します。ユーザーが開いているプールを無条件に削除しないでください。以下の条件付きコードは開発時に便利なものであり、リリースするコードに組み込むものではありません。

    % Development-time helper: ensure a thread pool is active
    pool = gcp("nocreate");
    if isempty(pool) || ~isa(pool, "parallel.ThreadPool")
        delete(pool);
        parpool("Threads");
    end
    

    既存の parfor / parfeval / spmd ブロックを変更する必要はありません。スレッドプールはリファクタリングではなく、そのまま置き換えて使えます。

  2. エラーが発生したら診断内容を読みます。 サポートされていない機能では明確にエラーが発生し、MATLAB が許可されていない機能と、代わりにプロセスベースのプールを使用するよう通知します。parpool("Processes") を推奨してください。誤った結果が黙って返されることも、推測する必要もありません。

  3. ユーザーがスレッドプールを「常に」または「毎回」使いたい場合は、設定を維持する方法を案内します。parallel.defaultProfile("Threads") を使って Threads をデフォルトプロファイルに設定する方法を提案してください(R2022b 以降)。設定はセッションをまたいで維持されるため、起動スクリプトは不要です。

スレッドで実際に節約できること

正確に説明してください。ブロードキャスト変数はスレッド間でゼロコピーです(これが利点です)。スライスされた入力/出力(X(:,:,i))では引き続きメモリ割り当てとコピーが発生します。スレッドで省略されるのはシリアル化/IPC のコストだけであり、スライス自体のコストではありません。この点を明確にせず、「ゼロコピー」や「共有メモリによってコストが完全になくなる」と言わないでください。

基本方針

必ず実行し、決して推測しないでください。 これは、このスキルで最も重要なルールです。

LLM の学習データは不完全で古くなっています。スレッドベースのワーカーでは、リリースを重ねるごとに多くの関数がサポートされるようになっており、新たなサポートも定期的に追加されています。記憶や類似関数との類推、またはスキル内の短いブロック対象リストに載っていないことを根拠に、関数がスレッドでサポートされていないと断言しないでください。実行せずにスレッドのサポート状況を推論することが、このスキルで最も大きな失敗要因です。そのため、本来は不要なのにユーザーにプロセスプールを勧めてしまうことになります。

デフォルトの対応は、スレッドプールでコードを実行し、エラーが発生したら診断内容を読むことです。ブロックする要因を探すために、事前にコードを調べないでください。使用頻度の高い関数(load、FFT、imgaussfilt、数値処理や基本的な I/O のプリミティブなど)の多くはスレッドで動作します。

本当にコードを実行できない場合(計画段階、コードレビュー中、またはユーザーが今すぐ実行できない場合)に限り、ドキュメントを参照してください。適切なドキュメントスキル(利用可能な場合)を使って関数のリファレンスページを取得し、Extended Capabilities -> Thread-Based Environment のセクションを確認します。それでも、記載がないことや情報が古いことは、その関数が動作しない証拠にはなりません。スレッドのサポートが文書化されていない場合もあります。迷ったら、試してください。


Copyright 2026 The MathWorks, Inc.


コメント