ron*_*ron 6 parallel-processing mpi hyperthreading pbs
在运行 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 的内核。
Q1:我对超线程何时以及如何发生感到困惑,如果它在幕后自动发生,或者我是否必须以某种方式手动调用它来发生。
对于具有许多内核的系统,但为了简单起见,我将继续使用上述数字,现在当使用 PBS Pro 和 qsub 并且用户是否qsub -l select=1:ncpu=20分配了 10 个物理内核,例如 10..19,并且还分配了 10 个虚拟内核编号从 50..59。这让我想到了下面的问题 2-
Q2:正确的跑步方式是什么?如果 /proc/cpuinfo 总共返回 80 个CPU,那么我可以安全地假设我总是可以做到./cfd.exe -np 80 或setenv OMP_NUM_THREADS 80确保每个核心都没有以 50% 的速度运行吗?或者我必须永远不要做大于-np 40并让系统处理它?
我以 cfd 软件为例,但我也在询问我和同事使用 OpenMP 和其他并行指令编写的软件。
Q3:我的想法是否正确,如果我启动一个软件程序并指定它在 4 个内核上运行,或者它被硬编码以寻找最多 4 个内核并行运行,那么如果 CPU 具有超线程能力,是否会超线程自动发生在幕后?这样,如果我要在 BIOS 或 EFI 级别禁用超线程,那么我的程序会运行得更慢吗?假设程序和问题是线性扩展的,8 核的速度总是 4 核的两倍,16 核的速度总是 8 核的两倍,依此类推。这个问题 #3 我最有兴趣正确理解。
超线程 (HT) 意味着有两个处理器* 共享一个物理内核。
*:我使用Linux 术语中的术语“处理器” 。激活超线程后,一个处理器将相当于一个硬件线程。
您没有在应用程序中明确使用 HT。是否使用 HT,取决于应用程序线程是否在共享物理核心的处理器上运行。
批处理系统如何处理这取决于配置。根据我的经验,HT 通常在共享批处理系统中被禁用,因为它使事情变得复杂,导致微妙的性能问题,并且很少为优化代码提供显着的性能优势。有一些关于如何在 PBS 中处理 HT 的有趣文档。
我建议您尝试通过运行以下作业来验证从批处理系统获得的处理器类型:
bash -c "taskset -p \$\$"
Run Code Online (Sandbox Code Playgroud)
请注意,转义\$\$使用内部 bash 的进程 ID,而不是调用作业提交的进程 ID。生成的十六进制关联掩码告诉您作业正在哪些处理器上运行。例如,5 = 00000101表示处理器 0 和 2。
我觉得你对HT有什么误解。它不会仅仅因为您拥有两倍的可用处理器而为您提供 2 倍的加速。您可能会获得 10% 的加速,或者您的应用程序可能运行得更慢。如果您的目标是性能,您将始终更喜欢使用具有独立内核的 4 个处理器,而不是共享 2 个内核的 4 个处理器。
是否受益于 HT 在很大程度上取决于应用程序。如果您想利用 HT,只需运行最大数量的进程/线程即可利用所有处理器(或硬件线程)。
如果您的应用程序无法从 HT 中受益,请选择进程/线程数作为物理核心数。然后,您可以通过确保您的应用程序线程只允许每个物理核心使用一个硬件线程(例如通过 PBStaskset或KMP_AFFINITY.