我已经找到了MPI函数Scatterv的实现,但是我找到了任何可以帮助编写我自己的函数的东西

时间:2014-08-13 08:42:23

标签: c++ mpi

我有一个大小为处理器数量的向量,必须分散到所有处理器。 我已经写了(我想以正确的方式)调用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;?

1 个答案:

答案 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);