首页 > 解决方案 > MPI 广播和减少

问题描述

我在下面有这段代码..当我运行它时,mpiexec -n 2 我在控制台日志中得到输出,就像The input sequence is as follows: 0 1 2 3 我试图获得一个输出序列,0 2 6 12 该序列是PartialResult在forloop中添加的 这是forloop的结果,我得到了这个对于每个进程,所以当我使用 2 个进程运行时,它会被打印两次。

Partial result in forloop: 0 
Partial result in forloop: 1 
Partial result in forloop: 3 
Partial result in forloop: 6 

我想添加它们,以便输出序列(当 rank == 0 时)返回0 2 6 12. 这可以在 MPI_Reduce 步骤之后实现吗?

下面是整个 C 代码。

int main(void)

{
    int my_rank, comm_sz;
    int i;
    int Count = 4;
    int Number[4];
    int PartialResult = 0;
    int Result;

    MPI_Init(NULL, NULL);

    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);


    if(my_rank == 0)
    {
        printf("The input sequence is as follows: \n");

        for (i = 0; i < Count; i++)
        {
            Number[i] = i;
            printf("%d ", Number[i]);
        }

        printf("\n");
    }

    // Process 0 sends data to all of the processes
    MPI_Bcast(Number, Count, MPI_INT, 0, MPI_COMM_WORLD);

    for (i = 0; i < Count; i++)
    {
        Number[i] += my_rank;
        PartialResult += Number[i];
        printf("\n");
        printf("Partial result in forloop: %d \n", PartialResult);

    }
    MPI_Reduce(&PartialResult, &Result, 1, MPI_INT, MPI_PROD, 0, MPI_COMM_WORLD);
    printf("partial result after reduce: %d \n", PartialResult);    

    // Print out the result 
    if (my_rank == 0) {
        printf("\n");
        for (i = 0; i < Count; i++) {
            printf("\n");
            printf("\n");
            printf("Result[i]: %d \n", Result[i]);

        } 
    }

    MPI_Finalize();

    return 0;
}

标签: cmultiprocessingmpi

解决方案


推荐阅读