performance - 并行代码比串行代码慢(值函数迭代示例)

标签 performance parallel-processing julia

我正在尝试使用并行化使 Julia 中的代码更快。我的代码嵌套了串行 for 循环并执行值函数迭代。 (如 http://www.parallelecon.com/vfi/ 中所述)

以下链接显示了我编写的代码的串行和并行版本: https://github.com/minsuc/MyProject/blob/master/VFI_parallel.ipynb (您也可以在 github 页面中找到 DefinitionPara.jl 中定义的函数。)串行代码定义为 main(),并行代码定义为 main_paral()。

main() 中的第三个 for 循环是我找到给定最大化器 (nCapital, nProductivity) 的步骤。正如官方并行文档中所建议的,我将工作分布在 nCapital 网格上,该网格由许多点组成。

当我对串行和并行代码执行 @time 时,我得到

串行:0.001041 秒

并行:0.004515秒

我的问题如下:

1) 我添加了两个工作人员,每个工作人员的工作时间为 0.000714 秒和 0.000640 秒,正如您在 ipython 笔记本中看到的那样。并行代码较慢的原因是由于开销成本?

2)我通过改变增加了网格点的数量

vGridCapital = 收集(0.5*capitalSteadyState:0.000001:1.5*capitalSteadyState)

尽管每个工作人员执行大量工作,但串行代码比并行代码快得多。当我添加更多工作人员时,串行代码仍然更快。我认为有些问题,但我一直无法弄清楚...这是否与我在并行函数中传递了太多参数这一事实有关

final_shared(mValueFunctionNew、mPolicyFunction、pparams、vGridCapital、mOutput、expectedValueFunction)?

我非常感谢您的意见和建议!

最佳答案

如果同步之间的工作量确实很小,则任务同步开销可能会太长。请记住,常见的操作系统时间切片量程为 10 毫秒,而您在 1 毫秒范围内进行测量,因此在有一点负载的情况下,同步所有工作线程的 4 毫秒延迟是完全合理的。

在所有任务访问同一共享数据结构的情况下,如果共享数据结构是线程安全的,则访问锁定开销很可能是罪魁祸首,即使是较长的并行任务。

在某些情况下,可以对输入和输出使用非线程安全共享数组,但必须确保工作人员不会破坏彼此的结果。

根据工作线程到底在做什么,例如,如果它们输出到相同的数组元素,可能有必要为每个工作线程提供自己的输出数组,并最终将它们合并在一起,但这并不'您的任务似乎并非如此。

关于performance - 并行代码比串行代码慢(值函数迭代示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35707617/

相关文章:

C# 如何使用 LINQ 将列表一分为二

c++ - OpenMP 动态与引导式调度

parallel-processing - Julia 使用 Distributed 和 SharedArrays 和 @sync/@async 进行多次分配

performance - Haskell 中的函数调用有多少开销?

c++ - 将模板化对象存储为成员对象

Java 8 使用 boolean 值打开并行()流?

dataframe - 初始化缺失值的列并稍后填充字段

julia - 如何在不导入的情况下在 Julia 中使用包?

javascript - 如何快速逐像素处理图像?

c++ - 为什么在尝试实现 OpenMPI 时设置单元数