【发布时间】: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