如何在群集上运行MPI和OpenMp的混合代码

时间:2018-09-23 07:17:28

标签: c parallel-processing mpi openmp

我一直在为矩阵分配代码进行矩阵并行化的混合并行化。目的是将行分布在节点中以进行消息传递,并在每个节点内应用OpenMp进一步划分行。另外,我们正在尝试在我们的大学集群上运行,该集群的每个节点具有16个核心体系结构,并具有4个节点。现在,运行代码时,必须有4个节点,每个节点都必须产生4个OpenMP线程。但是它没有在4个线程上运行,并且在调试过程中,我们发现每个节点仅在1个线程上运行代码。我们通过查看top命令输出的CPU使用情况发现了这一点。在一个节点上时,我仅运行OpenMP代码,CPU使用率似乎为400%,这意味着每个线程并行运行,而不是并行运行。进入mpi环境,我正在使用Intel 64架构,而我用来运行代码的mpirun命令是

**mpirun** -np 4 -machinefile ./machines hyb 

其中machine是一个文件,其中包含有关集群中处理器的详细信息。就是这样

gics1 slots=1
gics2 slots=1 
gics3 slots=1
gics4 slots=1

作为示例代码,我放置了另一个代码,对于在群集上运行它的帮助将不胜感激。

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

int main() {
    MPI_Init(NULL, NULL);

    int world_rank, WORLD_SIZE;
    MPI_Comm_size(MPI_COMM_WORLD, &WORLD_SIZE);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    omp_set_num_threads(4);
    #pragma omp parallel num_threads(4)
    {
    int i;
    int a;
    for(i = 0; i < 10000000000; i++) {
        a = (a + 1)    % 100;
    }
        printf("MPI Rank: %d OMP Rank: %d\n", world_rank, 
            omp_get_thread_num());
    }

    MPI_Finalize();
}

相应的OpenMp代码为

#include <omp.h>
#include <stdio.h>

int main() {

    omp_set_num_threads(4);
    #pragma omp parallel num_threads(4)
    {
    int i;
    int a;
    for(i = 0; i < 1000000000; i++) {
        a = (a + 1) % 100;
    }
        printf("OMP Rank: %d\n", omp_get_thread_num());
    }

    // MPI_Finalize();
    return 0;
}

OpenMp代码以400%的CPU使用率运行,而不是混合代码。

0 个答案:

没有答案