0

MPIとOpenMPの両方を使用するCのプログラムがあります。このようなプログラムをWindowsシステムでコンパイルするために、MinGWが提供するgccコンパイラをダウンロードしてインストールしました。このコンパイラを使用すると-fopenmp、gccのキーを使用してOpenMPでCプログラムをコンパイルおよび実行できます。このようなプログラムは問題なく実行されます。MPIを使用してCプログラムをコンパイルおよび実行するために、MPICH2をダウンロードしてインストールしました。これで、MinGWが提供するgccの追加パラメーターを指定して、このようなプログラムを問題なくコンパイルして実行できます。しかし、OpenMPとMPIの両方を使用するプログラムをコンパイルして実行したい場合、問題が発生します。-fopenmpgccコンパイラの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 に答える