我在計算機編程課上只學習了大約一天的MPI,現在我必須爲它編寫一個程序。我將編寫一個將過程組織爲兩個環的程序。MPI雙環,最大值,最小值和平均值
第一環開始於過程0,並且進行到將消息發送到下一個偶數處理和最後一個過程發送其消息發送回處理0。例如,0 - > 2 - > 4 - > 6 - > 8 - > 0(但它一直到32而不是8)。下一個環是相同的,但是從過程1開始併發送到先前的關閉過程,然後返回到1.例如,1→9→7→5→3→1。
此外,我應該找到一個非常大的整數數組的最大值,最小值和平均值。我將不得不將數組分散到每個進程中,讓每個進程計算出部分答案,然後在每個進程完成後減少進程0中的答案。
最後,我在整個過程中散開,每個進程將不得不計算多少每個字母的一個部分出現。那部分對我來說真的沒有意義。但我們剛剛學會了非常基礎的東西,所以沒有花哨的東西請!這是我迄今爲止的,我已經評論了一些事情,只是提醒自己一些東西,所以如果有必要,請忽略。
#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.我得到0到1到2 ....這是非常令人沮喪的,因爲我很難閱讀該程序。 –