如何在 C MPI 中发送指向数组的指针数组

Posted

技术标签:

【中文标题】如何在 C MPI 中发送指向数组的指针数组【英文标题】:How to send an array of pointers to arrays in C MPI 【发布时间】:2020-07-18 03:02:54 【问题描述】:

假设我正在使用 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] |
___________________

因此,每个单元格都保存对使用malloc() 创建的大小为 2 的整数数组的引用,而不是整数。我怎样才能将这个新矩阵的行发送到子进程?

我正在考虑定义我自己的 MPI 数据类型,这可能是一个起点。

【问题讨论】:

您最好的选择是更改您分配二维数组的方式,并将它们分配到连续内存中。如果这不是一个选项,那么您可以定义自己的数据类型。 是的,我就是这么想的 【参考方案1】:

请试试这段代码,在 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; 
 

我希望这段代码有用。 谢谢。

【讨论】:

本意恐怕是一次性发送一个锯齿状数组。

以上是关于如何在 C MPI 中发送指向数组的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将指向c数组的指针转换为python数组

C语言中怎样区分一维指针和二维指针?

在 MPI 中发送和接收数组

C语言中二维数组行指针是啥

C语言 指向二维数组的指针

C语言,指针问题