簡體   English   中英

MPI_Gatherv向量下標超出范圍

[英]MPI_Gatherv vector subscript out of range

大家好,我是MPI的新手,我在網站上搜索到,有一種方法可以收集動態大小的矢量,並結合使用collect的大小和collectv的大小。 但是我的代碼有問題,這是我正在運行的測試,以查看我是否做得正確。

int main(int arg, char** argvs) {
MPI_Init(&arg, &argvs);
int size, rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

vector<int> vectordata;
if (rank == 1)
    vectordata.push_back(2);
if (rank == 2) {
    vectordata.push_back(1);
    vectordata.push_back(5);
}

int *counts = new int[size];
int nelements = (int)vectordata.size();
// Each process tells the root how many elements it holds
MPI_Gather(&nelements, 1, MPI_INT, counts, 1, MPI_INT, 0, MPI_COMM_WORLD);

// Displacements in the receive buffer for MPI_GATHERV
int *disps = new int[size];
// Displacement for the first chunk of data - 0
for (int i = 0; i < size; i++)
    disps[i] = (i > 0) ? (disps[i - 1] + counts[i - 1]) : 0;

// Place to hold the gathered data
// Allocate at root only
vector<int> alldata;
if (rank == 0)
    // disps[size-1]+counts[size-1] == total number of elements
    alldata = vector<int>(disps[size - 1] + counts[size - 1]);
// Collect everything into the root
MPI_Gatherv(vectordata.data(), nelements, MPI_INT,
    alldata.data(), counts, disps, MPI_INT, 0, MPI_COMM_WORLD);

cout << alldata.size() << endl;
cout << alldata[0] << endl;
cout << alldata[1] << endl;
cout << alldata.back() << endl;

MPI_Finalize();
}

第一個cout應該打印3,而是打印:
0
0
3
最后3個cout打印:
2
1個
5

但是,在打印后它崩潰了,提示:調試斷言失敗! 向量下標超出范圍。
我認為這與位移有關,但我不確定是什么,如果有人能向我解釋我計算disps [i]的行,那將是很棒的,因為我是從先前的答案中得到的,而我卻沒有完全理解。 先感謝您。

MPI_Gatherv將所有內容收集到主目錄。 不等於主等級的所有等級上的alldata仍然為空(因此,最初為兩個0 ,以及“調試斷言失敗!”錯誤)。 將一組cout放到if (rank == 0)塊中,或者確保在執行cout之前將所有數據廣播到其他列。

暫無
暫無

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

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