私はコンピュータプログラミングのクラスで約1日間MPIで作業していましたが、今はプログラムを書く必要があります。私はプロセスを2つの環にまとめるプログラムを書くことになっています。MPIのダブルリング、最大、最小、平均
最初の呼び出しはプロセス0から始まり、次の偶数プロセスにメッセージを送信し、最後のプロセスはそのメッセージをプロセス0に戻します。たとえば、0→2→4→6 - > 8 - > 0(ただし、8の代わりに32までになります)。次のリングは同じですが、プロセス1で始まり、前のオフプロセスに送信してから1に戻ります。たとえば、1 - > 9 - > 7 - > 5 - > 3 - > 1です。
また、非常に大きな整数値の配列の最大値、最小値、平均値を見つけるはずです。私は配列を各プロセスに分割し、各プロセスが部分的な答えを計算させ、そして誰もが完了した後にプロセス0で答えを減らす必要があります。
最後に、私はプロセスに散在しており、各プロセスは各レターがセクションにどれだけ出現するかを数えなければなりません。その部分は本当に私には意味をなさない。しかし、私たちはちょうど非常に基本的なことを学んだので、すごいものはありません!これまで私がこれまで持っていたことは、いくつかのことを思い出させるためにいくつかコメントしましたので、必要ならば無視してください。 として両方は、メッセージの送信先です(混乱されようとしている、
dest = rank + 2;
if (rank == size - 1)
dest = 0;
source = rank - 2;
if (rank == 0)
source = size - 1;
私は
dest
考える
とsource
、名など:
#include <iostream>
#include "mpi.h"
using namespace std;
// compile: mpicxx program.cpp
// run: mpirun -np 4 ./a.out
int main(int argc, char *argv[])
{
int rank; // unique number associated with each core
int size; // total number of cores
char message[80];
char recvd[80];
int prev_node, next_node;
int tag;
MPI_Status status;
// start MPI interface
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
sprintf(message, "Heeeelp! from %d", rank);
MPI_Barrier(MPI_COMM_WORLD);
next_node = (rank + 2) % size;
prev_node = (size + rank - 2) % size;
tag = 0;
if (rank % 2) {
MPI_Send(&message, 80, MPI_CHAR, prev_node, tag, MPI_COMM_WORLD);
MPI_Recv(&recvd, 80, MPI_CHAR, next_node, tag, MPI_COMM_WORLD, &status);
} else {
MPI_Send(&message, 80, MPI_CHAR, next_node, tag, MPI_COMM_WORLD);
MPI_Recv(&recvd, 80, MPI_CHAR, prev_node, tag, MPI_COMM_WORLD, &status);
}
cout << "* Rank " << rank << ": " << recvd << endl;
//max
int large_array[100];
rank == 0;
int max = 0;
MPI_Scatter(&large_array, 1, MPI_INT, large_array, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Reduce(&message, max, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
あなたは何かに固執していますか? – sarnold
私はちょうど正直にそれを本当に理解していない。以下の答えは大いに役立ちましたが、私はまだそれを0から2に戻さないようにしています。0に戻ってください.1から2まで0を得ます。プログラムを読んでください。 –