MPI 发送数组的数组

2024-01-06

好的,所以我尝试通过 MPI 发送这样的结构

struct BColumns {
        double **B;
        int offset;
};

如果我只是像这样对数据进行一些BS分配

    bSet.offset = myRank;
    bSet.B = (double **) calloc(2, sizeof(double *));
    bSet.B[0] = (double *) calloc(1, sizeof(double));
    bSet.B[1] = (double *) calloc(1, sizeof(double));

    bSet.B[0][0] = 1;
    bSet.B[1][0] = 2;


    if(myRank == 0){
            MPI_Send(&bSet,sizeof(struct BColumns), MPI_BYTE, 1, 1, MPI_COMM_WORLD);
    }else{
            MPI_Recv(&recvBuf, sizeof(struct BColumns), MPI_BYTE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status );
    }

我假设它不会很好地工作,因为如果我按原样发送这个结构,它只会发送 B 中的指针,并且该指针不会指向其他处理器上的任何内容,那么我将如何发送数据,例如这在 MPI 中。


正如 Suszterpatt 指出的那样,你确实想要分配你的块B一大块;无论如何,这可能对性能更好,但它确实是任何通信所必需的,因此您不必到处追逐指针。我认为以某种方式,您可能必须在不同的发送中执行此操作 - 发送大小信息,然后发送一个块中的数据 - 尽管您可能可以为每一个发送创建和删除不同的 MPI_Type_struct发送。但是对每个对象使用多次发送并不是很难:

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

typedef struct BColumns {
        double **B;
        int offset;
} bc;

double **alloc2d(int n, int m) {
    double *data = malloc(n*m*sizeof(double));
    double **array = malloc(n*sizeof(double *));
    for (int i=0; i<n; i++) {
        array[i] = &(data[i*m]);
    }
    return array;
}

void free2d(double **array) {
    free(array[0]);
    free(array);
}

int main(int argc, char **argv) {

    const int tag = 13;
    int size, rank;

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

    if (size < 2) {
        fprintf(stderr,"Requires at least two processes.\n");
        exit(-1);
    }

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (rank == 0) {
        int ncols=3, colsize=5;
        bc *send;

        send = malloc(sizeof(bc));
        send->offset = 1;
        send->B = alloc2d(ncols, colsize);
        for (int i=0; i<ncols; i++)
            for (int j=0; j<colsize; j++)
                send->B[i][j] = i*j;

        const int dest = 1;
        MPI_Send(&ncols,   1, MPI_INT, dest, tag, MPI_COMM_WORLD);
        MPI_Send(&colsize, 1, MPI_INT, dest, tag, MPI_COMM_WORLD);
        MPI_Send(&(send->offset), 1, MPI_INT, dest, tag, MPI_COMM_WORLD);
        MPI_Send(&(send->B[0][0]), ncols*colsize, MPI_DOUBLE, dest, tag,
                 MPI_COMM_WORLD);


        printf("Rank %d: sent structure B\n", rank);
        free2d(send->B);
        free(send);
    }

    if (rank == 1) {
        MPI_Status status;
        const int src=0;
        int rncols, rcolsize;
        bc *recv;

        MPI_Recv(&rncols,   1, MPI_INT, src, tag, MPI_COMM_WORLD, &status);
        MPI_Recv(&rcolsize, 1, MPI_INT, src, tag, MPI_COMM_WORLD, &status);
        printf("Rank %d: Received: rncols = %d rcolsize=%d\n", rank, rncols, rcolsize);

        recv = malloc(sizeof(bc));
        recv->B = alloc2d(rncols, rcolsize);

        MPI_Recv(&(recv->offset), 1, MPI_INT, src, tag, MPI_COMM_WORLD, &status);
        MPI_Recv(&(recv->B[0][0]), rncols*rcolsize, MPI_DOUBLE, src, tag,
                MPI_COMM_WORLD, &status);

        printf("Rank %d: Received: offset = %d\n", rank, recv->offset);
        for (int i=0; i<rncols; i++) {
            printf("%d:  Column %d/%d: ", rank, i, rncols);
            for (int j=0; j<rcolsize; j++)
                printf(" %lf ", recv->B[i][j]);
            printf("\n");
        }

        free2d(recv->B);
        free(recv);
    }

    MPI_Finalize();

    return 0;
}

然后运行它:

$ mpirun -np 3 ./bstruct
Rank 0: sent structure B
Rank 1: Received: rncols = 3 rcolsize=5
Rank 1: Received: offset = 1
1:  Column 0/3:  0.000000  0.000000  0.000000  0.000000  0.000000 
1:  Column 1/3:  0.000000  1.000000  2.000000  3.000000  4.000000 
1:  Column 2/3:  0.000000  2.000000  4.000000  6.000000  8.000000 

如果您想通过手动或使用 MPI 函数调用或数据类型来避免多次发送的延迟(并且如果您事先知道 B 数组的最大大小),则可以将该数据编组到一条消息中,但您仍然需要必须以类似的方式来做。

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

