【问题标题】:libgomp: Thread creation failed: Invalid argument after disabling/enabling CPUslibgomp:线程创建失败:禁用/启用 CPU 后参数无效
【发布时间】: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


【解决方案1】:

即使再次启用 CPU,OMP 线程的数量也只有一半(因为我禁用了奇数线程)。

解决方案: 最后我不得不重新启动服务器。之后,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多