2012-10-09 119 views
0

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

这是我的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; 
} 
+0

你可以得到一个MPI-只计划工作(没有OpenMP的)?您构建和运行该程序的确切步骤是什么? –

+0

@GregInozemtsev仅MPI程序运行良好。构建并运行仅使用MPI的程序:gcc -c -o main.o main.c -I“C:\ ... \ MPHICH2 \ include”; gcc -o main.exe main.o -L“C:\ ... \ MPICH2 \ lib”-lmpi; mpiexec -n 4 main.exe –

回答

2

您可以使用mpicc编译器的 - openmp选项。例如,

mpicc -openmp hello.c -o hello 
+0

谢谢你的回答!不幸的是,用于Windows的MPICH2不包含这样的编译器(至少我无法在“bin”目录中找到它,但是由于MPICH,我在Unix(AIX)服务器上找到了它)。 –

+0

你可以添加更多关于你的错误的细节。你的错误输出是什么? – Dimitri

+0

没有错误。程序不会产生任何输出。 –

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库可能不做广告线程支持(如返回providedMPI_THREAD_SINGLE),他们仍然正常工作与混合的OpenMP/MPI代码,如果一个使MPI来自平行区域内的呼叫。

+0

谢谢你的回答!我在程序中用您的代码替换了对'MPI_Init'的调用。当我使用'-fopenmp'键进行编译时,'if'的内部部分没有达到。但是,当我编译我的程序与仅使用MPI的程序相同,但使用-fopenmp键时,我收到一个程序,它不会再次产生任何输出。 –

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 
+0

我包含这个头文件,但没有再次输出。 –