0

我有一个使用 MPI 和 OpenMP 的 C 程序。为了在 Windows 系统上编译这样的程序,我下载并安装了 MinGW 提供的 gcc 编译器。-fopenmp使用这个编译器,我可以使用gcc的密钥通过 OpenMP 编译和执行 C 程序。这样的程序运行没有问题。为了使用 MPI 编译和执行 C 程序,我下载并安装了 MPICH2。现在我可以毫无问题地编译和运行这样的程序,为 gcc 指定额外的参数,由 MinGW 提供。但是当我想编译和运行一个同时使用 OpenMP 和 MPI 的程序时,我遇到了问题。我-fopenmp为 gcc 编译器指定了 MPI 程序的键和键。编译器没有给我任何错误。我试图通过mpiexec,由 MPICH2 提供。我的程序不想工作(它是一个 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;
}
4

3 回答 3

2

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

mpicc -openmp hello.c -o hello
于 2012-10-09T08:42:31.640 回答
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
于 2012-10-11T03:51:56.587 回答
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 调用,MPI_THREAD_SINGLE它们仍然可以与混合 OpenMP/MPI 代码一起正常工作。

于 2012-10-10T09:50:54.247 回答