параллельный битони c сортировка mpi - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь выполнить параллельную сортировку bitoni c с использованием mpi и C, но я получил взаимоблокировку или любое другое состояние блока при отправке массива recv в comp_exchange_max или в функции comp_exchange_min. вы можете помочь мне решить эту проблему? спасибо

void comp_exchange_max(int j, int rank, int *local_numbers, int dim_array, int *ordered_array)
{
    int message_receive[dim_array];
    int i, k, q;
    if (rank > 0)
    {
        MPI_Recv(&message_receive, dim_array, MPI_INT, rank ^ (1 << j), 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        MPI_Send(local_numbers, dim_array, MPI_INT, rank ^ (1 << j), 0, MPI_COMM_WORLD);
    }
    /* comparison */
    k = dim_array - 1;
    q = dim_array - 1;
    for (i = dim_array - 1; i >= 0; --i)
    {
        if (local_numbers[k] > message_receive[q])
        {
            ordered_array[i] = local_numbers[k];
            --k;
        }
        else
        {
            ordered_array[i] = message_receive[q];
            --q;
        }
    }
}

void comp_exchange_min(int j, int rank, int *local_numbers, int dim_array, int *ordered_array)
{
    int message_receive[dim_array];
    int i, k, q;
    if (rank > 0)
    {
        MPI_Send(local_numbers, dim_array, MPI_INT, rank ^ (1 << j), 0, MPI_COMM_WORLD);

        MPI_Recv(&message_receive, dim_array, MPI_INT, rank ^ (1 << j), 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }
    /* comparison */
    k = 0;
    q = 0;
    for (i = 0; i < dim_array; ++i)
    {
        if (local_numbers[k] < message_receive[q])
        {
            ordered_array[i] = local_numbers[k];
            ++k;
        }
        else
        {
            ordered_array[i] = message_receive[q];
            ++q;
        }
    }
}

весь код здесь https://pastebin.com/DrR5SGxv

...