gpt4 book ai didi

wolfram-mathematica - 并行化行为

转载 作者:行者123 更新时间:2023-12-03 07:44:04 25 4
gpt4 key购买 nike

我试图理解 Parallelize[] 行为的一些怪癖。

如果我这样做:

CloseKernels[];
LaunchKernels[1]
f[n_, g_] :=
First@AbsoluteTiming[
g[Product[Mod[i, 2], {i, 1, n/2}]
Product[Mod[i, 2], {i, n/2 + 1, n}]]];
Clear[a, b];
a = Table[f[i, Identity], {i, 100000, 1500000, 100000}];
LaunchKernels[1]
b = Table[f[i, Parallelize], {i, 100000, 1500000, 100000}];
ListLinePlot[{a, b}, PlotStyle -> {Red, Blue}]

结果是预期的: enter image description hereCPU利用率:

enter image description here

但是如果我这样做,更改要评估的函数:

CloseKernels[];
LaunchKernels[1]
f[n_, g_] :=
First@AbsoluteTiming[
g[Product[Sin@i, {i, 1, n/2}]
Product[Sin@i, {i, n/2 + 1, n}]]];
Clear[a, b];
a = Table[f[i, Identity], {i, 1000, 15000, 1000}];
LaunchKernels[1]
b = Table[f[i, Parallelize], {i, 1000, 15000, 1000}];
ListLinePlot[{a, b}, PlotStyle -> {Red, Blue}]

结果是:
enter image description here

CPU 利用率:
enter image description here

我认为我缺少一些有关 Parallelize[] 的重要知识来理解这一点。

有什么提示吗?

最佳答案

我的猜测是问题不在于Parallelize,而在于您尝试计算的内容。对于 Mod,结果始终为 1 或 0,其乘积也是如此。对于 Sin,由于使用整数运算,因此会积累巨大的符号表达式(Sin[i] 的乘积)。它们在计算后被丢弃,但它们需要堆空间(内存分配/释放)。您观察到的二次行为可能是由于大尺寸内存分配的线性复杂性“乘以”迭代的线性复杂性所致。这似乎是主导效应,掩盖了并行化的实际成本。如果您应用 N,例如 Sin@N[i],结果会完全不同。

关于wolfram-mathematica - 并行化行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5369580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com