想请教一下各位,有没有关于并行(多进程与分布式内存)的相关实例代码?因为我之前一直学习的C/C++
语言的MPI
,所以在看到Julia的并行有一点不适应,不知道该怎么去开发并行程序,希望能通过看别人的代码对Julia的并行编程有更深一步的理解。
1 个赞
可以接着用 MPI
1 个赞
有关于这部分的文档吗?我没找到
JuliaCon有并行计算的视频,并且还有新的多线程机制的介绍可以去YouTube上看看。个人感觉,Julia自带的并行和分布式机制比MPI好用很多,需要写的代码量少。
另外想问下,如果在Julia上接着用MPI, 想问下其跟C语言的MPI有什么区别。是不是仅仅是表面上使用的是Julia语言,而实际上还是用的C语言的MPI(也就是简单的代码包装),而并没有用的Julia自带的并行机制。
MPI是一套协议,有很多实现。你用MPI就不是在用Julia的协议。
我看Julia里面对MPI的实现是直接调用C语言的MPI代码(ccall
我写了一组博客,毛遂自荐一下。
《Julia并行计算笔记》
5 个赞
嗯,可以的。
@HetaoZ 不过我看完有些建议:
- 结构上,尽量有主次,避免讲A的时候,附带了B,C,D… 看起来似乎是照顾读者,面面俱到,实际上这么写很容易让读者困惑。
- Why?
声明一个共享数组并初始化为零,默认存储在主进程上,所以在后面的并行计算中,盯着任务管理器会看到主进程完成得比三个远程Worker更快些。
- 下面这段例子没有从原理上解释清楚
系统会报错。那么到底怎样才是合理的方法?答案是把t改为参数
rmprocs
默认会在退出的时候被调用,一般程序执行的时候也不会反复调用addprocs
- 这段没太明白具体意思
今天测试后发现,如果在并行化的循环体中引用了结构体数组,耗时会增大两个数量级。结论是并行程序里尽量不要用结构体数组。
感谢大佬建议。逐个回答:
- 是个博客新手,文笔有待进步。
- 我盯着任务管理器,发现主进程总是率先完成。自己推测是因为SharedArray存储位置的缘故,没有严格证据。
- 这个跟作用域有关。我写了一篇专门解释作用域,然而其实也没有彻底搞懂…
- (跳过)
- 我习惯叫struct为结构体。起初我创建了一个元素类型为自定义struct的SharedArray,用@distributed对它做并行修改,发现速度很慢。于是拆成几个Float64类型的SharedArray,快了很多。所以写了这么一句。
@Jun
顺便,我也是刚学Julia三个月的萌新。虽然写了并行计算的博客,但我发现在实际编写CFD程序的时候,只用到@distributed,其他的东西比如Channel好像压根用不上(除了几个大循环之外几乎都是串行)。所以我很好奇,你们是怎么运用Channel、@spawn等方法的?什么情况下用这些方法?