MPI 发送数组的数组 的相关文章

  • Windows 8中有没有特殊的API来挂载ISO文件?

    您可能知道 Windows 资源管理器允许将 ISO 文件装载到虚拟驱动器 有没有任何API可以用来做到这一点 本机函数调用AttachVirtualDisk https msdn microsoft com en us library w
  • 如何从更高级别启动用户级别的 Exe

    我希望一个进程始终在用户级别运行 当它由以管理员级别运行的安装程序 自定义 而不是 msi 启动时 或者当用户登录时 环顾四周 我不确定这是否可能 最简单的方法是有 2 个进程 一种是普通用户 它启动提升 管理进程 然后管理进程可以使用 I
  • 枚举 EMF 时丢失文本

    我在列举发票 emf http www mediafire com kdjwvvo7odyvwa6并将其复制到另一个但文本丢失了 令人惊讶的是 当我将其输出到窗口时 它绘制得非常完美 int CALLBACK EnhMetaFileProc
  • 如何通过实体键添加/删除与实体框架的多对多关系?

    I tried using Entities e new Entities EntityKey key new EntityKey Entities Users UserId 20 User user new User EntityKey
  • 确保 unsigned int/long 始终在 C# 中的检查上下文中执行

    有没有人觉得奇怪 uint 和 ulong 的默认上下文是未检查的 而不是检查的 因为它们旨在表示永远不能为负的值 因此 如果某些代码试图违反该约束 在我看来 自然且首选的行为是抛出异常 而不是返回最大值 这很容易使重要数据处于无效状态并且
  • .NET:EventHandler 竞争条件修复如何工作?

    以下模式用于在引发事件时避免竞争条件 以防另一个线程取消订阅 MyEvent 使其为空 class MyClass public event EventHandler MyEvent public void F EventHandler h
  • 如何在方法模板中使用模板类型的引用传递参数?

    我目前正在努力编译以下代码 首先是包含带有方法模板的类的头文件 ConfigurationContext h class ConfigurationContext public template
  • C 风格强制转换与内在强制转换

    假设我已经定义了 m256d x我想提取低 128 位 我会做 m128d xlow mm256 castpd256 pd128 x 然而 我最近看到有人这样做 m128d xlow m128d x 是否有用于演员的首选方法 为什么要用第一
  • 关于 FirstOrDefault 或 SingleOrDefault

    FirstOrDefault 或 SingleOrDefault 将返回什么类型的数据 假设我的查询返回 3 条记录 例如 empid ename salary 1 joy 1500 2 rob 4500 3 jen 6500 所以如果我们
  • 使用 OpenSSL 库在 C++ 中生成 SHA 哈希值

    如何使用以下命令生成 SHA1 或 SHA2 哈希值OpenSSL https openssl org图书馆 我搜索了谷歌 找不到任何函数或示例代码 从命令行来看 很简单 printf compute sha1 openssl sha1 您
  • 如何使用 Linq to Sql 修剪值?

    在数据库中 我有一个名为 联系人 的表 名字和其他此类字符串字段设计为使用 Char 数据类型 不是我的数据库设计 我的对象 Contact 映射到属性中的字符串类型 如果我想做一个简单的测试 通过 id 检索 Contact 对象 我会这
  • C++中的虚方法表存放在哪里?

    我想知道类对象 不是实例 而是类 如何存储在内存中 class A public int a virtual void f virtual A class B public A public int b void f final overr
  • 为什么这段代码不会产生编译错误?

    template
  • 如何在PropertyGrid中自定义绘制GridItem?

    我想以与所有者在 ListView 详细信息 和其他控件中绘制项目类似的方式在 PropertyGrid 中绘制属性值 如果将属性声明为 Color 类型 则其值将使用字符串描述旁边的颜色样本来绘制 如果属性是图像类型 则在字符串描述旁边绘
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • XSD、泛型和 C# 类的困境

    我有以下简单的 XSD 文件
  • 比较 C# 中的对象属性[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • 如何正确对齐 WPF GeometryGroup 中的路径?

    我正在使用一个GeometryGroup在圆的中心绘制一个符号 下面的示例显示了我在对此进行实验时的尝试之一 它具有从同一原点 32 32 出发的三条直线
  • 在 C# 中设置风扇速度

    我知道以前有人问过这个问题 但我似乎无法让它发挥作用 我已调用以下内容 using System Management using System Management Instrumentation using System Runtime
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm

