簡體   English   中英

如何在Windows上使用MPI和OpenMP編譯和執行C程序

[英]How to compile and execute C program with both MPI and OpenMP on Windows

我有一個使用MPI和OpenMP的C程序。 為了在Windows系統上編譯這樣的程序,我已經下載並安裝了MinGW提供的gcc編譯器。 使用此編譯器,我可以使用密鑰-fopenmp for gcc使用OpenMP編譯和執行C程序。 這樣的程序運行沒有問題。 為了用MPI編譯和執行C程序,我已經下載並安裝了MPICH2。 現在我可以毫無問題地編譯和運行這些程序,為MinGW提供gcc的附加參數。 但是當我想編譯並運行一個同時使用OpenMP和MPI的程序時,我遇到了問題。 我為gcc編譯器指定了MPI程序的鍵-fopenmp和鍵。 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;
}

您可以將mpicc編譯器與 - openmp選項一起使用。 例如,

mpicc -openmp hello.c -o hello

這可能不是您的問題的根本原因,但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 ),但如果沒有從並行區域內進行MPI調用,它們仍可以使用混合OpenMP / MPI代碼。

程序的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM