Задание сложить два вектора без коллективных операций. Делаю вот так, но что-то теряю, при запуске длины вектора 10 и при 2 процессах считается только 5 элементов. Помогите пожалуйста, может я неправильно работаю с MPI_Send/Recv #include "stdafx.h" #include <cstdlib> #include <iostream> #include <mpi.h> #include <ctime> #define ARRAY_SIZE 20 using namespace std; int main(int argc, char* argv[]) { double time_start=0, time_end, TIME; int size=0, rank=0; int *vec1, *vec2,*vec3; const double size1 = ARRAY_SIZE; MPI_Status status; /* Инициализируем библиотеку */ MPI_Init(&argc, &argv); /* Узнаем количество задач в запущенном приложении */ MPI_Comm_size(MPI_COMM_WORLD, &size); /* ... и свой собственный номер: от 0 до (size -1) */ MPI_Comm_rank(MPI_COMM_WORLD, &rank); //mid - среднее число элементов, которые будет сосздавать массив //size - целая часть //ost - дробная часть double mid = size1 / size;//кол-во элементов на кол-во процессов double size_for_procces = 0; //целая часть уходит в size_for_procces float ost = modf(mid, &size_for_procces); int dop = 0; //-------------------// //заполнение векторов if (rank) { vec1 = new int[(int)size_for_procces]; vec2 = new int[(int)size_for_procces]; for (int i = 0; i < size_for_procces; i++) { vec1 = rand() % 10 + 1; vec2 = rand() % 10 + 1; } } else { if (ost > 0) //генерация недостающих элементов "главным процессом" dop = round(ost*size); vec1 = new int[(int)size_for_procces + dop]; vec2 = new int[(int)size_for_procces + dop]; for (int i = 0; i < size_for_procces + dop; i++) { vec1 = rand() % 10 + 1; vec2 = rand() % 10 + 1; // cout << vec1<< ' '<<' '; } for (int i = 0; i < size_for_procces + dop; i++) { cout << vec1 << ' ' << ' '; } cout << endl; for (int i = 0; i < size_for_procces + dop; i++) { cout << vec2 << ' '<<' '; } } //-------------------// //измерение времени if (rank == 0) time_start = MPI_Wtime(); //-------------------// //поиск суммы векторов vec3= new int[(int)size_for_procces + dop]; if (rank == 0) { for (int i = 0; i < size_for_procces + dop; i++) vec3 = vec1 + vec2; } else { for (int i = 0; i < size_for_procces; i++) vec3 = vec1 + vec2; // for (int i = 0; i < size_for_procces; i++) //MPI_Send(&vec3, size_for_procces-1, MPI_INT, 0, 2, MPI_COMM_WORLD); MPI_Send (&vec3[0], 1, MPI_INT, 0, 2, MPI_COMM_WORLD } //-------------------// cout << endl if (rank = = 0 { int *n_vec = new int[Размер n_vec[0] = vec3[0 / * int *arr arr = new int[size1 for (int i = 1; i < size1; i++ MPI_Recv (arr, size1, MPI_INT, i, 2, MPI_COMM_WORLD, &status for (int i = 1; i < size; i++ MPI_Recv (&vec3, size, MPI_INT, i, 2, MPI_COMM_WORLD, & status for (int i = 1; i < size; i++ { n_vec = vec1 + vec2[i vec3 = n_vec[i // out < < vec3 <<'' } time_end = MPI_Wtime TIME = (time_end-time_start for (int i = 0; i < size_for_procces; i++ cout < < vec3 <<'<<''' cout < < "\ N время: "< < время * 1000 < < "миллисекунд" < < endl std:: cout << "процессы:" < < Размер << '\n' // delete [] n_vec удалить[] n_vec } удалить [] vec1 удалить [] vec2 удалить [] vec3 MPI_Finalize возврат 0 }