MPI_Gatherv 向量下标超出范围

Posted

技术标签:

【中文标题】MPI_Gatherv 向量下标超出范围【英文标题】:MPI_Gatherv vector subscript out of range 【发布时间】:2018-02-21 15:59:46 【问题描述】:

大家好,我是 MPI 的新手,我在网站上搜索发现有一种方法可以收集动态大小的矢量,并结合收集大小然后收集 v。 但是我的代码有问题,这是我正在运行的测试,以查看我是否正确执行。

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] 的行,因为我从以前的答案中得到它,我不完全明白它。 提前谢谢你。

【问题讨论】:

【参考方案1】:

MPI_Gatherv 将一切聚集到大师级别。 alldata 在不等于主级别的所有级别上仍然是空的(因此最初的两个 0s,以及“调试断言失败!”错误)。将couts 的集合放在if (rank == 0) 块中,或者确保在执行cout 之前将所有数据广播到其他行列。

【讨论】:

以上是关于MPI_Gatherv 向量下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章

二维向量下标超出范围

调试断言失败,向量下标超出范围

循环向量不起作用::向量下标超出范围[重复]

opencv图像处理,向量下标超出范围

搜索字符串时向量下标超出范围

错误向量下标超出范围