2012-10-09 31 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

我包含這個頭文件,但沒有再次輸出。 –