我有一个简单的 C++ 代码,它使用英特尔的 TBB 在使用 PBS 的集群上运行一系列脚本。我想确认我是否按预期使用了所有内核。每个节点有 16 个核心。我已经创建了脚本来花费不同的时间,这样如果列表被平均分配,我就会有空闲的核心。如果随着核心变得可用而划分列表,我应该没有空闲的核心。该代码似乎在单个节点上运行良好,但在多个节点上运行不佳。
除了核心之外,我想要类似于 echo $HOSTNAME
的东西。谷歌让我失望并产生了回应核心数量或使用多少核心的结果。我尝试使用 top 并监控作业运行,但这并没有告诉我哪个核心。
最佳答案
由 Linux 调度程序决定在任何给定时刻哪个进程获得哪个核心。它每秒多次做出这些决定,并根据负载频繁地将流程从一个核心转移到另一个核心。
您可以使用 ps 命令的 psr
选项获取 cpu 分配过程的快照:
ps -o pid,psr,cmd -28832
PID PSR CMD
28832 1 bash
即这里 bash (pid=28832)
被分配给具有 processor id=1
的第二个核心。
在 C
代码中,您可以使用 linux/getcpu.h
中定义的 getcpu(2)
调用。
要将进程分配给一组特定的核心,您可以运行 numactl(8)
或 taskset(1)
指定 cpu affinity mask。
关于PBS 中给定 shell 的 Linux echo cpu(核心)名称/编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30087999/