我有一个大小为处理器数量的向量,必须分散到所有处理器。
我已经写了(我想以正确的方式)调用MPI::COMM_WORLD.Scatterv
所需的所有辅助向量和数组。程序编译,但一旦运行它说没有映射地址。
我将在这里只写出Scatterv函数中涉及的部分代码。
代码是:
std::vector<int> double_gid_m(num_gids);
if (my_id == 0) {
...here the values of double_gid_m for each processors are defined
}
std::vector<int> vect_double_gid_size_processors(num_processors);
for (int i=0;i<num_processors;i++) {
...in this for loop I define for each vect_double_gid_size_processors[i]
the amount of data that should be assigned to each processor, with:
vect_double_gid_size_processors[i]=amount_of_data_for_each_processor[i];
}
之后,我使用vect_double_gid_size_processors
定义每个处理器的分配位移,即每个处理器的数据量:
int double_gid_size_displacement[num_processors];
if (my_id == 0) {
int sum = 0;
for (int i = 0; i < num_processors; i++) {
double_gid_size_displacement[i] = sum;
sum += vect_double_gid_size_processors[i];
}
}
最后,我调用MPI :: COMM_WORLD.Scatterv
MPI::COMM_WORLD.Scatterv(&double_gid_m[0], &vect_double_gid_size_processors[0],
&double_gid_size_displacement[0], MPI::INT, &double_gid_m[0],
vect_double_gid_size_processors[my_id], MPI::INT, 0);
我试图改变一些输入参数,例如传递第一个元素的地址的向量或数组,但是在这种情况下编译器没有工作,并给了我这样的函数作为一个用过的。我的意思是矢量或数组的地址,而不是矢量或数组本身。
任何人都可以帮助我理解为什么编译是好的,但是运行失败并出现&#34;信号:分段错误&#34;和&#34;信号代码:地址未映射&#34;?
答案 0 :(得分:0)
我在对scatterv的调用中发现了错误。
调用必须使用不同的向量进行输入和输出。在上面的代码中,我使用了相同的向量:
double_gid_m
现在我定义了一个新的向量gid.m,一切进展顺利(但是代码在后续部分给出错误!!!)。代码现在是:
gid_m.resize(2*total_half_gid_size);
MPI::COMM_WORLD.Scatterv(&double_gid_m[0], &vect_double_gid_size_processors[0], &double_gid_size_displacement[0], MPI::INT, &gid_m[0], vect_double_gid_size_processors[my_id], MPI::INT, 0);