現在、私は時間のかかるMATLAB関数を複数回繰り返して並列実行する必要があるプロジェクトに取り組んでいます。この質問の目的のために、関数をmyfunc
としましょう。MATLABでparforループを使用してセグメンテーションフォールトを処理する
myfunc
はMEXファイルを使用し、3時間ごとに1回のランダムセグメンテーション違反が発生します。セグメンテーションフォールトを診断することはできません。なぜなら、私がコードを作成しなかった独自のAPIに由来するからです。しかし、私はそれがMEXファイル内で発生することを知っていますし、変更可能な設定に決定的に関連していないことも知っています。
私はセグメンテーション違反を回避したいと思っています。私は理想的には、MATLABでparfor関数を使い続けたいと思っています。私の考えは今、次のようにのparforループ内のtryキャッチループを使用することです:
%create an output cell to store nreps of output from 'myfunc'
output = cell(1,nreps)
%create a vector to keep track of how many runs finish successfully without the error
successfulrun = zeros(1,nreps);
% run myfunc in parallel
parfor i = 1:nreps
try
output{i}
successfulrun(i) = true
end
end
%rerun experiments that did not end up successfully
while sum(successulruns) < nreps
%count number of experiments to rerun and initialize variables to hold those results
reps_to_rerun = find(successfulruns == 0);
nreps_to_rerun = sum(reps_to_rerun);
newoutput = cell(1,nreps_to_rerun);
newsuccessfulrun = zeros(1,nreps_to_rerun)
%rerun experiments
parfor i = 1:nreps_to_rerun
try
newoutput{i};
newsuccessfulrun = true;
end
end
%transfer contents to larger loop
for i = 1:nreps_to_rerun
rerun_index = reps_to_rerun(i);
successfulrun(rerun_index) = newsuccessfulrun(i)
if newsuccessfulrun(i)
output{i} = newoutput{i};
end
end
end
私の質問は以下のとおりです。
それも、このようなより多くの繰り返しを実行するために継続的に保つためにOKでしょうMEXファイルにセグメント違反がありましたか?または私はメモリをクリアするか、matlabpoolを再起動する必要がありますか?私はセグメンテーション違反がCであったので、これは問題ではないはずです。
parforループを "中断する"方法はありますか?
とSegfaultはMATLABをクラッシュ、またはあなただけのTRために行うべき、コードを停止し、あなたに継続しようとするオプションを提供しますかyを押してデータを保存します。例外はありません。不正なメモリアクセスを修正する以外の方法はありません。 – angainor