「并行计算」示例代码


#1

想请教一下各位,有没有关于并行(多进程与分布式内存)的相关实例代码?因为我之前一直学习的C/C++语言的MPI,所以在看到Julia的并行有一点不适应,不知道该怎么去开发并行程序,希望能通过看别人的代码对Julia的并行编程有更深一步的理解。


#2

可以接着用 MPI


#3

有关于这部分的文档吗?我没找到:no_mouth:


#4

README.md 里有啊,是个 icon

https://juliaparallel.github.io/MPI.jl/latest/


#5

JuliaCon有并行计算的视频,并且还有新的多线程机制的介绍可以去YouTube上看看。个人感觉,Julia自带的并行和分布式机制比MPI好用很多,需要写的代码量少。


#6

另外想问下,如果在Julia上接着用MPI, 想问下其跟C语言的MPI有什么区别。是不是仅仅是表面上使用的是Julia语言,而实际上还是用的C语言的MPI(也就是简单的代码包装),而并没有用的Julia自带的并行机制。


#7

MPI是一套协议,有很多实现。你用MPI就不是在用Julia的协议。


#8

我看Julia里面对MPI的实现是直接调用C语言的MPI代码(ccall


#9

https://docs.julialang.org/en/v1/manual/parallel-computing/index.html#Multi-Core-or-Distributed-Processing-1


#10

我写了一组博客,毛遂自荐一下。
《Julia并行计算笔记》
https://blog.csdn.net/iamzhtr


#11

可以在社区的公众号上转发一下么?

cc: @Jun


#12

嗯,可以的。

@HetaoZ 不过我看完有些建议:

  1. 结构上,尽量有主次,避免讲A的时候,附带了B,C,D… 看起来似乎是照顾读者,面面俱到,实际上这么写很容易让读者困惑。
  2. Why?

    声明一个共享数组并初始化为零,默认存储在主进程上,所以在后面的并行计算中,盯着任务管理器会看到主进程完成得比三个远程Worker更快些。

  3. 下面这段例子没有从原理上解释清楚

    系统会报错。那么到底怎样才是合理的方法?答案是把t改为参数

  4. rmprocs 默认会在退出的时候被调用,一般程序执行的时候也不会反复调用addprocs
  5. 这段没太明白具体意思

    今天测试后发现,如果在并行化的循环体中引用了结构体数组,耗时会增大两个数量级。结论是并行程序里尽量不要用结构体数组。


#13

感谢大佬建议。逐个回答:

  1. 是个博客新手,文笔有待进步。
  2. 我盯着任务管理器,发现主进程总是率先完成。自己推测是因为SharedArray存储位置的缘故,没有严格证据。
  3. 这个跟作用域有关。我写了一篇专门解释作用域,然而其实也没有彻底搞懂…
  4. (跳过)
  5. 我习惯叫struct为结构体。起初我创建了一个元素类型为自定义struct的SharedArray,用@distributed对它做并行修改,发现速度很慢。于是拆成几个Float64类型的SharedArray,快了很多。所以写了这么一句。

#14

@Jun
顺便,我也是刚学Julia三个月的萌新。虽然写了并行计算的博客,但我发现在实际编写CFD程序的时候,只用到@distributed,其他的东西比如Channel好像压根用不上(除了几个大循环之外几乎都是串行)。所以我很好奇,你们是怎么运用Channel、@spawn等方法的?什么情况下用这些方法?