私は、fMRI脳画像データの計算集中的な操作を実現する数千行のMATLABコードを持っています。多くの操作は複数の並列スレッドで実行できますが、異なるスレッド/ワーカーのすべてのfprintf
とdisp
出力が同じウィンドウに表示されるという問題があります。別のウィンドウに別のparforワーカー/スレッドのfprintfとdisp出力をリダイレクトする
Linux環境でunix
コマンドを使用して新しいMATLABインスタンスを作成するカスタムマルチスレッドコードを作成しました。ですから、私は最初に.mファイルPreprocessSubj1.m、PreprocessSubj2.m、PreprocessSubj3.m、PreprocessSubj4.mを書き出します。これらのファイルには同じ計算が含まれていますが、異なる科目には含まれています。これらの4つのMATLAB関数は完全に独立しています。
CellArrayOfFunctions = { 'PreprocessSubj1', 'PreprocessSubj2', ...
'PreprocessSubj3', 'PreprocessSubj4' };
CellArrayOfFunctions_i = 1;
while (CellArrayOfFunctions_i <= size(CellArrayOfFunctions, 2))
FunctionToBeRun = CellArrayOfFunctions{CellArrayOfFunctions_i};
unix([ 'matlab -desktop -r ', FunctionToBeRun, ' &' ]);
CellArrayOfFunctions_i = CellArrayOfFunctions_i + 1;
end
私はMATLABスレッドをフォークするためにunix
を使用することは、非常にその場しのぎだと思います。メンテナンス性とメモリ使用量を改善するために、parfor
を使用してこのコードを実装したいと思います。しかし、異なるスレッド/ワーカーの出力を別のウィンドウにリダイレクトする方法はありますか?
ありがとうございました:)
私はMatlabについて何も知らないけど、あなたのprintfステートメントの前にスレッドIDを付けてログに書き込む方法はありませんか?次にログをテールし、出力をgrepに渡してスレッドIDを検索します。興味のあるスレッドごとに別の端末でこれを行います。単なる考えです。 – Duck
私は既に各スレッドの個別のログを作成していますが、それは自分のコードでのみ動作し、使用しているMATLABツールボックス(SPM8)のfprintfステートメントでは動作しません。しかし、MATLAB組み込みfprintfを自分自身のfprintf.mに置き換え、MATLAB組み込みdispと "tail -f $ logfilename.txt"で端子をオープンする場合は、これが私の問題の解決策になります。 – nrz