关于 MPI_Scatter 执行器及其发送缓冲区分配的问题

2023-11-30

我的第一个想法是MPI_Scatter和发送缓冲区分配应该用于if(proc_id == 0)子句,因为数据应该只分散一次,并且每个进程只需要发送缓冲区中的一部分数据,但是它无法正常工作。

看来发送缓冲区分配和MPI_Scatter在应用程序正常运行之前必须由所有进程执行。

所以我在想,存在的哲学是什么?MPI_Scatter因为所有进程都可以访问发送缓冲区。

任何帮助将不胜感激。


Edit: Code I wrote like this:
if (proc_id == 0) {
    int * data = (int *)malloc(size*sizeof(int) * proc_size * recv_size);
    for (int i = 0; i < proc_size * recv_size; i++) data[i] = i;

    ierr = MPI_Scatter(&(data[0]), recv_size, MPI_INT, &recievedata, recv_size, MPI_INT, 0, MPI_COMM_WORLD);
}

我想,根进程分散数据就足够了,其他进程需要做的只是接收数据。所以我把MPI_Scatter,以及发送缓冲区定义和分配,在if(proc_id == 0)陈述。没有编译/运行时错误/警告,但其他进程的接收缓冲区没有收到其相应的数据部分。


你的问题不是很清楚,如果你展示一些你遇到问题的代码会更容易理解。这就是我的think你问的问题——我只是猜测这一点,因为这是我在 C make 中看到 MPI 新手遇到的错误。

如果你有这样的代码:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main(int argc, char **argv) {
    int proc_id, size, ierr;
    int *data;
    int recievedata;

    ierr = MPI_Init(&argc, &argv);
    ierr|= MPI_Comm_size(MPI_COMM_WORLD,&size);
    ierr|= MPI_Comm_rank(MPI_COMM_WORLD,&proc_id);

    if (proc_id == 0) {
        data = (int *)malloc(size*sizeof(int));
        for (int i=0; i<size; i++) data[i] = i;
    }

    ierr = MPI_Scatter(&(data[0]), 1, MPI_INT,
             &recievedata, 1, MPI_INT, 0, MPI_COMM_WORLD);

    printf("Rank %d recieved <%d>\n", proc_id, recievedata);

    if (proc_id == 0) free(data);

    ierr = MPI_Finalize();
    return 0;
}

为什么它不起作用,为什么会出现分段错误?的course其他进程无权访问data;这就是重点。

答案是,在非 root 进程中,sendbuf参数(第一个参数MPI_Scatter()) 没有被使用。所以非根进程don't需要访问data。但是您仍然无法取消引用尚未定义的指针。因此,您需要确保所有 C 代码都是有效的。但数据在所有其他进程上可以为 NULL 或完全未定义;你只需要确保你没有意外地取消引用它。所以这工作得很好,例如:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main(int argc, char **argv) {
    int proc_id, size, ierr;
    int *data;
    int recievedata;

    ierr = MPI_Init(&argc, &argv);
    ierr|= MPI_Comm_size(MPI_COMM_WORLD,&size);
    ierr|= MPI_Comm_rank(MPI_COMM_WORLD,&proc_id);

    if (proc_id == 0) {
        data = (int *)malloc(size*sizeof(int));
        for (int i=0; i<size; i++) data[i] = i;
    } else {
        data = NULL;
    }

    ierr = MPI_Scatter(data, 1, MPI_INT,      
             &recievedata, 1, MPI_INT, 0, MPI_COMM_WORLD);

    printf("Rank %d recieved <%d>\n", proc_id, recievedata);

    if (proc_id == 0) free(data);

    ierr = MPI_Finalize();
    return 0;
}

如果您在 C 中使用“多维数组”,并说分散矩阵的一行,那么您必须跳过一两个额外的环才能完成这项工作,但这仍然很容易。

Update:

请注意,在上面的代码中,所有例程都调用Scatter- 发送者和接收者。 (实际上,发送者也是接收者)。

在消息传递范例中,发送者和接收者都必须合作才能发送数据。原则上,这些任务可以在不同的计算机上进行,也可能位于不同的建筑物中——它们之间不共享任何内容。因此,任务 1 无法将数据“放入”任务 2 内存的某些部分。 (请注意,MPI2 具有“单向消息”,但即便如此,也需要发送方和接收方之间进行高度协调,因为必须留出一个窗口来将数据推入或拉出数据)。

典型的例子是发送/接收对;进程 0 向进程 3 发送数据是不够的,进程 3 还必须接收数据。

The MPI_Scatter函数包含发送和接收逻辑。根进程(这里指定为0)发出数据,所有接收者接收;每个参与的人都必须调用例程。散点图是一个例子MPI 集体运营,其中通信器中的所有任务都必须调用相同的例程。其他示例包括广播、屏障、归约操作和收集操作。

如果只有进程 0 调用分散操作,您的程序将挂起,永远等待其他任务参与。

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

关于 MPI_Scatter 执行器及其发送缓冲区分配的问题 的相关文章

  • 导航组件 popUpTo bug

    最近我遇到了我询问的问题here 但当我试图弄清楚发生了什么时 我总是偶然发现同样的问题 这就是我所拥有的 我有一个集合 预览 编辑片段 我需要在片段之间进行导航 但是从编辑片段导航到预览片段后 我希望后退按钮将用户带到集合片段而不是编辑片

