parallel-processing - 如何停止 mpirun 将多个作业分配给同一个核心而不接触其他核心
问题描述
我是 mpirun 的新手,我遇到了一个小问题。我有 n 个作业,我只想在我的机器的 2 个内核上运行,所以我打开 n 个终端窗口并
mpirun -np 2 [program]
在每个终端窗口中使用常用的,但不是使用 2*n 个内核,而是只使用其中的一小部分,并且应用程序非常慢,这让我相信 mpirun 正在将多个作业堆叠在同一个内核上,而不会触及同一个 CPU 上的其他内核,这使得作业速度慢得令人难以忍受,并且总体上降低了工作流程的效率......
我尝试
--bind-to core
在每次调用中使用该选项,但这似乎并没有改变 mpirun 的行为...
什么可能导致这种行为,我该如何解决它,以便在没有足够的核心来满足需求之前它不会在相同的核心上堆叠作业?
非常感谢!
解决方案
Open MPI 的默认行为是--bind-to core
在运行 2 个 MPI 任务作业时。
这里的问题是,从终端启动的 MPI 作业是独立的,它们都将任务 0 固定在 cpu 0 上,并将任务 1 固定在 cpu 1 上,因此它们最终会分时共享前两个内核。
一个较小的坏处是--bind-to none
阻止 Open MPI 绑定 MPI 任务,并让 Linux 调度程序使用所有可用的内核。您可以确保在任何给定时间运行的 MPI 任务不超过内核(否则您将返回时间共享)。
正确的解决方法是使用诸如 SLURM 之类的作业调度程序,这将确保任何给定核心在任何给定时间运行的 MPI 任务不超过一个。
手动解决方案是将每个 MPI 作业手动限制为两个核心
$ taskset -c 0,1 mpirun -np 2 a.out
$ taskset -c 2,3 mpirun -np 2 a.out
...
但是,两个工作之间不共享任何核心仍然取决于您。
推荐阅读
- javascript - 如何使用 npm 包?
- python - Python:从 INT 转换为 BYTES 问题
- web-scraping - 将爬网数据导出到 csv
- matlab - 从在 MATLAB App 设计器中创建的 GUI 中的表中复制选定的值
- flutter - 缺少 default_value_for 参数颤动
- sql - GORM SQL 优化
- php - PHP 使用 PHPExcel/PhpSpreadsheet 读取第 3 方动态 excel 文件
- c - 输入加倍直到 EOF
- amadeus - 电子客票、预订参考号验证抛出 Amadeus api 调用
- angular - 在带有 Angular NGRX 的 Storybook 中使用 ReduxDevTools - 有解决方案吗?