我在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;
}
答案 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