parallel-processing - 何时使用 MPI、OpenMP 和 PBS Pro 进行超线程?

标签 parallel-processing mpi pbs hyperthreading

在运行 Linux 的共享内存系统上,假设它有 4 个 Intel Xeon-E5 CPU,每个 CPU 有 10 个内核。安装了 PBS Pro。例如用户使用 qsub -l select=1:ncpu=30如果他们想在 30 个内核上运行,就可以运行软件程序。或者会做 setenv OMP_NUM_THREADS 30对于其他软件。

我的问题主要与基于 MPI 的商业软件包有关。暂时忽略 PBS 和 qsub,运行这些程序所做的只是在启动后从下拉菜单中选择要运行的内核数,或者在启动时从提示中选择类似 ./cfd.exe -np 30 的内容。使用 30 个内核。

系统有 4 个物理插槽 = 4 个 CPU;
每个 CPU 有 10 个内核 = 总共 40 个物理内核;
每个核心都有超线程,所以 cat /proc/cpuinfo将返回 80 个 CPU 或编号从 0 到 79 的内核。

第一季度:我对超线程何时以及如何发生感到困惑,
如果它在幕后自动发生,
或者如果我必须以某种方式手动调用它才能发生。

对于具有许多内核的系统,但为了简单起见,我将继续使用上述数字,现在当使用 PBS Pro 和 qsub 并且用户使用时 qsub -l select=1:ncpu=20它们被分配了 10 个物理内核,编号从 10..19 开始,还分配了 10 个虚拟内核,编号从 50..59 开始。这让我想到了下面的问题 2-

Q2:正确的运行方式是什么?
如果/proc/cpuinfo 总共返回 80 个 CPU,那么我可以安全地假设我总是可以做 ./cfd.exe -np 80setenv OMP_NUM_THREADS 80并确保每个核心都没有以 50% 的速度运行?或者我必须永远做大于 -np 40并让系统处理它?

我以 cfd 软件为例,但我也在询问我和同事使用 OpenMP 和其他并行指令编写的软件。

Q3:我的想法是否正确,如果我启动一个软件程序并指定它在 4 个内核上运行,或者硬编码以查找最多 4 个内核并行运行,那么如果 CPU 具有超线程能力,超线程会发生吗幕后自动?这样,如果我要在 BIOS 或 EFI 级别禁用超线程,那么我的程序会运行得更慢吗?假设程序和问题是线性扩展的,8 核的速度总是 4 核的两倍,16 核的速度总是 8 核的两倍,依此类推。这个问题 #3 我最有兴趣正确理解。

最佳答案

q1
超线程 (HT) 意味着有两个处理器*共享一个物理内核。
*:我使用 Linux 术语中的术语处理器。激活超线程后,一个处理器将等于一个硬件线程。
您没有在应用程序中明确使用 HT。
是否使用 HT 取决于应用程序线程是否在共享物理内核的处理器上运行。
批处理系统如何处理这取决于配置。
根据我的经验,HT 通常在共享批处理系统中被禁用,因为它使事情复杂化,导致微妙的性能问题,并且很少为优化代码提供显着的性能优势。
有一些关于如何处理 HT in PBS 的有趣文档。 .
我建议您尝试通过运行以下作业来验证从批处理系统获得的处理器类型:

bash -c "taskset -p \$\$"
注意转义的 \$\$使用内部 bash 的进程 ID - 而不是调用作业提交的进程 ID。
生成的十六进制关联掩码会告诉您作业在哪些处理器上运行。例如 5 = 00000101将意味着处理器 0 和 2。
q3
我想你误解了HT。它不会仅仅因为您有两倍的可用处理器而为您提供 2 倍的加速。您可能会获得 10% 的加速,或者您的应用程序可能运行得更慢。如果您的目标是性能,您将始终更喜欢使用具有独立内核的 4 个处理器,而不是共享 2 个内核的 4 个处理器。
q2
如果它从 HT 中受益,它在很大程度上取决于应用程序。
如果您想利用 HT,只需运行最大数量的进程/线程即可利用所有处理器(或硬件线程)。
如果您的应用程序无法从 HT 中受益,请选择进程/线程数作为物理内核数。
然后,您可以通过确保您的应用程序线程仅允许每个物理内核使用一个硬件线程来帮助调度程序,例如通过 PBS,tasksetKMP_AFFINITY .

关于parallel-processing - 何时使用 MPI、OpenMP 和 PBS Pro 进行超线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858803/

相关文章:

performance - 使用 MPI_PACK() 的优势

linux - 如何以正确的方式向 PBS 系统提交工作列表?

linux - 名称为 ! 的文件是什么意思?意思是?

Bash:并行化 FOR 循环执行等待来自 grep

python - 让 Pycuda 在 2 个 gpus 上与 Mpi4py 一起工作

c - 文件读取问题 - 平行版生命游戏

linux - CNN 训练超过了 PBS 中给定核心的数量

python - 即使我处理了它的异常,我的子进程也会无声地崩溃,没有任何错误消息

scala - Scala 中多个 Futures 的奇怪案例

r - 如何使用多核处理更快地运行 glm 函数