addprocs()的几点疑问?

我刚开始学习Julia的并行,并且对于进程与CPU工作的细节不是很清楚。
关于进程并行,我有几点疑问:

  1. 使用Sys.CPU_THREADS来考虑应该添加的进程数是否正确?
  2. 通过addprocs(Sys.CPU_THREADS - 1)是否是为每个CPU核心添加一个进程,Julia是否是默认这样做的
  3. 假设2成立,那么添加了多于CPU核心数的进程,相较于核心与进程一一对应的情况是否会提高并行的效率

提前感谢!

线程数

没看懂

这个跟具体问题相关吧

错误,一般的数值代码并行应该使用CPU物理核心数,这里的CPU_THREADS是包括hyper thread的线程数。

编译器无法强制进程和CPU核心绑定,这个需要调用系统接口,在相对特殊的应用里才需要考虑强制和CPU物理核心绑定进程。Julia里要做需要调用系统接口(比如Linux上 bash - Assigning a cpu core to a process - Linux - Stack Overflow )

进程的数量取决于算法。如果是简单的并行不会提高效率,反而有可能降低效率。并且具体性能需要你benchmark来决定。想要谈性能先学习怎么benchmark

感谢回复!还是有一些不太明白。比如我现在需要计算两个8000×8000矩阵的乘积,我会这样做:使用length(Sys.cpu_info)查看核心数为8,于是addprocs(7),然后开始一通计算。

  1. 如果Julia在一个核上创建了多个进程,必然会有cpu没有进程,甚至一核计算七核围观。是不是就不能充分利用计算资源了。那么为什么将进程与物理核心绑定会是个别情况下的选择呢
  2. 如果我创建了16个进程,每个核心绑定2个,有可能性能会好于8个进程,具体需要做测试,是这样吗