【问题标题】:MPI & OpenMP: omp_get_max_threads returns half of the true thread capacityMPI & OpenMP:omp_get_max_threads 返回一半的真实线程容量
【发布时间】:2021-09-26 02:41:50
【问题描述】:

由于未知原因,当我使用 MPI omp_get_max_threads() 编译时,返回的线程数 (12) 是我的计算机容量的一半(24 线程,12 核)。这种奇怪的行为现在无故出现了两天,而之前一切正常。我已经从source 安装了 MPI。我尝试以同样的方式再次安装它,但仍然遇到同样的问题。

我看了几篇帖子,看到了oversubscribe或者omp_set_dynamic()的解决方案,但是我对这两个都不满意,因为我在运行不同类型机器的集群,我很想确定动态的最大线程数。

如何找到驱动omp_get_max_threads() 默认结果的变量?

#include <omp.h>
#include <mpi.h>
#include <iostream>

int main(int argc, char** argv){

  int provided;
  MPI_Init_thread(NULL, NULL, MPI_THREAD_SINGLE, &provided);

  //int num_cpu = omp_get_max_threads();
  //omp_set_dynamic(0); 
  //omp_set_num_threads(4); 
  std::cout << omp_get_max_threads()<< std::endl;

  MPI_Finalize();
  return 0;

} 

mpicxx not_fun.cpp -fopenmp -o not_fun 编译它。如果我用./not_fun 执行它,结果是24,这是正确的。如果我用mpiexec -np 4 ./not_fun 执行它,结果是12,不正确。

其他信息

我不确定这是否相关。

我的 RAM 最终出现了问题,其中一根棒无法正常工作,因此我将其移除。这可能是相关的,但我不这么认为。我使用新的 RAM 配置再次安装了 MPI,但仍然遇到同样的问题。

【问题讨论】:

  • 如果你使用多线程,你应该使用MPI_Init_thread
  • 感谢您的回复。我已经编辑了我的代码并尝试了您的解决方案,但仍然遇到同样的问题。好像不影响最大线程数
  • 请记住,MPI 可能会将任务固定在核心子集上(默认情况下,在套接字上打开 MPI 固定任务 - 如果有 2 个 MPI 任务,则为核心)。您也确实希望您的 OpenMP 线程结束分时。
  • 在你的情况下,我猜 MPI 任务被固定到套接字上,因此每个任务有 12 个内核。但是您在 24 核节点上运行 4*12=48 个 OpenMP 线程(分时 => 次优性能)。

标签: c++ multithreading mpi openmp


【解决方案1】:

您误解了线程是什么。线程是一种软件结构,与硬件无关。尝试编写一个打印线程数的程序,然后执行OMP_NUM_THREADS=321 ./yourprogram 它将报告最大和实际线程数均为 321。如果您想要与内核数相关的信息,请使用omp_get_num_procs。 (并且要明确一点:线程数来自 OMP_NUM_THREADS 环境变量,或源代码中的任何显式覆盖。)

如果您编写一个 MPI 程序,并且执行相同的操作,您会发现(可能)每个 MPI 进程都获得相同数量的“procs”,并且 MPI procs(在一个节点上)和 OMP procs 相乘将是小于核心数。但这可能取决于您的实施。

【讨论】:

  • 好的,谢谢你的解释。它使一些事情变得清晰。运行时我不知道此“OMP_NUM_THREADS”覆盖。它确实成功了。
  • 这是一个环境变量。在我的解释中,我只为一个命令设置它,但您可以使用export OMP_NUM_THREADS=17; ./yourprogram 更永久地设置它。
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2013-12-12
  • 2012-09-03
  • 2011-11-02
相关资源
最近更新 更多