MPI_Send 和 MPI_Recv 的行为

2024-02-18

为什么要写这几行代码:

if(my_rank != 0) {
    sprintf(msg, "Hello from %d of %d...", my_rank, comm_sz);
    if(my_rank == 2) {
        sleep(2);
        sprintf(msg, "Hello from %d of %d, I have slept 2 seconds...", my_rank, comm_sz);
    }
    MPI_Send(msg, strlen(msg), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
}
else {
    printf("Hello from the chosen Master %d\n", my_rank);
    for(i = 1; i < comm_sz; i++) {
        MPI_Recv(msg, MAX_STRING, MPI_CHAR, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("%s\n", msg);
    }
}

给出这个结果?

Hello from the chosen Master 0  
Hello from 1 of 5...  
Hello from 2 of 5, I have slept 2 seconds...  
Hello from 3 of 5... have slept 2 seconds...  
Hello from 4 of 5... have slept 2 seconds...

每个进程不是都有自己的 'msg' 副本吗?


strlen()不包含空终止符,因此它不会被发送到主机。从等级 3 接收消息不会覆盖字符串的后面部分,因此仍然显示。你应该使用strlen(msg) + 1作为发送计数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MPI_Send 和 MPI_Recv 的行为 的相关文章

  • 使用 mpi 将矩阵写入单个 txt 文件

    我有一个巨大的矩阵 我将它分成一些子矩阵 然后对其进行一些计算 在这些计算之后 我必须将该矩阵写入一个文件中以进行后处理 是否可以将结果写入单个文本文件 我该怎么做 例如我们有一个nxy 方向划分的 ny 矩阵 每个进程有一个 nx秩矩阵
  • 从 R 调用并行 fortran MPI 子例程

    我想在 R 可以调用的子例程中编写一些并行 Fortran 代码 我想从 R 读取数据并将其发送到并行 Fortran MPI 然而 我注意到 当我将以下程序作为子例程运行时 即将 子例程 替换为 程序 代码不再编译 当它是程序时 它会编译
  • 通过 fftw_mpi_r2c_2d 和 fftw_mpi_c2r_2d 输出不正确

    我编写了一个简单的测试程序 以便在 2d 域 使用 Fortran 中使用 MPI 实现 FFTW 该域的宽度为 Ny x Nx 并在第二个 x 索引中进行分区 在正确 我相信 声明和分配变量和计划之后 我调用 fftw mpi r2c 2
  • 使用 MPI_Gather openmpi c 收集字符串

    我想为每个进程生成一个字符串 然后收集所有内容 但是每个进程中创建的字符串是通过附加整数和字符来创建的 我仍然无法正确收集所有内容 我可以一一打印所有部分字符串 但如果我尝试打印 rcv string 我只会得到一个部分字符串 或者可能会出
  • 如何使用所有处理器在 MPI 中发送/接收

    该程序使用 C Lagrange 和 MPI 编写 我是 MPI 新手 想要使用所有处理器进行一些计算 包括进程 0 为了学习这个概念 我编写了以下简单程序 但是这个程序在接收到进程0的输入后挂在底部 并且不会将结果发送回进程0 inclu
  • 如何使用mpirun为不同的程序使用不同的CPU核心?

    我有一个 32 核的虚拟机 我正在运行一些模拟 需要同时使用 16 个内核 我使用以下命令在 16 个核心上运行作业 mpirun n 16程序名 args gt 注销2 gt 1 该程序在 16 个内核上运行 现在 如果我想在其余核心上使
  • Visual Studio C++ 中的 msmpi.dll 错误消息

    我正在研究 mpi 但我一直收到此错误消息 程序无法启动 因为您的计算机缺少 msmpi dll 尝试 重新安装程序以解决此问题 所以我的问题是 卸载Visual Studio并重新安装可以解决这个问题吗 或者我应该使用电脑修复工具包程序和
  • 在 C 中执行简单 MPI 程序时集群挂起/显示错误

    我正在尝试运行一个简单的 MPI 程序 多个数组加法 它在我的 PC 中完美运行 但只是挂起或在集群中显示以下错误 我正在使用 open mpi 和以下命令来执行 集群网络配置 主节点1 MASTER eth0 Link encap Eth
  • MPI 运行错误“导致所有级别集体中止”

    我正在尝试使用 C 中的 MPI 编写并行程序 但是 当我运行我的程序时 我收到该消息并且我的程序被终止 我不知道该错误消息的原因 警告 无法读取 mpd hosts 或未提供主机列表 MPI 作业将仅在当前计算机上运行 解决方案正在启动
  • CMake:手动设置 MPI 标头和二进制文件的路径

    我正在开发一个 MPI 应用程序 它需要与 MPI 的特定实现一起运行 我们称之为 MPIvA 在我的工作站上 安装了 MPI 的另一个实现 我们称之为 MPIvB 我的应用程序是使用 CMake 构建的find library MPI 显
  • 为什么 Hadoop 不使用 MPI 来实现?

    如果我错了 请纠正我 但我的理解是 Hadoop 不使用 MPI 进行不同节点之间的通信 造成这种情况的技术原因是什么 我可以冒险进行一些猜测 但我对 MPI 是如何 在幕后 实现的了解不够 无法知道我是否正确 想想看 我对 Hadoop
  • MPI 中的相同发送和接收缓冲区

    在我的代码中 每个进程都作用于数组的特定部分 我希望每个进程将其处理的部分发送到其他进程 并从其他进程接收其他部分 为此我使用了MPI Allgatherv但我保持发送和接收缓冲区相同 MPI Allgatherv vel 0 localS
  • 使用 MPJ Express 发送对象

    我是并行编程的新手 我想用 java 来完成它 我想知道是否可以通过 MPI 发送和接收更复杂的对象 我用的是 MPJ Express 然而 每当我想发送一个对象时 我都会收到 ClassCastException MPI Init arg
  • 用MPI发送size_t类型数据

    在 MPI 中发送 size t 类型数字的最安全方法是什么 例如 我确信它是not将其作为 MPI INT 盲目发送是安全的 MPI LONG 总是有效吗 使用宏怎么样 include
  • MPI_Type_create_subarray 和 MPI_Gather

    我必须解决一些 mpi 问题 我有 4 个从进程 每个进程都想发送一个 2d 子数组 CHUNK ROWS X CHUNK COLUMNS 到 master 0 Master 0 收集 ddd ROWS COLUMNS 中的所有块并打印它
  • MPI mpirun execvp 错误:没有这样的文件或目录

    我正在尝试使用 MPI 运行 C 代码 BCparallel cpp 编译代码 mpic BCparallel cpp o BCparallel 很成功 但是当我通过这条线时 mpiexec np 4 BCparallel file txt
  • MPI+CUDA 与纯 MPI 相比有何优势?

    加速应用程序的常用方法是使用 MPI 或更高级别的库 例如在幕后使用 MPI 的 PETSc 并行化应用程序 然而 现在每个人似乎都对使用 CUDA 来并行化他们的应用程序或使用 MPI 和 CUDA 的混合来解决更雄心勃勃 更大的问题感兴
  • 垂直和水平平行度

    最近在并行领域工作 我了解到有两个术语 垂直并行 和 水平并行 有人说openmp 共享内存并行 是垂直并行 而mpi 分布式内存并行 是水平并行 为什么这些术语这么称呼 我不明白原因 这么称呼它们只是术语吗 这些术语似乎没有被广泛使用 也
  • MPI Alltoallv 还是更好的单独发送和接收? (表现)

    我有许多进程 大约 100 到 1000 个 每个进程都必须将一些数据发送到其他一些进程 比如大约 10 个 通常 但并非总是必要 如果 A 发送到 B B 也会发送到 A 每个进程都知道它必须从哪个进程接收多少数据 所以我可以用MPI A
  • GProf 输出中缺少函数

    我正在尝试分析一些 C 代码 但最直观地成本最高的函数之一并未出现在 GProf 输出中 int main initialise haloSwap for functions propagate functions void propaga

随机推荐