首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MPI_Scatter时出现Seg故障

使用MPI_Scatter时出现Seg故障
EN

Stack Overflow用户
提问于 2019-10-09 08:58:52
回答 1查看 208关注 0票数 0

我对MPI_Scatter有意见。不知道热使用它和我的当前程序崩溃与seg错误,当我启动。

我猜问题出在MPI_Scatter的参数上,特别是在使用右运算符(&或*或空)调用它时,但我几乎尝试了每种组合,但实际上没有任何帮助。

代码语言:javascript
复制
#include <iostream>
#include <stdio.h>
#include <mpi.h>

// k = 3, N = 12,  1,2,3, 4,5,6, 7,8,9, 10,11,12

int main(int argc, char **argv) {
    int N, size, myrank;
    int k;
    std::cin >> N;
    std::cin >> k;
    int *mass = new int[N];
    int *recv = new int[k];

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

    if (myrank == 0) {
        std::cout << "get k and n \n";

        for (int i = 0; i < N; ++i) {
            mass[i] = i;
            std::cout << i << " written\n";
        }
    }

    MPI_Scatter(mass, k, MPI_INT, recv, k, MPI_INT, 0, MPI_COMM_WORLD);

    int sum = 0;
    std::cout << "myrank" << myrank << '\n';
    for (int i = 0; i < k; ++i) {
        std::cout << recv[i] << '\n';
    }

    MPI_Finalize();

    return 0;
}

当我启动这段代码时,它会打印以下内容:

代码语言:javascript
复制
N = 12
k = 3
get k and n 
0 written
1 written
2 written
3 written
4 written
5 written
6 written
7 written
8 written
9 written
10 written
11 written
myrank0
0
1
2
myrank1
myrank3
myrank2
[1570583203.522390] [calc:32739:0]          mpool.c:38   UCX  WARN  object 0x7fe1f08b2f60 was not returned to mpool mm_recv_desc
[1570583203.523214] [calc:32740:0]          mpool.c:38   UCX  WARN  object 0x7f4643986f60 was not returned to mpool mm_recv_desc
[1570583203.524205] [calc:32741:0]          mpool.c:38   UCX  WARN  object 0x7f22535d4f60 was not returned to mpool mm_recv_desc
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-09 10:07:08

MPI通常会将stdout重定向到等级0,因此Nk在其他等级上设置不正确。

这是你的程序的一个工作版本

代码语言:javascript
复制
#include <iostream>
#include <cassert>
#include <stdio.h>
#include <mpi.h>

// k = 3, N = 12,  1,2,3, 4,5,6, 7,8,9, 10,11,12

int main(int argc, char **argv) {
    int k, N, size, myrank;
    int *mass;

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


    if (myrank == 0) {
        std::cout << "get k and n \n";
        std::cin >> N;
        std::cin >> k;
        assert (N >= k*size);
        mass = new int[N];
        for (int i = 0; i < N; ++i) {
            mass[i] = i;
            std::cout << i << " written\n";
        }
    }
    MPI_Bcast(&k, 1, MPI_INT, 0, MPI_COMM_WORLD);

    int *recv = new int[k];

    MPI_Scatter(mass, k, MPI_INT, recv, k, MPI_INT, 0, MPI_COMM_WORLD);

    int sum = 0;
    std::cout << "myrank" << myrank << '\n';
    for (int i = 0; i < k; ++i) {
        std::cout << recv[i] << '\n';
    }

    MPI_Finalize();

    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58295722

复制
相关文章

相似问题

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