【发布时间】:2017-08-19 18:52:34
【问题描述】:
我有一台 2 插槽机器,每台机器都有 14 个内核并启用了超线程 - 因此总共 14*2*2 = 56 个处理单元或逻辑 CPU。
我通过以下方式禁用了所有奇数 CPU(1、3、5、7、...、53、55):
for i in {1..55..2}; do echo 0 > /sys/devices/system/cpu/cpu$i/online; done
/sys/devices/system/cpu/online shows 0 2 4 6 ... 52 54
现在,每当我尝试使用 OpenMP 创建多个线程 (=28) 时,都会出现以下错误:
libgomp: Thread creation failed: Invalid argument
我通过以下方式恢复它:
for i in {1..55..2}; do echo 1 > /sys/devices/system/cpu/cpu$i/online; done
/sys/devices/system/cpu/online shows 0-55
不过,我还是遇到了同样的错误。
有什么想法吗?
编辑:在我进行上述实验之前,代码对于任意数量的线程都可以正常工作。
【问题讨论】:
-
如果您尝试每个内核运行 1 个线程,那么线程放置似乎只是建议性的,如果您的目标是 libgomp 支持关联的目标,那么最好简单地设置 GOMP_CPU_AFFINITY 掩码。如果没有,你必须准备好接受任何线程到逻辑 cpu 分配。
-
我相信这与亲和力无关。它根本无法运行超过 1 个线程。可能除了 CPU0 之外它看不到任何其他 CPU(根本无法禁用)。我不知道禁用/启用 CPU 是否会影响或清除任何 OpenMP 环境变量。也找不到任何文章。
标签: multithreading linux-kernel openmp cpu-cores linuxthreads