在MPI中拆分和传递数组块

时间:2015-09-02 12:54:07

标签: c++ c arrays parallel-processing mpi

我是MPI的新手,并试图通过编写一个简单的C程序来理解这种感觉。我想做的就是分割数组并将块发送到N个处理器。因此,每个处理器将在其块中找到本地分钟。然后程序(在root或其他地方)找到全局min。

我研究了MPI_SendMPI_IsendMPI_Bcast函数,但对于在哪里使用一个而不是另一个函数有点困惑。我需要一些关于程序一般结构的提示:

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

#define N 9 // array size

int A[N] = {0,2,1,5,4,3,7,6,8}; // this is a dummy array

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

    int i, k = 0, size, rank, source = 0, dest = 1, count;
    int tag = 1234;

    MPI_Init(&argc, &argv);

    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    count = N/(size-1); // think size = 4 for this example

    int *tempArray = malloc(count * sizeof(int)); 
    int *localMins = malloc((size-1) * sizeof(int)); 

    if (rank == 0) {

        for(i=0; i<size; i+=count) 
        {
            // Is it better to use MPI_Isend or MPI_Bcast here?
            MPI_Send(&A[i], count, MPI_INT, dest, tag, MPI_COMM_WORLD);
            printf("P0 sent a %d elements to P%d.\n", count, dest);
            dest++;
        }
    }
    else {

        for(i=0; i<size; i+=count) 
        {       
            MPI_Recv(tempArray, count, MPI_INT, 0, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            localMins[k] = findMin(tempArray, count);
            printf("Min for P%d is %d.\n", rank, localMins[k]);
            k++;            
        }
    }

    MPI_Finalize();

    int gMin = findMin(localMins, (size-1)); // where should I assign this
    printf("Global min: %d\n", gMin); // and where should I print the results?

    return 0;
}

我的代码可能存在多个错误,很遗憾无法在此处指定确切的问题。谢谢你的任何建议。

1 个答案:

答案 0 :(得分:3)

您拥有的代码有几个问题(正如您已经指出的那样),并且正如一些评论者已经提到的那样,有其他方法可以执行您尝试使用MPI调用执行的操作。

但是,我会重新调整您的代码并尝试不要进行太多更改,以便向您展示正在进行的操作。

MPI_Recv

完全披露:我没有测试过这段代码,但除了小错字之外,还应该有效。

查看此代码,看看您是否能理解为什么我移动了elsefor来电。要理解这一点,请注意每个等级都在读取您提供给它的每一行代码。因此,在MPI_Reduce语句中,不应该有MPI_Bcast次接收。

此外,MPI集体(例如Arank == ROOT)必须由通信器中的每个等级调用。 &#34;来源&#34;和&#34;目的地&#34;这些调用的排名是函数输入参数的一部分,或者由集合本身隐含。

最后,为您做一些功课:你能明白为什么这不是一个很好的实现,找到数组MPI_Send的全局最小值?提示:{{1}}在完成{{1}}之后做了什么?你如何更好地分解这个问题,以便每个级别的工作更均匀?