簡體   English   中英

C語言,使用MPI Reduce函數,讓進程0找到所有進程的等級總和

[英]C Language, using MPI Reduce function, let process 0 find the sum of the ranks of all the processes

我編寫此代碼來嘗試使用C MPI查找等級的總和,這在下面給了我這個錯誤。

我似乎找不到問題所在,任何人都不知道我做錯了什么?

我能夠將整數X從進程0傳遞到1並進行廣播,但是對於MPI_Sum,它表示我有分段錯誤(11)並給了我錯誤。

我應該如何解決這個問題?

[gauss:31436] *** Process received signal ***

[gauss:31436] Signal: Segmentation fault (11)

[gauss:31436] Signal code: Invalid permissions (2)

[gauss:31436] Failing at address: 0x400960

[gauss:31436] [ 0] /lib64/libpthread.so.0(+0xf370)[0x2aaaaafae370]

[gauss:31436] [ 1] /cm/shared/apps/openmpi/gcc/64/1.10.3/lib64/openmpi/mca_pml_ob1.so(mca_pml_ob1_recv+0xc9)[0x2aaab0e38349]

[gauss:31436] [ 2] /cm/shared/apps/openmpi/gcc/64/1.10.3/lib64/libmpi.so.12(MPI_Recv+0x13c)[0x2aaaaad337bc]

[gauss:31436] [ 3] lab2[0x400b21]

[gauss:31436] [ 4] /lib64/libc.so.6(__libc_start_main+0xf5)[0x2aaaab1dcb35]

[gauss:31436] [ 5] lab2[0x400989]

[gauss:31436] *** End of error message ***



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

int main(int argc, char* argv[])
{
    int my_rank;
    int msgtag = 0;
    int x;
    int my_rank_n = 0;
    int sum_rank;
    int p;
    MPI_Status *status;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &p);
    for (int i = 0; i < p; i++)
    {
            if (my_rank == 0)
            {
                    x = 10;
                    MPI_Send(&x, 1, MPI_INT, 1, msgtag, MPI_COMM_WORLD);
            }
            else if (my_rank == 1)
            {
                    MPI_Recv(&x, 1, MPI_INT, 0, msgtag, MPI_COMM_WORLD, status);
            }

            MPI_Bcast(&x, 1, MPI_INT, msgtag, MPI_COMM_WORLD);
    }

    if(my_rank == 2)
    {
            printf("X is %d\n",x);
    }



     for (int i = 0; i < p; i++)
    {
            my_rank_n = my_rank;
            MPI_Reduce(&my_rank_n, &sum_rank, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
    }

    if(my_rank == 0)
    {
            printf("Sum of Rank is %d\n", sum_rank);
    }

MPI_Finalize();
return 0;
}

錯誤在MPI_Recv() ,您沒有正確使用status參數。

它應該是

MPI_Status status;
MPI_Recv(..., &status);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM