我是第一次使用MPI_Gather并遵循一些示例,但是由于某种原因,每当我调用它时都会遇到段错误。 相关代码在这里:

    //Get the top N matches for each node
    for (int j = 0; j < send_counts[id]; j++)
    {   
        data = read_file(my_dir + files[rec_buf[j]]);
        temp_results = circularSubvectorMatch(test_vectors[i], data, N); 
        results.insert(results.end(), temp_results.begin(), temp_results.end());
    }   

    std::sort(results.begin(), results.end(), sort_function);
    results.resize(N);

    //Send the N dissimilarities from each node to the root process and let it figure out
    //the Nth best one overall
    float *best_times = new float[N];
    for (int j = 0; j < N; j++)
    {   
        best_times[j] = results[j].dissimilarity;
    }   

    MPI_Barrier(MPI_COMM_WORLD);

    float *all_dissimilarities = NULL;
    if (id == 0)
    {   
       float *all_dissimilarities = new float[N * procs];
    }   

    MPI_Gather(best_times, N, MPI_FLOAT, all_dissimilarities, N, MPI_FLOAT, 0, MPI_COMM_WORLD);
    float *nth_best;
    if (id == 0)
    {
        std::sort(all_dissimilarities, all_dissimilarities + N * procs - 1);
        *nth_best = all_dissimilarities[N-1];
        *nth_best = 1.0;
    }
    MPI_Bcast(nth_best, 1, MPI_FLOAT, 0, MPI_COMM_WORLD);

    cout << "My id is " << id << "and I received: " << *nth_best << endl;

    //each process prints each result it has that is better than or equal
    //to the Nth best result calculated by the root process


    //output search vector and search time

    free(all_dissimilarities);
    free(best_times);
    MPI_Barrier(MPI_COMM_WORLD);

我已经像示例中一样分配了发送缓冲区和接收缓冲区,有人可以阐明为什么我会收到此错误吗?

===============>>#1 票数:1

您的代码有两个问题,一个需要修复,另一个将清理您的代码。 另外,由于我们真的不知道“ j”的值是什么,所以我所能做的就是假设这些值是有效的。

问题如下:

问题1:对分配有new[]数据调用free()。

切勿混合使用这种分配和释放功能。 如果使用new[]分配,则使用delete[]分配,而不是free() ,而不进行delete (非数组删除)。

问题2:在不需要使用new []时使用它。

您可以将所有对new []的调用替换为std :: vector。 这是使用vector重写您的代码段的方法:

 //Get the top N matches for each node
#include <vector>
//...
typedef std::vector<float> FloatArray;
//...
for (int j = 0; j < send_counts[id]; j++)
{   
    data = read_file(my_dir + files[rec_buf[j]]);
    temp_results = circularSubvectorMatch(test_vectors[i], data, N); 
    results.insert(results.end(), temp_results.begin(), temp_results.end());
}   

std::sort(results.begin(), results.end(), sort_function);
results.resize(N);

//Send the N dissimilarities from each node to the root process and let it figure out
//the Nth best one overall
FloatArray best_times(N);
for (int j = 0; j < N; j++)
    best_times[j] = results[j].dissimilarity;

MPI_Barrier(MPI_COMM_WORLD);

float *pFirst = NULL;
FloatArray all_dissimilarities;
if (id == 0)
{
   all_dissimilarities.resize(N * procs);
   pFirst = &all_disimilarities[0];
}

MPI_Gather(&best_times[0], N, MPI_FLOAT, pFirst, N, MPI_FLOAT, 0, MPI_COMM_WORLD);
float nth_best;
if (id == 0)
{
    std::sort(all_dissimilarities.begin(), all_dissimilarities.end());
    nth_best = all_dissimilarities.back();
    nth_best = 1.0;
}
MPI_Bcast(&nth_best, 1, MPI_FLOAT, 0, MPI_COMM_WORLD);
cout << "My id is " << id << "and I received: " << nth_best << endl;
MPI_Barrier(MPI_COMM_WORLD);

现在,没有对new []的调用,也没有对free()的(错误)调用。 几乎没有指针使用。 由于向量知道如何销毁自身,因此不会发生内存泄漏。

  ask by Dan translate from so

