如何在Windows上使用MPI和OpenMP编译和执行C程序

时间:2012-10-09 08:06:48

标签: c compilation mpi openmp execution

我在C上有一个使用MPI和OpenMP的程序。为了在Windows系统上编译这样的程序,我已经下载并安装了MinGW提供的gcc编译器。使用此编译器,我可以使用密钥-fopenmp为gcc编译和执行OpenMP的C程序。这样的程序运行没有问题。为了用MPI编译和执行C程序,我已经下载并安装了MPICH2。现在我可以毫无问题地编译和运行这些程序,为MinGW提供gcc的附加参数。但是当我想编译并运行一个同时使用OpenMP和MPI的程序时,我遇到了问题。我为gcc编译器指定了两个键-fopenmp和MPI程序的键。 Compilator没有给我任何错误。我试图通过MPICH2提供的mpiexec启动我的程序。我的程序不想工作(这是一个HelloWorld程序,它没有输出任何东西输出)。请帮我正确编译和启动这些程序。

这是我的HelloWorld程序,它不会产生任何输出。

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

int main(int argc, char ** argv)
{
    int thnum, thtotal;
    int pid, np;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&pid);
    MPI_Comm_size(MPI_COMM_WORLD,&np);

    printf("Sequental %d out of %d!\n",pid,np);
    MPI_Barrier(MPI_COMM_WORLD);

    #pragma omp parallel private(thnum,thtotal)
    {
        thnum = omp_get_thread_num();
        thtotal = omp_get_num_threads();
        printf("parallel: %d out of %d from proc %d out of %d\n",thnum,thtotal,pid,np);

    }
    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
    return 0;
}

3 个答案:

答案 0 :(得分:2)

您可以将mpicc编译器与 - openmp选项一起使用。例如,

mpicc -openmp hello.c -o hello

答案 1 :(得分:0)

这可能不是您的问题的根本原因,但MPI标准要求线程程序使用MPI_Init_thread()而不是MPI_Init()。在您的情况下,并行区域内没有MPI调用,因此MPI_THREAD_FUNNELED的线程级别就足够了。您应该将对MPI_Init()的调用替换为:

int provided;

MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided);
if (provided < MPI_THREAD_FUNNELED)
{
    MPI_Abort(MPI_COMM_WORLD, 1);
    return 1; // Usually not reached
}

虽然有些MPI库可能不会宣传线程支持(provided,因为返回的是MPI_THREAD_SINGLE),但如果一个制作MPI,它们仍可正常使用混合OpenMP / MPI代码来自平行区域内的电话。

答案 2 :(得分:0)

您的计划的 OpenMP 部分可能需要#include <omp.h>

parallel: 0 out of 2 from proc 0 out of 0
parallel: 1 out of 2 from proc 0 out of 0