只想做个有钱的富婆花迪 2023-06-11 19:45 采纳率: 69.2%
浏览 31
已结题

c语言的mpi并行程序出现错误

c语言MPI并行程序出现错误:

[cb81ea2c449b:09101] *** Process received signal ***
[cb81ea2c449b:09101] Signal: Segmentation fault (11)
[cb81ea2c449b:09101] Signal code:  (128)
[cb81ea2c449b:09101] Failing at address: (nil)
[cb81ea2c449b:09104] *** Process received signal ***
[cb81ea2c449b:09104] Signal: Segmentation fault (11)
[cb81ea2c449b:09104] Signal code:  (128)
[cb81ea2c449b:09104] Failing at address: (nil)
[cb81ea2c449b:09104] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x110c0)[0x7fe2b8dba0c0]
[cb81ea2c449b:09104] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x120e6c)[0x7fe2b8b2ae6c]
[cb81ea2c449b:09104] [ 2] [cb81ea2c449b:09101] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x110c0)[0x7f5d5708e0c0]
[cb81ea2c449b:09101] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x120e6c)[0x7f5d56dfee6c]
[cb81ea2c449b:09101] [ 2] /usr/local/lib/libopen-pal.so.40(opal_unsetenv+0x6c)[0x7f5d56781ccc]
[cb81ea2c449b:09101] [ 3] /usr/local/lib/openmpi/mca_schizo_orte.so(+0xab8)[0x7f5d551e7ab8]
[cb81ea2c449b:09101] [ 4] /usr/local/lib/libopen-rte.so.40(orte_schizo_base_finalize+0x2f)[0x7f5d56aa7b5f]
[cb81ea2c449b:09101] [ 5] /usr/local/lib/libopen-rte.so.40(orte_finalize+0x95)[0x7f5d56a3dc85]
[cb81ea2c449b:09101] [ 6] /usr/local/lib/libmpi.so.40(ompi_mpi_finalize+0x872)[0x7f5d572e5562]
[cb81ea2c449b:09101] [ 7] /usr/local/lib/libopen-pal.so.40(opal_unsetenv+0x6c)[0x7fe2b84adccc]
[cb81ea2c449b:09104] [ 3] /usr/local/lib/openmpi/mca_schizo_orte.so(+0xab8)[0x7fe2b6f13ab8]
[cb81ea2c449b:09104] [ 4] /usr/local/lib/libopen-rte.so.40(orte_schizo_base_finalize+0x2f)[0x7fe2b87d3b5f]
[cb81ea2c449b:09104] [ 5] /usr/local/lib/libopen-rte.so.40(orte_finalize+0x95)[0x7fe2b8769c85]
[cb81ea2c449b:09104] [ 6] /usr/local/lib/libmpi.so.40(ompi_mpi_finalize+0x872)[0x7fe2b9011562]
[cb81ea2c449b:09104] [ 7] --------------------------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------
--------------------------------------------------------------------------
mpirun noticed that process rank 2 with PID 0 on node cb81ea2c449b exited on signal 11 (Segmentation fault).

mpi c语言代码如下:


