简体   繁体   English

使用 mpi 的矩阵乘法中的分段错误

[英]Segmentation fault in matrix multiplication using mpi

I am trying to write an mpi program for multiplication of 2 matrix.我正在尝试编写一个用于 2 矩阵乘法的 mpi 程序。 If I give the size of the matrix lower that 800 the code works but when I give it higher I am getting segmentation fault and I am not able to figure out why.如果我将矩阵的大小设置为低于 800,则代码可以正常工作,但是当我将其设置得更高时,我会遇到分段错误,而且我无法弄清楚原因。 I am new to MPI so still trying to understand everything.我是 MPI 的新手,所以仍在尝试了解所有内容。 If possible please help.如果可能请帮助。

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

#define N 1000

int main(int argc, char* argv[]) {
    int rank, size;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    double a[N][N], b[N][N], c[N][N];
    int i, j, k;

    // Initialize the matrices with random values
    if (rank == 0) {
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                a[i][j] = (double)rand() / RAND_MAX;
                b[i][j] = (double)rand() / RAND_MAX;
            }
        }
    }

    // Broadcast the matrices to all ranks
    MPI_Bcast(a, N*N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
    MPI_Bcast(b, N*N, MPI_DOUBLE, 0, MPI_COMM_WORLD);

    // Each rank calculates a portion of the output matrix
    int rows_per_rank = N / size;
    int start_row = rows_per_rank * rank;
    int end_row = start_row + rows_per_rank;
    for (i = start_row; i < end_row; i++) {
        for (j = 0; j < N; j++) {
            c[i][j] = 0;
            for (k = 0; k < N; k++) {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }

    // Gather the output matrix from all ranks
    double* c_buffer = (double*) malloc(N*N*sizeof(double));
    MPI_Gather(c, rows_per_rank*N, MPI_DOUBLE, c_buffer, rows_per_rank*N, MPI_DOUBLE, 0, MPI_COMM_WORLD);

    // Print the output matrix
    if (rank == 0) {
        printf("Output matrix C:\n");
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                printf("%lf ", c_buffer[i*N + j]);
            }
            printf("\n");
        }
    }

    free(c_buffer);
    MPI_Finalize();
    return 0;
}

this line这条线

double a[N][N], b[N][N], c[N][N];

with N = 1000 requires 24mb of stack space. N = 1000 需要 24mb 的堆栈空间。 Thats almost certainly larger than whats available.那几乎肯定比现有的要大。 Either allocate them statically (place the kw static before them) or dynamically on the heap静态分配它们(将 kw static它们之前)或动态分配在堆上

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM