簡體   English   中英

MPI_Reduce C/C++ - 信號:分段錯誤 (11)

[英]MPI_Reduce C/C++ - Signal: Segmentation Fault (11)

我不太了解MPI_Reduce如何與數組一起使用。 我需要做一個元素明智的總和。

為了測試MPI_Reduce function,我編寫了這個簡單的代碼,它可以工作:

double a[4] = {0,1,2,(double)process_id};
double b[4];
MPI_Reduce(&a, &b, 4, MPI_DOUBLE, MPI_SUM, p-1, MPI_COMM_WORLD);
if(id == p-1) {
    for(int i = 0; i < 4; i++){
        printf("%f, ", b[i]);
    }
}

它打印這個:

0.00000, 4.00000, 8.00000, 6.00000 

當我使用 4 個進程運行此代碼時。 有用!

現在我實現我的問題。 假設我使用p過程,我需要減少尺寸為m * np矩陣,所以我以數組的形式重寫每個矩陣

double *a;
double **A;

A = new double*[n];
//code that compute matrix A
a = (double *) malloc(m * n * sizeof(double));
int k = 0;
for(int i = 0; i < m; i++) {
    for(int j = 0; j < n; j++){
        a[k] = A[i][j];
        k++;
    }
}

這樣,我就有了需要以數組形式減少的矩陣。 現在我執行這個縮減:

if(id == p-1){
    reduce_storage = (double *) malloc(m * n * sizeof(double));
}

MPI_Reduce(&a, &reduce_storage, m * n, MPI_DOUBLE, MPI_SUM, p-1, MPI_COMM_WORLD);

數組areduce_storage以相同的方式分配,因此它們具有相同的維度 m * n,即 MPI_Reduce 的count參數的值。 我不明白為什么我嘗試運行它會返回此錯誤:

*** stack smashing detected ***: <unknown> terminated
[EdoardoPC:01104] *** Process received signal ***
[EdoardoPC:01104] Signal: Aborted (6)
[EdoardoPC:01104] Signal code:  (-6)
[EdoardoPC:01104] *** Process received signal ***
[EdoardoPC:01104] Signal: Segmentation fault (11)
[EdoardoPC:01104] Signal code:  (128)
[EdoardoPC:01104] Failing at address: (nil)

我不太了解 MPI_Reduce 如何與數組一起使用。 我需要做一個元素明智的總和。

從關於 MPI_Reduce 的源代碼可以閱讀:

將所有流程的值減少到單個值

int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)

在您的情況下, MPI_Reduce將如下圖所示:

在此處輸入圖像描述

(圖片取自https://mpitutorial.com/tutorials/mpi-reduce-and-allreduce/

從同一來源可以閱讀:

MPI_Reduce 獲取每個進程的輸入元素數組,並將 output 元素數組返回給根進程。 output 元素包含縮減的結果。

現在讓我們看看你的問題

為了測試 MPI_Reduce function,我編寫了這個簡單的代碼,它可以工作:

double a[4] = {0,1,2,(double)process_id};
double b[4];
MPI_Reduce(&a, &b, 4, MPI_DOUBLE, MPI_SUM, p-1, MPI_COMM_WORLD);

所有參數都正確; &a&b分別匹配const void *sendbufvoid *recvbuf 這同樣適用於其余參數,即intMPI_DatatypeMPI_OpintMPI_Comm

在這種情況下,分別具有ab&a和 &b 是“相同的” a&a產生相同的 memory 地址的意義上相同。 盡管如此,使用a&a之間還是有重要的區別,要深入解釋,請閱讀以下“array”和“&array”之間的區別。

數組 a 和 reduce_storage 以相同的方式分配,因此它們具有相同的維度 m * n,即 MPI_Reduce 的 count 參數的值。 我不明白為什么我嘗試運行它會返回此錯誤:

在第二次通話中

MPI_Reduce(&a, &reduce_storage, m * n, MPI_DOUBLE, MPI_SUM, p-1, MPI_COMM_WORLD);

參數areduce_storage現在都是double*類型,並且您將&a&reduce_storage作為MPI_Reduce的參數傳遞。 這是錯誤的,因為&a&reduce_storage將分別返回變量areduce_storage的地址,這將是一個指向雙精度指針的指針。

假設我使用 p 過程,我需要減少 p

旁注:使用“p”作為大小的總數有點令人困惑,更好的名稱 IMO 將是total_processesnumber_of_processes或類似的東西。

暫無
暫無

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

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