Ни распараллеливание, ни даже C-компиляция
(использование gcc 4.7 с веб-сайта уравнения.com, дополненного VC ++ Express в 64-разрядной версии Windows) действительно улучшает время.
Для запуска этого кода требуется около 6,5 секунд:
$start = AbsoluteTime[];
Func2[K_, ZRange_] :=
Module[{layers = Dimensions[ZRange][[1]], x, y, z, UTC, tx, ty, t1},
tx = Table[x, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}];
ty = Table[y, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}];
x = ConstantArray[tx, {layers}];
y = ConstantArray[ty, {layers}];
z = Table[ConstantArray[z, {1281, 1281}], {z, ZRange}];
t1 = AbsoluteTime[];
UTC = Func3[x, y, z];
Print["Func3 time = ", AbsoluteTime[] - t1];
Abs[ListConvolve[K, #] & /@ UTC]]
Func3 = Compile[{{x, _Real, 3}, {y, _Real, 3}, {z, _Real, 3}},
Module[{Sr2R2 = Sqrt[x^2 + y^2 + z^2]},
0.5 (1. + z/Sr2R2) Exp[2 \[Pi] I (Sr2R2 - z)]/Sr2R2]];
ZRangeList = {{20., 19., 18., 17., 16., 15., 14., 13., 12.,
11.}, {10., 9., 8., 7., 6., 5., 4., 3., 2., 1.}};
SeedRandom[1]; kernel = RandomReal[{-1, 1}, {640, 640}];
results1 = Table[Func2[kernel, ZList], {ZList, ZRangeList}];
AbsoluteTime[] - $start
и компиляция всего в одну функцию медленнее (8,1 сек):
$start = AbsoluteTime[];
CFunc2 = Compile[{{kern, _Real, 2}, {ZRange, _Real, 1}},
Module[{layers = Length[ZRange], x, y, z, UTC, ty, Sr2R2},
ty = Table[y, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}];
x = Table[x, {layers}, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}];
y = Table[y, {layers}, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}];
z = Table[ConstantArray[z, {1281, 1281}], {z, ZRange}];
Sr2R2 = Sqrt[x^2 + y^2 + z^2]; UTC = 0.5*(1. + z/Sr2R2)*
(Exp[2*Pi*I*(Sr2R2 - z)]/Sr2R2);
Abs[(ListConvolve[kern, #1] & ) /@ UTC]]];
ZRangeList = {{20., 19., 18., 17., 16., 15., 14., 13., 12., 11.},
{10., 9., 8., 7., 6., 5., 4., 3., 2., 1.}};
SeedRandom[1]; kernel = RandomReal[{-1, 1}, {640, 640}];
results = Table[CFunc2[kernel, ZList], {ZList, ZRangeList}];
AbsoluteTime[] - $start
Обычно не так просто понять, когда ParallelTable и друзья действительно помогают.
Просто зависит от проблемы, размера, версии Mathematica и т. Д.