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

时间:2016-02-29 19:12:21

标签: 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 = collect(0.5 * capitalSteadyState:0.000001:1.5 * capitalSteadyState)

即使每个工作人员都做了大量工作,串行代码也比并行代码快。当我添加更多工作者时,串行代码仍然更快。我认为有些事情是错的,但我还没有弄明白......这可能与我在并行化函数中传递了太多参数的事实相关

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

根据工作线程的确切行为,例如,如果它们输出到相同的数组元素,可能需要为每个工作者提供自己的输出数组,并在最后将它们合并在一起,但这并不是你的任务似乎就是这种情况。