监控Mathematica中并行计算的进度

Jer*_*ver 19 parallel-processing wolfram-mathematica progress-bar

我正在构建一个大型的ParallelTable,并且想要了解计算的进展情况.对于非并行表,以下代码可以很好地完成:

counter = 1;
Timing[
 Monitor[
  Table[
   counter++
  , {n, 10^6}];
 , ProgressIndicator[counter, {0, 10^6}]
 ]
]
Run Code Online (Sandbox Code Playgroud)

结果{0.943512, Null}.但是,对于并行情况,有必要counter在内核之间进行共享:

counter = 1;
SetSharedVariable[counter];
Timing[
 Monitor[
  ParallelTable[
   counter++
  , {n, 10^4}];
 , ProgressIndicator[counter, {0, 10^4}]
 ]
]
Run Code Online (Sandbox Code Playgroud)

结果{6.33388, Null}.由于counter需要在每次更新时在内核之间来回传递值,因此性能损失将非常严重.有关如何了解计算方法的任何想法?也许让每个内核都有自己的值counter并且每隔一段时间对它们求和?也许某种方法可以确定表中哪些元素已经被内核修复了?

And*_*lan 14

当你说"或许让每个内核都有自己的反值并且每隔一段时间对它们求和一次?"时,你几乎自己给了答案.

尝试这样的事情:

counter = 1;
SetSharedVariable[counter];
ParallelEvaluate[last = AbsoluteTime[]; localcounter = 1;]
Timing[Monitor[
  ParallelTable[localcounter++; 
    If[AbsoluteTime[] - last > 1, last = AbsoluteTime[]; 
     counter += localcounter; localcounter = 0;], {n, 10^6}];, 
  ProgressIndicator[counter, {0, 10^6}]]]
Run Code Online (Sandbox Code Playgroud)

请注意,它只需要比第一个单CPU案例更长的时间,因为它实际上在循环中做了一些事情.

您可以将测试AbsoluteTime [] - last> 1更改为更频繁的内容,例如AbsoluteTime [] - last> 0.1.


Sjo*_*ies 5

这似乎很难解决.从手册:

除非您使用共享变量,否则执行的并行评估是完全独立的,不能相互影响.此外,作为评估的一部分而发生的任何副作用(例如变量赋值)都将丢失.并行评估的唯一影响是它的结果在最后返回.

但是,使用旧Print语句仍然可以获得粗略的进度指示器:

在此输入图像描述

  • 我已经试过了.它似乎不适用于并行情况. (2认同)