首页 > 解决方案 > 编译器没有利用所有 CPU,我需要你的建议

问题描述

我的 PC 有两个 cpu xeon e5-2678v3,每个 cpu 12 个内核/24 个线程(总共 24 个内核/48 个线程)我提交了 slurm 批处理作业,该作业为我的代码请求多核(Linux 中带有英特尔 fortran 编译器的 CFD fortran 代码)代码运行良好但似乎所有 48 个线程只在 1 个 cpu 上运行,而不是双 cpu。我使用上面相同的 slurm 批处理作业文件检查了串行和 openMP 运行;结果相同,计算速度相同。请告诉我如何使用所有 2 个 CPU 来运行代码?

第一个作业文件,系统以所有 48 个线程运行:*

#!/bin/sh
#PBS -N Ogive
#PBS -o output
#PBS -j oe
#PBS -l ncpus=2
cd <directory>
time ./2D-TFlow2Wall-MCM-HKO

*

第二个作业文件,系统以 20 个线程运行

*#!/bin/bash 
#SBATCH --job-name=testOMP
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=20
#SBATCH --exclusive
#SBATCH --time=0-20:00:00
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}
time ./2D-test*

标签: linuxmultithreadingslurmintel-fortran

解决方案


我怀疑您--ntasks-per-node的 1 指令正在与您的--cpus-per-task指令竞争,听起来它们可能相互竞争(也就是说,我认为 SLURM 希望您提供其中一个选项,而不是两者都提供)。也尝试将其设置为 20,或仅使用其中一个。从文档

--ntasks-per-node= 请求在每个节点上调用 ntasks。如果与 --ntasks 选项一起使用,则 --ntasks 选项将优先,并且 --ntasks-per-node 将被视为每个节点的最大任务数。旨在与 --nodes 选项一起使用。这与 --cpus-per-task=ncpus 有关,但不需要知道每个节点上的实际 cpus 数量。在某些情况下,能够请求在每个节点上调用不超过特定数量的任务会更方便。这方面的示例包括提交混合 MPI/OpenMP 应用程序,其中每个节点应仅分配一个 MPI“任务/等级”,同时允许 OpenMP 部分利用节点中存在的所有并行性,或提交单个设置/清理/监控作业到预先存在的分配的每个节点,作为更大作业脚本中的一个步骤。

(强调我的。)


推荐阅读