簡體   English   中英

MPI程序的分段錯誤

[英]Segmentation fault of an MPI program

我正在編寫一個使用MPI的c ++程序。 我的代碼的簡化版本是

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <mpi.h>
#define RNumber 3000000 //Number of loops to go

using namespace std;

class LObject {
        /*Something here*/
    public:
        void FillArray(long * RawT){
            /*Does something*/
            for (int i = 0; i < RNumber; i++){
                RawT[i] = i;
            }
        }
};

int main() {
    int     my_rank;
    int     comm_sz;
    MPI_Init(NULL, NULL);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);

    LObject System;

    long rawT[RNumber];
    long * Times = NULL;
    if (my_rank == 0) Times = (long*) malloc(comm_sz*RNumber*sizeof(long));

    System.FillArray(rawT);

    if (my_rank == 0) {
        MPI_Gather(rawT, RNumber, MPI_LONG, Times, RNumber,
                MPI_LONG, 0, MPI_COMM_WORLD);
    }
    else {
        MPI_Gather(rawT, RNumber, MPI_LONG, Times, RNumber,
                MPI_LONG, 0, MPI_COMM_WORLD);
    }

    MPI_Finalize();
    return 0;
};

程序編譯正常,但在執行時出現Segmentation fault錯誤。 信息是

=================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   EXIT CODE: 11
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)

當我減少RNumber ,程序運行正常。 也許有人可以解釋究竟出了什么問題? 我是否試圖為陣列分配太多空間? 如果是這種情況,是否可以通過將結果存儲在文件而不是數組中來解決此問題?

如果有可能,請你就我做錯的事情發表廣泛的評論。

謝謝你的時間和精力!

一些可能的問題:

long rawT[RNumber];

這是一個放在堆棧上的大型數組。 堆棧大小通常有限制(特別是在多線程程序中),典型大小為1或2兆字節。 你最好在這里使用std::vector<long>

Times = (long*) malloc(comm_sz*RNumber*sizeof(long));

您應該檢查內存分配是否成功。 或者更好的是,在這里使用std::vector<long> (這也將修復你的內存泄漏)。

if (my_rank == 0) {
    // do stuff
} else {
    // do exactly the same stuff
}

我猜測else塊應該做些不同的事情; 特別是,不涉及Times東西,因為除非my_rank == 0否則為null。

更新:使用向量而不是原始數組,只需使用您想要的大小初始化它,然后使用指向第一個元素的指針,您將使用(指向)數組:

std::vector<long> rawT(RNumber);
System.FillArray(&rawT[0]);

std::vector<long> Times(comm_sz*RNumber);
MPI_Gather(&rawT[0], RNumber, MPI_LONG, &Times[0], RNumber,
           MPI_LONG, 0, MPI_COMM_WORLD);

請注意,如果調整向量的大小,指針將無效(盡管如果您只是將其用作數組的替代品,則不需要這樣做)。

您可能想要查看返回的內容

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

例如comm_sz==0會導致此問題。

您沒有檢查malloc的返回值。 考慮到你試圖分配超過三百萬的長度,malloc會失敗是非常合理的。

這可能不是導致您的問題的原因。

暫無
暫無

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

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