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.
| 归档时间: |
|
| 查看次数: |
5558 次 |
| 最近记录: |