随机推荐

  • C# - 从 FTP 下载上次修改日期较高的文件

    我有一个包含一些文件的 FTP 服务器 我在本地目录中有相同的文件 在C 当我运行该程序时 我希望它搜索 FTP 服务器中上次修改时间戳晚于本地目录中相同文件 同名 的所有文件 并下载找到的所有文件 有人可以给我帮助或提示吗 我会感谢所有的
  • 将派生类序列化/反序列化为基类

    例如我有以下课程 public abstract class Device public class WindowsDevice Device public class AndroidDevice Device 现在我想将 WindowsD
  • 如何在 .Net Core Identity 中实施 2FA?

    问题 如何强制现有用户在 Net Core 3 1 Identity 中设置 2FA 我已经在这里看到了几个答案 但我对它们有如下问题 如果用户未设置 2FA 页面 则重定向用户以在登录时设置 2FA 页面 问题是用户可以简单地跳转到不同的
  • 如何使用 Java 将字符串保存到文本文件?

    在 Java 中 我有来自名为 text 的字符串变量中的文本字段的文本 如何将 text 变量的内容保存到文件中 如果您只是输出文本 而不是任何二进制数据 则以下内容将起作用 PrintWriter out new PrintWriter
  • 有条件地单独禁用 Serilog 接收器

    我的 net core 应用程序基本配置上有 Serilog 如下所示 Log Logger new LoggerConfiguration ReadFrom Configuration Configuration Enrich FromL
  • 在 C 中将指针的地址存储在 unsigned int 中

    是否可以将指针强制转换为 unsigned int 然后将其强制转换回指针 我试图将指向结构的指针存储在 pthread t 变量中 但我似乎无法让它工作 这是我的代码的一些片段 我正在创建一个用户级线程管理库 当我尝试打印线程的 tid
  • 打开文件夹并最大化文件夹窗口

    我有以下简单的 Powershell 脚本 ii E Source Development websites example com au root ii E Source Development websites example com
  • 生成所有可能的互质的排序列表

    我需要生成所有互质的无限排序列表 每对中的第一个元素必须小于第二个元素 排序必须按升序进行 按对元素的总和 如果两个总和相等 则除以该对的第一个元素 因此 结果列表必须是 2 3 2 5 3 4 3 5 2 7 4 5 3 7 2 9 3
  • Bootstrap 5 下拉菜单向右截断

    User 的下拉列表是 cuf of 我正在使用 Bootstrap 5 我在 stackoverflow 上阅读了一篇较旧的文章 建议将 dropdown menu left dropdown menu right on the 这对我不
  • 如何使用midlrt.exe将.idl编译为.winmd?

    背景 我需要构建一个 Windows 运行时组件作为设置为使用的系统的一部分CMake生成其构建系统 作为准备步骤 我尝试在命令行上构建它 从简单的 idl 文件 MyType idl 开始 namespace NS default int
  • cookie / MAMP / CodeIgniter 的问题

    我在使用 MAMP 和 Codeigniter 读取本地主机上的 cookie 时遇到问题 我正在尝试使用 cookie 来验证对管理区域的访问 我可以设置 cookie 我在浏览器上看到它 Chrome 但在授予访问权限后我无法读取它 我
  • 接受 Java 中的证书

    我在通过 Java 与 HTTPS 站点交互时遇到问题 我的程序每次运行时都会使用一个带有不受信任证书的 URL 该程序必须在多个系统上运行 目前 我有以下内容 public class A HostnameVerifier hv new
  • Google 日历 API - 未从 Execute() C# 返回

    运行下面的代码永远不会从执行函数返回 我的个人 Gmail 帐户上有一个私人日历 已与developer gserviceaccount com 帐户共享 查看 API 管理器 用法 引用显示我已经使用过甚至点击了该 API 任何想法表示赞
  • 将非结构化 csv 文件转换为数据框

    我正在学习 R 用于文本挖掘 我有一个 CSV 格式的电视节目表 节目通常从早上 06 00 开始 一直持续到第二天凌晨 05 00 称为播出日 例如 2015 年 11 月 15 日的节目从早上 06 00 开始 到次日凌晨 05 00
  • 在Java中,如何测试对象的监视器是否被锁定? [复制]

    这个问题在这里已经有答案了 在Java中 如何测试对象的监视器是否被锁定 换句话说 给定一个对象 obj 是否有任何线程拥有 obj 的监视器 我不关心哪个线程拥有监视器 我需要测试的是是否有任何线程拥有给定对象的监视器 由于当前线程以外的
  • 如何在 React 中将多个浏览器特定值添加到 CSS 样式中?

    这主要是为了给定的 CSS 属性定义浏览器特定值 如下所示 div Grab me div 如果我将它包装成这样的对象 div Grab me div 然后您复制对象中的键 在严格模式下会失败 否则会覆盖 并且简单地将所有值放入单个字符串中
  • 应用配色方案

    我正在为现有应用程序开发一个新的 UI 目前使用 VB6 并且被告知要使其看起来更好 更漂亮 有没有什么地方可以让我获得一些关于商业应用程序的配色方案 非 25 度灰度 的好主意 仅供参考 我在 WPF 工作 检查这个应用 用于拍摄配色方案
  • 将 json 反序列化为键值对列表

    我有以下 json key key1 value val1 key key2 value val2 我如何将其反序列化为列表 数组NameValuePair
  • 更新 sqlite 中的查询

    活动代码 String MMS SELECT Name FROM UserData WHERE MessagesSent SELECT max MessagesSent FROM UserData db execSQL UPDATE Mai
  • 关于 MPI_Scatter 执行器及其发送缓冲区分配的问题

    我的第一个想法是MPI Scatter和发送缓冲区分配应该用于if proc id 0 子句 因为数据应该只分散一次 并且每个进程只需要发送缓冲区中的一部分数据 但是它无法正常工作 看来发送缓冲区分配和MPI Scatter在应用程序正常运