何时使用MPI和OpenMP以及PBS Pro进行超线程?

问题描述:

在运行Linux的共享内存系统上,假设它有4个Intel Xeon-E5 CPU,每个CPU有10个内核。 PBS Pro已安装。例如,如果用户使用qsub -l select=1:ncpu=30来运行软件程序(如果他们想运行在核心上),那么它们就可以运行。或者为其他软件做setenv OMP_NUM_THREADS 30何时使用MPI和OpenMP以及PBS Pro进行超线程?

我的问题主要与基于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 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 - 而不是一个调用作业提交。 生成的十六进制亲和度掩码告诉你哪些处理器正在运行。例如5 = 00000101将意味着处理器0和2

Q3

我想你误会HT。它不会为您提供2x加速,因为您拥有两倍的处理器。您可能会获得10%的加速,或者您的应用程序运行速度可能会变慢。如果您的目标是性能,您总是会选择使用具有独立内核的4个处理器,而不是共享2个内核的4个处理器。

q2

它高度依赖于应用程序,如果它受益于HT。 如果要使用HT,只需运行最大数量的进程/线程即可利用所有处理器(或硬件线程)。

如果您的应用程序不受益于HT,请选择进程/线程的数量作为物理内核的数量。 然后,您可以通过确保您的应用程序线程仅允许为每个物理核心使用一个硬件线程来帮助调度程序。通过PBS,tasksetKMP_AFFINITY