MPI分发阵列

时间:2013-06-13 08:27:29

标签: c++ mpi

我正在尝试用MPI结构编写一个C ++程序。我想从一个巨大的文件中读取并将数字存储到一个数组中。我希望数组是本地的,即我不希望所有的线程都拥有整个数组,因为数组非常笨重。每个线程进行本地计算并“发送”和“接收”以进行进一步的计算。做这个的最好方式是什么?我在网上看到的所有代码都使用rand()函数生成本地数组,但我想从文件中读取值。

这可能是我想要的:

int main() 
{
    // Read from a file
    // store in array a[] temporarily
    //MPI_init();
    //My thread should have an array b[] that is a subset of a[]
    //MY code to do a numerical simulation
    //MPI_finalise();
    return 0;
}

PS:我的数据结构比数组更复杂。我存储了一个巨大的图表。它更像是一个链表或矢量数组。

1 个答案:

答案 0 :(得分:1)

MPI是进程而非线程之间的消息传递系统。当进程在不同的机器上运行时,这是一个真正的区别。

如果您想要执行的操作完全独立于图形的每个部分,我会进行并行读取。其他原因如果你想要一个读取并传播一个数组,你会有类似的东西:

int main(int argc, char * argv[]) 
{
    MPI_init(&argc, &argv);
    int prank; MPI_Comm_rank(MPI_COMM_WORLD, &prank);
    int psize; MPI_Comm_size(MPI_COMM_WORLD, &psize);
    if(prank == 0) {
       // Read from a file
       // store in array a[] temporarily

       MPI_Scatter(a, length(a)/psize, MPI_DATATYPE_OF_A, b, leanght(a)/psize, MPI_DATATYPE_OF_A, 0, MPI_COMM_WORLD);
       // this works only if length(a) is a multiple of psize, otherwhy you should go for MPI_Scatterv
    } else {
       MPI_Scatter(NULL, 0, MPI_DATATYPE_OF_A, b, leanght(a)/psize, MPI_DATATYPE_OF_A, 0, MPI_COMM_WORLD);
    }
    //My thread should have an array b[] that is a subset of a[]
    //MY code to do a numerical simulation

    MPI_finalise();
    return 0;
}

但是如果你有数组,那就是这个想法,如果你有一个图形,你应该看一下图形分区器来分割你的图形并将这些部分发送到不同的过程。我认为Trilinos会为你做一切。其他为什么你可以使用Scotch或Metis为你的图形着色,然后使用MPI将每种颜色发送到处理器。