MPI & OpenMP:omp_get_max_threads returns 真实线程容量的一半

MPI & OpenMP: omp_get_max_threads returns half of the true thread capacity

由于未知原因,当我使用 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,但仍然遇到同样的问题。

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

如果你写一个 MPI 程序,并且你做同样的事情,你会发现(可能)每个 MPI 进程获得相同数量的“procs”并乘以 MPI procs(在一个节点上)和 OMP procs将小于核心数。但这可能取决于您的实施。