C-尝试使用MPI_RECV接收向量



我正在使用MPI和CGM现实并行模型实现Chan和Dehne排序算法。到目前为止,每个过程都从原始矢量接收N/P号,然后每个过程使用快速排序顺序订购其数字,然后每个过程都会从其本地矢量中创建一个示例(示例具有尺寸p),然后每个过程将其示例发送给到P0;P0应在大小p*p的较大矢量中接收所有样品,以便可以容纳所有处理器的数据。这是我卡住的地方,它似乎在起作用,但是由于某种原因,P0接收到信号出口的所有数据:分割故障(11)。谢谢。

这是代码的相关部分:

// Step 2. Each process calculates it's local sample with size comm_sz
        local_sample = create_local_sample(sub_vec, n_over_p, comm_sz);
// Step 3. Each process sends it's local sample to P0
        if (my_rank == 0) {
            global_sample_receiver = (int*)malloc(pow(comm_sz,2)*sizeof(int));
            global_sample_receiver = local_sample;
            for (i = 1; i < comm_sz; i++) {
                MPI_Recv(global_sample_receiver+(i*comm_sz), comm_sz, MPI_INT,
                i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            }   
        } else {
            MPI_Send(local_sample, comm_sz, MPI_INT, 0, 0, MPI_COMM_WORLD);
        }
        printf("P%d got heren", my_rank);
        MPI_Finalize();

有趣的是,每个过程都到达命令printf("P%d got heren", my_rank);,然后将其打印到终端。 global_sample_receiver的确包含了应该在末尾包含的数据,但是该程序仍然以分段故障完成。

这是输出:

P2 got here
P0 got here
P3 got here
P1 got here
[Krabbe-Ubuntu:05969] *** Process received signal ***
[Krabbe-Ubuntu:05969] Signal: Segmentation fault (11)
[Krabbe-Ubuntu:05969] Signal code: Address not mapped (1)
[Krabbe-Ubuntu:05969] Failing at address: 0x18000003e7
--------------------------------------------------------------------------
mpiexec noticed that process rank 0 with PID 5969 on node Krabbe-Ubuntu 
exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------

编辑:我发现问题了,事实证明local_sample也需要一个malloc。

问题是您覆盖global_sample_receiver(是指指指针), local_sample(是另一个指针)等级零。

如果要使用local_sample的第一个comm_sz元素设置global_sample_receiver的第一个comm_sz元素,则必须手动复制数据(例如> 指针)。

memcpy(global_sample_receiver, local_sample, comm_sz * sizeof(int));

话虽如此,自然的MPI是通过MPI_Gather()

这是步骤3的样子:

// Step 3. Each process sends it's local sample to P0
if (my_rank == 0) {
    global_sample_receiver = (int*)malloc(pow(comm_sz,2)*sizeof(int));
}
MPI_Gather(global_sample_receiver,comm_sz, MPI_INT, local_sample, comm_sz, MPI_INT, 0, MPI_COMM_WORLD);

相关内容

  • 没有找到相关文章

最新更新