Как отправить массив указателей на массивы в C MPI - PullRequest
0 голосов
/ 06 апреля 2020

Допустим, я использую MPI и хочу, чтобы я мог посылать ряд строк матрицы целых чисел из основного процесса в другие процессы. Это относительно легко сделать, например, так:

MPI_Send(&matrix[start_row][0], amount_of_cells, MPI_INT, target_process, 1, MPI_COMM_WORLD);

Теперь предположим, что в нашей матрице вместо каждой ячейки, содержащей целое число, каждая ячейка содержит ссылку на целочисленный массив размера 2 . Как мы можем отправить несколько строк новой матрицы в подпроцессы?

Я думал о том же, что и код выше, но удваивая переменную amount_of_cells, потому что каждая ячейка содержит ссылку на целочисленный массив размера 2. Однако, похоже, это не работает, я немного растерялся.

Были бы полезны какие-либо советы или рекомендации по этому вопросу?

Старая матрица:

_________
| 1 | 2 |
--------
| 3 | 4 |
_________

Новая матрица:

___________________

| [1, 0] | [2, 0] |
--------------------
| [3, 0] | [4, 0] |
___________________

Итак вместо целых чисел каждая ячейка содержит ссылку на массив целых чисел размера 2, созданный с помощью malloc(). Как я могу отправить строки этой новой матрицы в подпроцессы?

Я собирался определить свой собственный тип данных MPI, с которого можно начинать.

1 Ответ

0 голосов
/ 06 апреля 2020

Пожалуйста, попробуйте этот код, чтобы отправить массив указателей на массивы в C MPI

#include <mpi.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define n 10 

int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

int a2[1000]; 

int main(int argc, char* argv[]) 
{ 

    int pid, np, 
        elements_per_process, 
        n_elements_recieved; 

    MPI_Status status; 

    MPI_Init(&argc, &argv); 

    MPI_Comm_rank(MPI_COMM_WORLD, &pid); 
    MPI_Comm_size(MPI_COMM_WORLD, &np); 

    if (pid == 0) { 
        int index, i; 
        elements_per_process = n / np; 

        if (np > 1) { 
            for (i = 1; i < np - 1; i++) { 
                index = i * elements_per_process; 

                MPI_Send(&elements_per_process, 
                        1, MPI_INT, i, 0, 
                        MPI_COMM_WORLD); 
                MPI_Send(&a[index], 
                        elements_per_process, 
                        MPI_INT, i, 0, 
                        MPI_COMM_WORLD); 
            } 

            index = i * elements_per_process; 
            int elements_left = n - index; 

            MPI_Send(&elements_left, 
                    1, MPI_INT, 
                    i, 0, 
                    MPI_COMM_WORLD); 
            MPI_Send(&a[index], 
                    elements_left, 
                    MPI_INT, i, 0, 
                    MPI_COMM_WORLD); 
        } 

        int sum = 0; 
        for (i = 0; i < elements_per_process; i++) 
            sum += a[i]; 

        int tmp; 
        for (i = 1; i < np; i++) { 
            MPI_Recv(&tmp, 1, MPI_INT, 
                    MPI_ANY_SOURCE, 0, 
                    MPI_COMM_WORLD, 
                    &status); 
            int sender = status.MPI_SOURCE; 

            sum += tmp; 
        } 

    printf("Sum of array is : %d\n", sum); 
    } 
    else { 
        MPI_Recv(&n_elements_recieved, 
                1, MPI_INT, 0, 0, 
                MPI_COMM_WORLD, 
                &status); 

        MPI_Recv(&a2, n_elements_recieved, 
                MPI_INT, 0, 0, 
                MPI_COMM_WORLD, 
                &status); 

        int partial_sum = 0; 
        for (int i = 0; i < n_elements_recieved; i++) 
            partial_sum += a2[i]; 

        MPI_Send(&partial_sum, 1, MPI_INT, 
                0, 0, MPI_COMM_WORLD); 
    } 

    MPI_Finalize(); 

    return 0; 
} 

Я надеюсь, что этот код будет полезным. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...