随机推荐

  • 如何使用 zoneID 和 recordID 初始化 CKRecord?

    我目前正在构建一个同步解决方案Core Data记录到CloudKit 我需要帮助才能找出我想要做什么CKRecord是可行的 我检查了 Apple CloudKit 文档 进行了实验并搜索了网络 但没有找到我想要的答案 我想初始化 CKR
  • 如何在 Java 中检查某一天是在本周?

    有没有最简单的方法可以找到本周的任何一天 此函数返回 true 或 false 与给定日期是否在本周相关 您肯定想使用 Calendar 类 http docs oracle com javase 6 docs api java util
  • 即使有前缀,CSS 网格布局也无法在 IE11 中工作

    我正在为我的网格使用以下 HTML 标记 section class grid section
  • 如何在php中使用锚点将数组传递到另一个页面

    我必须使用以下方法将数组值从一个 php 页面传递到另一个 php 页面 a href href 这是我的编码 cluster是一个数组 echo td a href Click here to OFF a td in myebon php
  • .NET 框架是否提供解析 HTML 字符串的方法?

    知道我不能使用 HTMLAgilityPack 只能直接使用 NET 假设我有一个包含一些 HTML 的字符串 我需要以这种方式解析和编辑 通过 id 或标签查找层次结构中的特定控件 修改 最好是创建 这些找到的元素的属性 net 中有可用
  • 使用波形符分隔符将 MSAccess 表导出为 Unicode

    我想从MSAccess2003导出几个表的内容 这些表包含 unicode 日语字符 我想将它们存储为波浪号分隔的文本文件 我可以使用 文件 导出 手动执行此操作 并在 高级 对话框中选择波形符作为字段分隔符 选择 Unicode 作为代码
  • node.js 哈希字符串?

    我有一个想要散列的字符串 在 Node js 中生成哈希值的最简单方法是什么 哈希用于版本控制 而不是安全性 如果你只想对一个简单的字符串进行 md5 哈希 我发现这对我有用 var crypto require crypto var na
  • 仅针对特定元素的 JavaScript SelectionChange 事件

    我想实现一个 JavaScriptselectionchange特定事件div元素 所以如果用户从 DOM 中选择文本 我想显示一个荧光笔框 我已经为网络实现了这个onmouseup事件 但我一直在尝试为移动设备实现这一点 对于移动浏览器我
  • Scala 2.8 CanBuildFrom

    继我问的另一个问题之后 Scala 2 8 突破 https stackoverflow com questions 1715681 scala 2 8 breakout 我想更多地了解一下 Scala 方法TraversableLike
  • C 的 INI 文件解析器

    我需要在 C 中读 写 INI 文件 对我来说有点奇怪的是我找不到任何标准的方法来做到这一点 在 C 中处理 INI 文件的常用方法是什么 我更喜欢平台无关的和 Linux INI 文件解析器库 This link http blog br
  • 删除 SwiperJS 中用数组映射的幻灯片而不重置状态

    我已经为这个问题苦苦挣扎了很长一段时间 但一直无法弄清楚 在这里编写沙箱演示代码 https codesandbox io s swiper remove slides w4gy3 file src App js 我有一组渲染的幻灯片Swi
  • 浅克隆中的“嫁接”提交到底是什么?

    在 git 中进行浅克隆时 使用 depth选项 根提交被标记为grafted 谷歌搜索没有找到任何令人满意的文档 好像没有什么关系git 移植 https git wiki kernel org index php GraftPoint
  • jQuery 数据表行顺序

    dTable periods grid dataTable bProcessing false bPaginate false bDestroy true bFilter false aaData myArray 为什么行顺序混乱 我希望行
  • Google Docs API:文档资源 ID 是否会改变?

    构建一个类似网站的环境 其中所有链接都基于文档中的资源 ID 是否明智 文档 ID 过去是否发生过变化 将来是否会发生变化 上周 我们惊讶地发现一个集合中的某些文档 ID 似乎已更改 这可能吗 id 是条目的唯一 永久标识符 因此它永远不应
  • 使用代理时 Nginx 502 Bad Gateway 错误

    我有一个 Angular 构建和一个 Laravel 后端 提供在一台服务器上运行的 API 我已经在 nginx 中配置了它们 前端有一个到后端服务器的代理 后端在 url 上运行 示例是占位符 http api example com
  • 在react-router v4中使用React IndexRoute

    我正在通过在线教程自己学习 React 这是一个关于使用 React Router 的基本示例
  • SplFileObject 错误无法打开流:没有这样的文件或目录

    我正在尝试在 symfony2 中实现存折网络服务并遵循此存折捆绑 https github com eymengunay PassbookBundle我的控制器看起来像这样 if form gt isValid Create an eve
  • 审计跟踪和实施 SOX/HIPAA/等敏感数据的最佳实践

    我认为自己在应用程序设计方面相对熟练 但我从未接触过敏感数据 我一直想知道审计跟踪的最佳实践是什么以及应该如何实施它们 我现在不必这样做 但如果医疗公司要求我为他们做一些工作 能够自信地与他们交谈 那就太好了 假设我们有一个 学校 数据库
  • 在spring配置文件中设置资源

    我正在尝试在弹簧配置中配置推土机 当使用 xml 配置时 它会像
  • MPI 发送数组的数组

    好的 所以我尝试通过 MPI 发送这样的结构 struct BColumns double B int offset 如果我只是像这样对数据进行一些BS分配 bSet offset myRank bSet B double calloc 2