公告:网站程序已升级到1.8.3,修复了提问时可能报错的问题,请清除浏览器缓存
2019-11-10

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
401 浏览

这是为什么呢?

 

Test1[System`Dump`matrix_?MatrixQ, System`Dump`y___] := 
Block[{System`Dump`m = System`Dump`toRaster[System`Dump`matrix]},
Developer`ToPackedArray[System`Dump`m]]
Test3[System`Dump`matrix_?MatrixQ, System`Dump`y___] := 
System`Dump`toRaster[System`Dump`matrix]


Ember`toRaster[{x___}] := ParallelMap[Ember`toRaster, {x}]

Ember`toRaster[(Hue | GrayLevel | RGBColor | CMYKColor)[x_]] := x
Ember`toRaster[(Hue | GrayLevel | RGBColor | CMYKColor)[x_, 
y__]] := {x, y}
Ember`toRaster[___] := 0


Test4[w_, y___] := Developer`ToPackedArray[Ember`toRaster[w]]


fn := (x + I y)^(x + I y)
DistributeDefinitions[fn, Test1, Test3, Ember`toRaster, Test4]
RepeatedTiming[
Test1[Table[
Hue[(Arg[fn] + \[Pi])/(2 \[Pi]), 1/(1 + 0.3 Log[Abs[fn] + 1]), 
1 - 1/(1.1 + 5 Log[Abs[fn] + 1]), 1], {y, -2 + 0.0012, 2, 
0.2}, {x, -2 + 0.0012, 2, 0.2}]], 120] // Short
RepeatedTiming[
Test3[ParallelTable[
Hue[(Arg[fn] + \[Pi])/(2 \[Pi]), 1/(1 + 0.3 Log[Abs[fn] + 1]), 
1 - 1/(1.1 + 5 Log[Abs[fn] + 1]), 1], {y, -2 + 0.0012, 2, 
0.2}, {x, -2 + 0.0012, 2, 0.2}]], 120] // Short
RepeatedTiming[
Test4[Table[
Hue[(Arg[fn] + \[Pi])/(2 \[Pi]), 1/(1 + 0.3 Log[Abs[fn] + 1]), 
1 - 1/(1.1 + 5 Log[Abs[fn] + 1]), 1], {y, -2 + 0.0012, 2, 
0.2}, {x, -2 + 0.0012, 2, 0.2}]], 120] // Short
RepeatedTiming[
Parallelize[
Test1[Table[
Hue[(Arg[fn] + \[Pi])/(2 \[Pi]), 1/(1 + 0.3 Log[Abs[fn] + 1]), 
1 - 1/(1.1 + 5 Log[Abs[fn] + 1]), 1], {y, -2 + 0.0012, 2, 
0.2}, {x, -2 + 0.0012, 2, 0.2}]]], 120] // Short








分别结果为

{0.0069,{{<<1>>},{<<1>>},<<17>>,{<<1>>}}}
{0.02,{{<<1>>},<<18>>,{{<<1>>},<<19>>}}}
{0.47,{{<<1>>},<<18>>,{{<<1>>},<<19>>}}}
{0.0071,{{<<1>>},{<<1>>},<<17>>,{<<1>>}}}


并且后两者报错。
谁能说明下并行为什么会比正常运算慢呢?

分类:列表操作 | 用户: EmberEdison (806 分)
本来就算的很快了,为啥还要并行?并行是有通讯成本的,举个简单的类比,让你一个人从1加到10很可能比让你先告诉另外一个人你从1加到5他从6加到10然后他告诉你结果你再把两个结果相加,要快。
我这个例子里面的fn是设定的用于测试的一个较容易的函数,但是事实上这个fn是由用户设定的,并不是每一个都如此容易,很可能会有算的很慢的情形发生。例子中的x和y的值域也是特意设计的比较小的,实际应用的话会比目前这个值大几千倍到几百万倍。
也就是说我设计的测试例子不好,只有对于很大很大的数据量并行才有优势咯?

1个回答

+1 投票
 
已采纳
Quiet@LaunchKernels[];
fn = (x + I y)^(x + I y);
f[x_, y_] := 
  Evaluate@Hue[(Arg[fn] + \[Pi])/(2 \[Pi]), 
    1/(1 + 0.3 Log[Abs[fn] + 1]), 1 - 1/(1.1 + 5 Log[Abs[fn] + 1]), 1];
f1[dx_] := 
  Table[f[x, y], {y, -2 + 0.0012, 2, dx}, {x, -2 + 0.0012, 2, dx}] // 
    RepeatedTiming // First;
f2[dx_] := 
  ParallelTable[
     f[x, y], {y, -2 + 0.0012, 2, dx}, {x, -2 + 0.0012, 2, dx}, 
     Method -> "CoarsestGrained"] // RepeatedTiming // First;

dxlist = E^Subdivide [Sequence @@ Log[{0.005, 0.9}], 50];
time = Monitor[Table[{{ddx, f1[ddx]}, {ddx, f2[ddx]}}, {ddx, dxlist}],
    ddx/Max@dxlist];

ListLogLogPlot[Transpose@time, PlotRange -> All, 
 PlotLegends -> {"Table", "ParallelTable"}]

简化了一下问题。

用户: 苹果 (2.2k 分)
采纳于 用户:EmberEdison
非常感谢,很有用,也非常直观。这样来看的话我得设计一个切换回串行方案的机制才行啊。
...