Перессылка массива MPI. Помогите решить проблему!

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Skeyna, 23 Oct 2018.

  1. Skeyna

    Skeyna New Member

    Joined:
    23 Oct 2018
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Задание сложить два вектора без коллективных операций.

    Делаю вот так, но что-то теряю, при запуске длины вектора 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
    }