我有一段代码,我已经花了一周左右的时间重写它,以使其尽可能快地运行。该代码模拟了一个衍射激光束,其本质是对640*640内核在许多2D 1280*1280切片上进行卷积 - 每个切片都是沿着光轴的新位置。
优化的第一阶段是编译我的函数,第二阶段是学习到Mathematica喜欢操作大量数据的列表 - 因此将3D空间同时传递给它而不是一个接一个地传递切片。
然而,这样做会消耗我的RAM!
以下是我的当前设置:
优化的第一阶段是编译我的函数,第二阶段是学习到Mathematica喜欢操作大量数据的列表 - 因此将3D空间同时传递给它而不是一个接一个地传递切片。
然而,这样做会消耗我的RAM!
以下是我的当前设置:
Func2[K_ , ZRange_] :=
Module[{layers = Dimensions[ZRange][[1]]},
x = ConstantArray[Table[x, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}], {layers}];
y = ConstantArray[Table[y, {x, -80, 80, 0.125}, {y, -80, 80, 0.125}], {layers}];
z = Table[ConstantArray[z, {1281, 1281}], {z, ZRange}];
UTC = Func3[x, y, z];
Abs[ListConvolve[K, #] & /@ UTC]
]
Func3 = Compile[{{x, _Real}, {y, _Real}, {z, _Real}},
Module[{Sr2R2 = Sqrt[x^2 + y^2 + z^2]},
0.5 (1. + z/Sr2R2) Exp[2 \[Pi] I (Sr2R2 - z)]/Sr2R2],
RuntimeAttributes -> {Listable},
CompilationTarget -> "C"
];
ZRangeList = {{20., 19., 18., 17., 16., 15., 14., 13., 12., 11.},
{10., 9., 8., 7., 6., 5., 4., 3., 2., 1.}};
results = Table[Func2[kernel, ZList], {ZList, ZRangeList}];
一些解释:
- 这项工作分为两个函数,因为我希望尽可能编译。
- Z值被分成一个列表的列表,以使函数同时评估多个层。
一些问题:
- 你如何使它更快?
- 按原样运行时,我的两个核心都在使用但只有一个mathematica内核。如果我使用ParallelTable运行它,则运行多个内核但消耗更多RAM并且最终速度较慢。
- 我希望能够在尽可能多的核心上运行它-我有一个LightweightGrid正在运行-我该怎么做?
- 为什么我不能将已编译的函数传递给不同维度的列表?