#include "mpi.h"
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int size,rank,m,n,*recvcounts,*disp,i,j=0,index=0,sum=0;
    MPI_Comm mm=MPI_COMM_WORLD;//记得名字不要重名啊 
    double *vector,*matrix,*la;
    MPI_Init(NULL,NULL);
    MPI_Comm_size(mm,&size);
    MPI_Comm_rank(mm,&rank);
    if(rank==0)
    {
        printf("enter m and n:\n");
        scanf("%d %d",&m,&n);
        vector=(double*)malloc(sizeof(double)*n);
        matrix=(double*)malloc(sizeof(double)*m*n);
        printf("enter vector(%d):\n",n);
        for(i=0;i<n;i++)
            scanf("%lf",&vector[i]);//记得要加&符号 
        printf("enter matrix:\n");
        for(i=0;i<m*n;i++)
            scanf("%lf",&matrix[i]);
    }
    MPI_Bcast(&m,1,MPI_INT,0,mm);
    MPI_Bcast(&n,1,MPI_INT,0,mm);
    MPI_Bcast(vector,n,MPI_DOUBLE,0,mm);
    recvcounts=(int*)malloc(sizeof(int)*size);
    disp=(int*)malloc(sizeof(int)*size);
    for(i=0;i<size;i++)
    {
        recvcounts[i]=(m*n)/size;
        if(i<(m*n)%size)
            recvcounts[i]++;
        disp[i]=(i>0?recvcounts[i-1]+disp[i-1]:0);
    }
    la=(double*)malloc(sizeof(double)*recvcounts[rank]);
    MPI_Scatterv(matrix,recvcounts,disp,MPI_DOUBLE,la,recvcounts[rank],MPI_DOUBLE,0,mm);
    index=disp[rank];
    for(i=0;i<recvcounts[rank];i++)
    {
        la[i]*=vector[(index+i)%n];
    }
    MPI_Gatherv(la,recvcounts[rank],MPI_DOUBLE,matrix,recvcounts,disp,MPI_DOUBLE,0,mm);
    if(rank==0) //要加 
    {
        for(i=0;i<m*n;i++)
        {
            printf("%lf ",matrix[i]);
            if(i%n==n-1) printf("\n");
        }
    }
    
    MPI_Finalize();
}

为什么编译运行这个矩阵乘以向量的程序会出现

img

img


的错误,该怎么解决,原来的题目是:
用MPI设计实现矩阵-向量乘法。进程0读取矩阵和向量,并将任务分配到各个进程,最后进程0打印出计算结果。在你的主目录下,保存的文件名为matvect.c。

  • 写回答

1条回答 默认 最新

  • 川上川下山 2023-06-11 20:28
    关注
    
    
    ```c
    #include <stdio.h>
    #include <stdlib.h>
    #include <mpi.h>
    
    #define N 4
    
    int main(int argc, char *argv[]) {
        int rank, size;
        int i, j;
        int mat[N][N], vec[N], result[N], recvbuf[N];
        MPI_Status status;
    
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);
    
        if (rank == 0) {
            // 进程0读取矩阵和向量
            printf("Enter the matrix:\n");
            for (i = 0; i < N; i++) {
                for (j = 0; j < N; j++) {
                    scanf("%d", &mat[i][j]);
                }
            }
    
            printf("Enter the vector:\n");
            for (i = 0; i < N; i++) {
                scanf("%d", &vec[i]);
            }
    
            // 将任务分配到各个进程
            for (i = 1; i < size; i++) {
                MPI_Send(mat[i-1], N, MPI_INT, i, 0, MPI_COMM_WORLD);
            }
            MPI_Bcast(vec, N, MPI_INT, 0, MPI_COMM_WORLD);
    
            // 进程0计算自己的部分
            for (i = 0; i < N; i++) {
                result[i] = 0;
                for (j = 0; j < N; j++) {
                    result[i] += mat[0][j] * vec[j];
                }
            }
    
            // 接收其他进程的计算结果
            for (i = 1; i < size; i++) {
                MPI_Recv(recvbuf, N, MPI_INT, i, 0, MPI_COMM_WORLD, &status);
                for (j = 0; j < N; j++) {
                    result[j] += recvbuf[j];
                }
            }
    
            // 打印计算结果
            printf("Result:\n");
            for (i = 0; i < N; i++) {
                printf("%d ", result[i]);
            }
            printf("\n");
        } else {
            // 接收任务
            MPI_Recv(mat, N*N, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
            MPI_Bcast(vec, N, MPI_INT, 0, MPI_COMM_WORLD);
    
            // 计算自己的部分
            for (i = 0; i < N; i++) {
                recvbuf[i] = 0;
                for (j = 0; j < N; j++) {
                    recvbuf[i] += mat[i][j] * vec[j];
                }
            }
    
            // 发送计算结果
            MPI_Send(recvbuf, N, MPI_INT, 0, 0, MPI_COMM_WORLD);
        }
    
        MPI_Finalize();
        return 0;
    }
    
    

    ```

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月16日
  • 创建了问题 6月11日