linux - 编译器没有利用所有 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*
解决方案
我怀疑您--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 部分利用节点中存在的所有并行性,或提交单个设置/清理/监控作业到预先存在的分配的每个节点,作为更大作业脚本中的一个步骤。
(强调我的。)
推荐阅读
- javascript - Redux 状态更新在解析大型数据集时不会导致重新渲染
- python - split_test_train 和交叉验证之间的分数差异很大 (10%)
- firebase - Flutter Google 登录错误未被捕获
- java - 如何从 Java 中的 GMail 帐户的收件箱中读取电子邮件?
- ajax - 如何从异步函数中保存数据
- regex - 为什么正则表达式在空手道框架中不起作用?
- forms - Xamarin (UWP):如果设置了 Button 的属性“ImageSource”,则 System.NullReferenceException
- r - R的下载包有问题吗?
- r - 当函数的参数丢失时返回 NAs 而不是 Inf
- amazon-web-services - 如何将 S3 网站的访问限制为 Cloudfront?