我正在尝试使用并行化使 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/