Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <mpi.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main(int argc, char** argv)
- {
- int rank, value, n, ownvalue;
- int start, end;
- MPI_Status status;
- MPI_Init( &argc, &argv );
- MPI_Comm_rank( MPI_COMM_WORLD, &rank );
- MPI_Comm_size( MPI_COMM_WORLD, &n );
- start = 3; end = 0; value = 0; ownvalue = 0;//переменная для хранения различных собственных значений, а не буфер для передачи значений другим потокам :)
- int c = 0;
- for(int i = 1; i <= n - 1; i++)
- {
- if(start + i <= n - 1){
- end = start + i;
- }else{
- end = c;
- c++;
- }
- if(start >= 0 && end > start && end < n){// Не надо перескакивать через ноль
- if (rank == start){
- value = 1;
- MPI_Send(&value,1,MPI_INT,rank+1,0,MPI_COMM_WORLD );
- }
- else if(rank > start && rank <= end) //5 6 7
- {
- MPI_Recv(&value,1,MPI_INT,rank-1,0,MPI_COMM_WORLD,&status);
- if(rank == end){
- ownvalue = value;
- }
- value++;
- if (rank <= end - 1){ //6
- //value++;
- MPI_Send(&value,1,MPI_INT,rank+1,0,MPI_COMM_WORLD );
- }
- }
- if(rank == end)
- {
- cout<< "Process "<< rank <<" got ~"<< ownvalue << endl;
- }
- }
- else if(start >= 0 && end < n && start < n && end >= 0)//Когда надо перепрыгнуть через ноль
- {
- if(rank == start && start != n - 1){//Если start == n - 1 ?
- value = 1;
- MPI_Send(&value,1,MPI_INT,rank + 1,0,MPI_COMM_WORLD );
- }else if(rank == start && start == n -1){
- value = 1;
- MPI_Send(&value,1,MPI_INT,0,0,MPI_COMM_WORLD );
- }else
- {
- if(rank == 0){
- MPI_Recv(&value,1,MPI_INT,n - 1,0,MPI_COMM_WORLD,&status);
- if(end == 0){
- ownvalue = value;
- }
- else{
- value++;
- MPI_Send(&value,1,MPI_INT,rank + 1,0,MPI_COMM_WORLD );
- }
- }
- else if(rank == n - 1){
- MPI_Recv(&value,1,MPI_INT,rank - 1,0,MPI_COMM_WORLD,&status);
- value++;
- MPI_Send(&value,1,MPI_INT,0,0,MPI_COMM_WORLD );
- }
- else if(rank == end){// Под это условие попадает ранг старта и ранг перед ним
- MPI_Recv(&value,1,MPI_INT,rank - 1,0,MPI_COMM_WORLD,&status);
- ownvalue = value;
- }
- else if( !(rank < start && rank > end) ){// Ранги межу старт и конец не начто не ссылаются и не принимают ничего
- MPI_Recv(&value,1,MPI_INT,rank - 1,0,MPI_COMM_WORLD,&status);
- value++;
- MPI_Send(&value,1,MPI_INT,rank + 1,0,MPI_COMM_WORLD );
- }
- }
- if(rank == end){
- cout<< "Process "<< rank<<" got "<< ownvalue << endl;
- }
- }
- //MPI_Finalize( ); // Без MPI_Finalize( ); Иногда не корректно заканчивается вывод в терминале
- }
- MPI_Finalize( ); // Без MPI_Finalize( ); Иногда не корректно заканчивается вывод в терминале
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement