Am I running in parallel? (best way to check)

37 ビュー (過去 30 日間)
Felipe G. Nievinski
Felipe G. Nievinski 2013 年 1 月 8 日
コメント済み: Carlos M. Velez S. 2025 年 2 月 14 日 2:00
Is there a better way than this?
function answer = is_in_parallel ()
try
answer = ~isempty(getCurrentTask());
catch err
if ~strcmp(err.identifier, 'MATLAB:UndefinedFunction')
rethrow(err);
end
answer = false;
end
end
  8 件のコメント
Felipe G. Nievinski
Felipe G. Nievinski 2013 年 1 月 8 日
Other possibilities that I considered for checking were:
~isempty(ver('distcomp'))
and:
(matlabpool('size') > 0)
but neither seemed better than:
~isempty(getCurrentTask())
Tom Holden
Tom Holden 2022 年 4 月 8 日
getCurrentTask throws an error within a thread based parallel pool. So perhaps answer should be true if an error is thrown!

サインインしてコメントする。

採用された回答

Jan
Jan 2013 年 1 月 9 日
Let me summarize the current discussion:
No. There seems to be no better solution.
  1 件のコメント
Carlos M. Velez S.
Carlos M. Velez S. 2025 年 2 月 14 日 2:00
parallel = gcp('nocreate');
if isempty(parallel)
S.parallel = 'off';
else
S.parallel = ['on (' num2str(parallel.NumWorkers) ' workers, Cluster: ' parallel.Cluster.Profile ')'];
end

サインインしてコメントする。

その他の回答 (3 件)

埃博拉酱
埃博拉酱 2023 年 4 月 3 日
編集済み: 埃博拉酱 2023 年 4 月 3 日
parallel.internal.pool.isPoolThreadWorker||~isempty(getCurrentJob))
This code can robustly return true if and only if run on a parallel worker either as threads or processes.
  1 件のコメント
Roman Krylov
Roman Krylov 2023 年 6 月 6 日
Worked for me. Thanks!

サインインしてコメントする。


Tom Holden
Tom Holden 2022 年 4 月 8 日
~usejava( 'desktop' ) seems to work even on thread based parallel pools.

Daniel Shub
Daniel Shub 2013 年 1 月 9 日
MATLAB has a number of such functions that tell you about the state of the world (e.g., ispc, isdeployed, isjava). These functions seem to be necessary since there are thing you can/cannot do when they are true/false. I am not sure that something like isparallel is needed. It seems you are looking for something more like isheadless. That said, I am not sure this is the best approach. I am guessing here, but it sounds like your two uses cases are something like
parfor = 1:N
myFuncThatComputesAndPrints;
end
and
for = 1:N
myFuncThatComputesAndPrints;
end
and you want myFuncThatComputesAndPrints to know if it is running headless so that it will suppress the printing. I would suggest that you modify myFuncThatComputesAndPrints to take a flag to determine if it should print giving you
printFlag = true;
parfor = 1:N
myFuncThatComputesAndPrints(printFlag);
end
myFuncThatOnlyPrints;
and
printFlag = false;
for = 1:N
myFuncThatComputesAndPrints(printFlag);
end
This would allow you to expand the cases where you choose not to print.
  5 件のコメント
Felipe
Felipe 2013 年 1 月 9 日
How would you implement isparallel that would work if called outside the parfor? I don't think any of ~isempty(ver('distcomp')), (matlabpool('size') > 0), or ~isempty(getCurrentTask()) would work.
Jan
Jan 2013 年 1 月 9 日
getCurrentTask() works outside a PARFOR loop and replies [].

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeStartup and Shutdown についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by