1

最初の質問:

同じ関数への関数呼び出しを並列化する方法を知りたいのですが、for ループで入力パラメーターが異なります。例 (C コード):

//a[i] and b[i] are defined as elements of a list with 2 columns and N rows
//i is the row number

#pragma omp parallel
{
char cmd[1000];
  #pragma omp for nowait
  for(i=0; i<N; i++) {
    //call the serial programm
    sprintf(cmd, "./serial_program %f %f", a[i], b[i]);
    system(cmd);
  }
}

プラグマ omp for (+もちろん omp ヘッダー) を適用すると、何も起こりません。これは OpenMP では不可能かもしれませんが、MPI では可能で、どのように見えるでしょうか? これまでのところ、OpenMP の経験はありますが、MPI の経験はありません。更新: 並列領域内で定義された cmd

ステータス: 解決済み

2 番目の質問:

OpenMP 並列化プログラムがあり、それをクラスター内の異なるノード間で使用したい場合、MPI を使用して異なるノード間で呼び出しを分散するにはどうすればよいですか? また、どのようにコンパイルしますか?

//a[i] and b[i] are defined as elements of a list with 2 columns and N rows
//i is the row number

  for(i=0; i<N; i++) {
    //call the parallelized program
    sprintf(cmd, "./openmp_parallelized_program %f %f", a[i], b[i]);
    system(cmd);
  }

状態:未解決

4

2 に答える 2

0

MPI を使用すると、次のようになります。

int rank, size;

MPI_Init();
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

int start = (rank*N)/size;
int end = ((rank+1)*N)/size;

for (i = start; i < end; i++)
{
   sprintf(cmd, "./openmp_parallelized_program %f %f", a[i], b[i]);
   system(cmd);
}

MPI_Finalize();

次に、ノードごとに 1 つのプロセスで MPI ジョブを実行します。ただし、注意点があります。一部の MPI 実装では、InfiniBand などの RDMA ベースのネットワークを介して通信する場合fork()など、特定の条件下でのプロセスの呼び出し (およびsystem()呼び出し)を許可しません。fork()代わりに、両方のプログラムをマージして、1 つのハイブリッド MPI/OpenMP プログラムを作成することができます。

于 2013-01-27T14:29:24.557 に答える
0

MPI は、コンピューティング クラスタのノード間で通信する方法です。これにより、1 つのマザーボードが別のマザーボードと通信できるようになります。MPI はクラスターや大規模なコンピューティング タスク用であり、デスクトップ アプリケーションの並列化用ではありません。

MPI での通信は、明示的にデータを送受信することによって行われます。

OpenMP とは異なり、自動的に並列化を容易にする #pragma はありません。

また、あなたが投稿したコードについては、本当に混乱しているものがあります。具体的には、bash スクリプトのように動作する C プログラムです。

#!/bin/bash
N=10
for i in `seq 1 $N`;
do
./program $i &
done

多くのクラスタでは、 への呼び出しsystemはホスト ノードでのみ実行されるため、高速化や io の問題は発生しません。あなたが示したコマンドはまったく機能しません。

于 2013-01-27T13:58:13.390 に答える