首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获信号11 (分割错误:地址未映射到地址处的对象(零)

捕获信号11 (分割错误:地址未映射到地址处的对象(零)
EN

Stack Overflow用户
提问于 2022-04-05 14:36:38
回答 1查看 2.6K关注 0票数 1

--我试图使用命令计算数组的和;请注意,A仅对主节点/根(0)可见。

我得到了下面的错误,我似乎不知道为什么。同时,广播部分(N)仍然会产生相同的错误。

错误:

代码语言:javascript
运行
复制
[kali:74924:0:74924] Caught signal 11 (Segmentation fault: address not mapped to object at address (nil))
==== backtrace (tid:  74924) ====
 0  /lib/x86_64-linux-gnu/libucs.so.0(ucs_handle_error+0x2dc) [0x7f14b5486a9c]
 1  /lib/x86_64-linux-gnu/libucs.so.0(+0x28c8f) [0x7f14b5486c8f]
 2  /lib/x86_64-linux-gnu/libucs.so.0(+0x28e4a) [0x7f14b5486e4a]
 3  /lib/x86_64-linux-gnu/libc.so.6(+0x3c910) [0x7f14b564e910]
 4  ./parts(+0x14f1) [0x557de43984f1]
 5  /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xcd) [0x7f14b56397ed]
 6  ./parts(+0x113a) [0x557de439813a]
=================================
[kali:74925:0:74925] Caught signal 11 (Segmentation fault: address not mapped to object at address (nil))
==== backtrace (tid:  74925) ====
 0  /lib/x86_64-linux-gnu/libucs.so.0(ucs_handle_error+0x2dc) [0x7fb3324b0a9c]
 1  /lib/x86_64-linux-gnu/libucs.so.0(+0x28c8f) [0x7fb3324b0c8f]
 2  /lib/x86_64-linux-gnu/libucs.so.0(+0x28e4a) [0x7fb3324b0e4a]
 3  /lib/x86_64-linux-gnu/libc.so.6(+0x3c910) [0x7fb332678910]
 4  ./parts(+0x14f1) [0x5581e42d44f1]
 5  /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xcd) [0x7fb3326637ed]
 6  ./parts(+0x113a) [0x5581e42d413a]
=================================
[kali:74926:0:74926] Caught signal 11 (Segmentation fault: address not mapped to object at address (nil))
==== backtrace (tid:  74926) ====
 0  /lib/x86_64-linux-gnu/libucs.so.0(ucs_handle_error+0x2dc) [0x7f7e8e8f9a9c]
 1  /lib/x86_64-linux-gnu/libucs.so.0(+0x28c8f) [0x7f7e8e8f9c8f]
 2  /lib/x86_64-linux-gnu/libucs.so.0(+0x28e4a) [0x7f7e8e8f9e4a]
 3  /lib/x86_64-linux-gnu/libc.so.6(+0x3c910) [0x7f7e8eac1910]
 4  ./parts(+0x14f1) [0x558b09e094f1]
 5  /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xcd) [0x7f7e8eaac7ed]
 6  ./parts(+0x113a) [0x558b09e0913a]
=================================

===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 74924 RUNNING AT kali
=   EXIT CODE: 11
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions

码:

w/out广播

代码语言:javascript
运行
复制
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#include <time.h>

int main (int argc, char** argv) {
    int rank;
    int size;
    int sum = 0;
    int grand_sum = 0;
    int i;
    int *A;
    int N;
    int part;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    if (rank == 0) {
        do {
            printf("Enter the array size: ");
            scanf("%d", &N);
        } while (N <= 0);

        A = malloc(N * sizeof(int));
        if (!A) {
            printf("Array too big!\nExiting the program...\n");
            return -1;
        }

        part = N / size;

        srand(10);
        for (i = 0; i < N; i++) {
            A[i] = rand() % 10 + 1;
            grand_sum += A[i];
            printf("A[%d] = %d\n", i, A[i]);
        }
        
        for (i = 1; i < size; i++) {
            MPI_Send(&part, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
            MPI_Send(&A[i * part], part, MPI_INT, i, 0, MPI_COMM_WORLD);
        }
    } else {
        int part;
        MPI_Recv(&part, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        int Aw[part];
        MPI_Recv(&Aw, part, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        for (i = 0; i < part; i++) {
            sum += A[i];
        }
    }

    MPI_Reduce(&sum, &grand_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

    if (rank == 0) {
        for (i = size * part; i < N; i++) {
            grand_sum += A[i];
        }

        printf("\nThe grand sum is: %d", grand_sum);
    }

    MPI_Finalize();
}

W/广播

代码语言:javascript
运行
复制
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#include <time.h>

int main (int argc, char** argv) {
    int rank;
    int size;
    int sum = 0;
    int grand_sum = 0;
    int i;
    int *A;
    int N;
    int part;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    if (rank == 0) {
        do {
            printf("Enter the array size: ");
            scanf("%d", &N);
        } while (N <= 0);

        A = malloc(N * sizeof(int));
        if (!A) {
            printf("Array too big!\nExiting the program...\n");
            return -1;
        }

        part = N / size;

        srand(10);
        for (i = 0; i < N; i++) {
            A[i] = rand() % 10 + 1;
            printf("A[%d] = %d\n", i, A[i]);
        }
        
        for (i = 1; i < size; i++) {
            //MPI_Send(&part, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
            MPI_Send(&A[i * part], part, MPI_INT, i, 0, MPI_COMM_WORLD);
        }
    } 
    
    MPI_Bcast(&part, 1, MPI_INT, 0, MPI_COMM_WORLD);

    if (rank != 0) {
        //MPI_Recv(&part, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        int Aw[part];
        MPI_Recv(&Aw, part, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        for (i = 0; i < part; i++) {
            sum += A[i];
        }
    }

    MPI_Reduce(&sum, &grand_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

    if (rank == 0) {
        for (i = size * part; i < N; i++) {
            grand_sum += A[i];
        }

        printf("\nThe grand sum is: %d", grand_sum);
    }

    MPI_Finalize();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-05 15:08:28

在重新阅读我的代码之后,我在for循环中发现了else语句中的一个错误:

代码语言:javascript
运行
复制
for (i = 0; i < part; i++) {
            sum += A[i];
}

A在这里不可见,因此出现错误。,W,,应该在这里使用。

正确代码:

代码语言:javascript
运行
复制
for (i = 0; i < part; i++) {
            sum += Aw[i];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71753689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档