Parallel processing 什么时候使用MPI、OpenMP和PBS Pro进行超读?

Parallel processing 什么时候使用MPI、OpenMP和PBS Pro进行超读?,parallel-processing,mpi,pbs,hyperthreading,Parallel Processing,Mpi,Pbs,Hyperthreading,在运行Linux的共享内存系统上,假设它有4个Intel Xeon-E5 CPU,每个CPU有10个内核。已安装PBS Pro。例如,如果用户想要在30个内核上运行软件程序,他们可以使用qsub-lselect=1:ncpu=30。或者对其他软件执行setenv OMP_NUM_THREADS 30 我的问题主要与基于MPI的商业软件包有关。暂时不考虑PBS和qsub,运行这些程序所要做的就是在启动后从下拉菜单中选择要运行的内核数,或者在启动时从提示符中选择要使用的内核数,例如/cfd.exe-

在运行Linux的共享内存系统上,假设它有4个Intel Xeon-E5 CPU,每个CPU有10个内核。已安装PBS Pro。例如,如果用户想要在30个内核上运行软件程序,他们可以使用
qsub-lselect=1:ncpu=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%的速度运行?或者我必须永远不要做大于
-np40
的事情,让系统来处理它吗

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

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

q1 超线程(HT)意味着有两个处理器*共享一个物理内核

*:我使用Linux术语中的处理器一词。使用激活的超线程,处理器将等于一个硬件线程

在应用程序中不显式使用HT。 是否使用它取决于应用程序线程是否在共享物理内核的处理器上运行

批处理系统如何处理此问题取决于配置。 根据我的经验,HT通常在共享批处理系统中被禁用,因为它使事情复杂化,导致微妙的性能问题,并且很少为优化代码提供显著的性能优势。 有一些关于如何处理的有趣文档

我建议您尝试通过运行以下作业来验证从批处理系统中获得的处理器类型:

bash -c "taskset -p \$\$"
注意,转义的
\$\$
使用内部bash的进程id,而不是调用作业提交的进程id。 生成的十六进制关联掩码将告诉您作业正在哪个处理器上运行。例如
5=00000101
表示处理器0和2

第三季度 我想你误解了。它不能仅仅因为可用处理器的数量是原来的两倍,就为您提供2倍的加速。您可能会获得10%的加速,或者您的应用程序可能会运行得更慢。如果您的目标是性能,那么您总是更喜欢使用具有独立内核的4个处理器,而不是共享2个内核的4个处理器

问题2 它在很大程度上取决于应用程序是否从HT中获益。 如果您想利用HT,只需运行最大数量的进程/线程即可利用所有处理器(或硬件线程)

如果应用程序不能从HT中获益,请选择进程/线程数作为物理核心数。 然后,您可以通过确保每个物理内核只允许应用程序线程使用一个硬件线程来帮助调度程序,例如通过PBS、
taskset
KMP\u AFFINITY