未解决问题?本站智能推荐:

1回复

OpenMPI MPI_Gather段错误或断言错误

我正在尝试使用OpenMPI为我的本科高级项目构建多进程raytracer,以便可以在学校的超级计算机上运行它。 我到了可以编译代码并且可以正常运行直到到达代码行的地步 我的问题是这行的问题是什么,这取决于我运行的进程数或尝试渲染的场景,它导致我的程序出现段错误或导致(到目前为止)
1回复

分段错误11:带有MPI的C

使用MPI实现并行的《人生游戏》版本,遇到细分错误(信号11)。 MPI的新手,无法真正让valgrind告诉我确切的错误存在于何处。 简化了我的代码,发现粗体代码段存在问题。 编辑:标记存在问题的代码块 编辑:输入文件life.data.1具有表示活细胞的XY坐标。
1回复

使用fortran衍生的数据类型在mpi_gather中进行分段错误

我一直在尝试编写一个程序,该程序可以计算数百万个偶极-偶极子相互作用张量及其导数。 由于这些张量可微细地并行化,并且经常退化,因此我决定构造一个查找表(LUT)并分发工作。 最终,它们将被组合成一个大矩阵并被对角线化(最终我将使用scalapack。目前,diag适合nersc的一个节点)。
2回复

MPI_Gather数量不等?

我正在使用MPI_Scatter和MPI_Gather实现矩阵乘法。 如果进程数均匀分为矩阵行数列,我的代码可以正常工作。 但是,当它们没有均匀分配时,它会在MPI_Gather上崩溃。 这是有道理的,因为MPI_Gather期望从每个进程获得一定数量,并且不会从最后一个进程获得那么多。
1回复

MPI_Free_mem使用OpenMPI失败,出现分段错误

我在Intel Ubuntu系统上将OpenMPI与Intel C ++编译器一起使用。 每当我尝试分别用MPI_Alloc_mem和MPI_Free_mem调用替换new[]和delete[]调用时,总是会遇到分段错误。 MPI_Alloc_mem调用返回MPI_SUCCESS 。
1回复

使用brew,git或内置mpi的MPI_Comm_rank()中的MPI Seg错误

我无法让MPI在MacBook Pro上运行。 特别是,当我尝试调用MPI_Comm_rank()时,它会出现段故障。 这是一个示例程序: 使用mpic++ mpi_test.cpp -o mpi_test很好地编译,但是随后我尝试通过调用mpirun -np 2 ./mpi_tes
1回复

MPI_Send中的细分错误,用于派生数据类型

在下面的代码中,如果MPI_Get_address(&member, &offset[0]); 替换为offset[0] = 0; 该代码将按预期工作,否则将显示以下输出。 据我所知,要使用MPI_BOTTOM ,需要绝对内存地址,这就是为什么要使用MPI_Get_addr
1回复

使用MPI_TYPE_VECTOR代替MPI_GATHER

假设k个进程计算矩阵A的元素,其维数为(n,m) ,其中n是行数, m是列数。 我正在尝试使用MPI_GATHER在根过程中将这两个矩阵收集到矩阵B中,其中B的维数为(n,km) 。 更具体地说,我在下面编写了一个示例fortran代码。 在这里,我将矩阵A的各列(而不是整个矩阵)传递到矩
1回复

信号:使用Openmpi时出现分段错误(11)

我正在使用CFD代码,它基于Opnempi。 当我仅使用一个内核来运行它时,没有任何问题。 但是当我使用更多的内核来运行它时,出现了如下错误: [DESKTOP-7D2F3AN:03839]处理收到的信号 [DESKTOP-7D2F3AN:03839]信号:分段错误(11)
1回复

MPI的Scatterv操作

我不确定我是否正确理解MPI_Scatterv应该做什么。 我有79个项目可以分散数量可变的节点。 但是,当我使用MPI_Scatterv命令时,我得到了荒谬的数字(好像接收缓冲区的数组元素未初始化)。 这是相关的代码片段: 当我运行该代码时,我收到以下输出: 我阅读了Op