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

2023-12-30

我有一个巨大的矩阵,我将它分成一些子矩阵,然后对其进行一些计算。在这些计算之后,我必须将该矩阵写入一个文件中以进行后处理。是否可以将结果写入单个文本文件?我该怎么做? 例如我们有一个nxy 方向划分的 ny 矩阵(每个进程有一个 nx秩矩阵),我们希望将 nx*ny 矩阵写入单个文本文件中。


因此,将大量数据写入文本并不是一个好主意。它真的非常非常慢,它会生成不必要的大文件,而且处理起来很痛苦。大量数据应以二进制形式编写,只有人类的摘要数据应以文本形式编写。使计算机要处理的内容对计算机来说变得容易,并且只有您实际上要坐下来阅读的内容对您来说才容易处理(例如,文本)。

无论您要写入文本还是二进制,都可以使用 MPI-IO 将输出协调到文件以生成一个大文件。我们有一个关于该主题的小教程(使用 MPI-IO、HDF5 和 NetCDF)here https://support.scinet.utoronto.ca/wiki/images/a/aa/ParIO-HPCS2011.pdf。对于 MPI-IO,诀窍是定义一个类型(此处为子数组)来根据文件的全局布局来描述数据的本地布局,然后使用它作为“视图”写入文件。每个文件仅看到自己的视图,并且 MPI-IO 库协调输出,以便只要视图不重叠,所有内容都会作为一个大文件出现。

如果我们以二进制形式写出来,我们只需将 MPI_Write 指向我们的数据即可完成;由于我们使用的是文本,因此必须将数据转换为字符串。我们按照通常的方式定义数组,只不过它不是 MPI_FLOAT,而是一种新类型,即charspernum每个数字的字符数。

代码如下:

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

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

int main(int argc, char **argv) {
    int ierr, rank, size;
    MPI_Offset offset;
    MPI_File   file;
    MPI_Status status;
    MPI_Datatype num_as_string;
    MPI_Datatype localarray;
    const int nrows=10;
    const int ncols=10;
    float **data;
    char *const fmt="%8.3f ";
    char *const endfmt="%8.3f\n";
    int startrow, endrow, locnrows;

    const int charspernum=9;

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

    locnrows = nrows/size;
    startrow = rank * locnrows;
    endrow = startrow + locnrows - 1;
    if (rank == size-1) {
        endrow = nrows - 1;
        locnrows = endrow - startrow + 1;
    }

    /* allocate local data */
    data = alloc2d(locnrows, ncols);

    /* fill local data */
    for (int i=0; i<locnrows; i++) 
        for (int j=0; j<ncols; j++)
            data[i][j] = rank;

    /* each number is represented by charspernum chars */
    MPI_Type_contiguous(charspernum, MPI_CHAR, &num_as_string); 
    MPI_Type_commit(&num_as_string); 

    /* convert our data into txt */
    char *data_as_txt = malloc(locnrows*ncols*charspernum*sizeof(char));
    int count = 0;
    for (int i=0; i<locnrows; i++) {
        for (int j=0; j<ncols-1; j++) {
            sprintf(&data_as_txt[count*charspernum], fmt, data[i][j]);
            count++;
        }
        sprintf(&data_as_txt[count*charspernum], endfmt, data[i][ncols-1]);
        count++;
    }

    printf("%d: %s\n", rank, data_as_txt);

    /* create a type describing our piece of the array */
    int globalsizes[2] = {nrows, ncols};
    int localsizes [2] = {locnrows, ncols};
    int starts[2]      = {startrow, 0};
    int order          = MPI_ORDER_C;

    MPI_Type_create_subarray(2, globalsizes, localsizes, starts, order, num_as_string, &localarray);
    MPI_Type_commit(&localarray);

    /* open the file, and set the view */
    MPI_File_open(MPI_COMM_WORLD, "all-data.txt", 
                  MPI_MODE_CREATE|MPI_MODE_WRONLY,
                  MPI_INFO_NULL, &file);

    MPI_File_set_view(file, 0,  MPI_CHAR, localarray, 
                           "native", MPI_INFO_NULL);

    MPI_File_write_all(file, data_as_txt, locnrows*ncols, num_as_string, &status);
    MPI_File_close(&file);

    MPI_Type_free(&localarray);
    MPI_Type_free(&num_as_string);

    free(data[0]);
    free(data);

    MPI_Finalize();
    return 0;
}

运行给出:

$ mpicc -o matrixastxt matrixastxt.c  -std=c99
$ mpirun -np 4 ./matrixastxt
$ more all-data.txt 
   0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000
   0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000
   1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000
   1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000
   2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000
   2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000
   3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000
   3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000
   3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000
   3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 mpi 将矩阵写入单个 txt 文件 的相关文章

  • 将 SQL Server varBinary 数据转换为字符串 C#

    我需要帮助弄清楚如何转换来自SQL服务器表列设置为varBinary 最大 转换为字符串以便将其显示在标签中 这是在C 我正在使用数据读取器 我可以使用以下方式提取数据 var BinaryString reader 1 我知道该列包含之前
  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • 动态选择和更新 LINQ 结果集中的列值

    我有一个场景 其中存在 LINQ 结果集 我使用了以下查询 var stockDetails from d in db BloodBanks where d bbUserName Session username ToString sele
  • C++ 和序列化:有什么方法可以进行某种内省吗?

    我读过一些例子维基百科 http en wikipedia org wiki Type introspection C 2B 2B但我正在寻找一些现实生活中的例子 如何使用内省 为什么 它有助于编写干净的代码 以及代码本身 例如 有没有办法
  • WPF Dispatchertimer 延迟反应/冻结

    在我的 WPF 应用程序中 我使用 3 个不同的 DispatcherTimers 一种是用于显示当前时间 一种是每 5 秒运行一次数据库查询 第三个每 1 秒刷新一次自定义按钮的值 当我的程序运行时 有很多延迟 冻结 例如 时间开始正确计
  • 比较 LINQ to SQL 中的两个日期

    我有一个数据库 其中有一个名为会议的表 会议日期使用以下格式存储在此表中 May 2nd 2011 例如 格式为5 2 2011 我的要求是获取两个日期 例如 2011 年 4 月 25 日和 2011 年 5 月 2 日 之间的会议 并编
  • NHibernate IQueryable 集合作为 root 的属性

    我有一个根对象 它有一个集合属性 例如 I have a Shelf object that has Books Now public class Shelf public ICollection
  • boost::asio::io_service 是否保留处理程序的顺序?

    Does boost asio io service http www boost org doc libs release doc html boost asio reference io service html保证处理程序的调用顺序与
  • 从套接字读取 C HTTP

    我想知道如何判断是否已从套接字接收到所有数据 这是一个简单的网络代理 现在我正在处理请求部分 所以发送的内容应该以 r n r n 结尾 我不知道请求会持续多久 我在这里读过一些帖子 说我应该检查读取函数是否返回 0 但其他人说0只在客户端
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • 修改正在运行的可执行文件的资源内容

    All 我将应用程序设置存储在资源中 当我的程序首次加载时 我使用 WinAPI 读取指定的资源 然后我解析检索到的字节数据 这对我来说完美无缺 现在假设用户更改了我的应用程序中的设置 他 她检查复选框控件 我想将更新的设置保存到我的资源中
  • 如何使用 ProtoGen 从 proto 文件生成结构

    我们一直在使用 protobuf net ProtoGen 从 proto 文件生成 C cs 文件 我们希望代替类来生成结构 例如 DataContract public struct Entity1 ProtoMember 1 publ
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at
  • 生成范围 [min,max] 内的随机数 [重复]

    这个问题在这里已经有答案了 我正在使用 C 生成范围 min max 内的整数随机数 我在用 int random int int min int max return min rand max min 但我认为上面的代码适用于范围 min
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • “显式”关键字对返回值优化 (RVO) 有何影响?

    以下代码工作得很好 显示 RVO struct A A int cout lt lt A A n constructor A const A cout lt lt A A const A n copy constructor A foo r
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使
  • 如何使用 Ioc Unity 注入依赖属性

    我有以下课程 public interface IServiceA string MethodA1 public interface IServiceB string MethodB1 public class ServiceA IServ

随机推荐

  • 我可以重新解释 constexpr 函数的参数吗?

    我想编写一个在编译时求值的函数 它需要一个指向 4 字节数组的指针 并输出一个与该数组具有相同位模式的 int 所以我想出了 constexpr int f const char p return reinterpret cast
  • 在java中计算日期/时间差[重复]

    这个问题在这里已经有答案了 我想要计算2个日期之间的差异以小时 分钟 秒为单位 我的代码有一个小问题 String dateStart 11 03 14 09 29 58 String dateStop 11 03 14 09 33 43
  • 如何显示来自 PHP 的 JavaScript 警报?

    我不用 PHP 编写代码 但我有一个从网上下载的表单 它工作得很好 我想做的是在这里添加一些代码 可以启动 JS 脚本 简单的警报框 说 谢谢您的表单已提交 此 mailer php 文件收到表单后
  • 循环位 C

    我试图循环遍历 unsigned char 的位 但我不确定从哪里开始 最终 我将对这些位执行其他按位操作 例如 和 xor 等 可以通过多种方式循环位 当您移动值时 您可以执行破坏性循环 并测试初始位或最终位 具体取决于您想要枚举位的顺序
  • Airflow - 无法在 Kubernetes Pod Operator 任务中对资源使用 jinja 模板

    Airflow 无法在 Kubernetes Pod Operator 任务中对资源使用 jinja 模板 能够使用 jinja 模板作为环境变量 镜像 但无法使用资源来指定 CPU 和内存 请求和限制 For apache airflow
  • 从 shell 脚本 cron 调用 python 脚本

    我有一个 shell 脚本 cron 它从同一目录调用 python 脚本 但是当这个 cron 执行时 我没有从 python 脚本中获得预期的输出 当我手动执行它时 我的 python 脚本的输出是预期的 我提供了 python 脚本路
  • 有更好的普通 JS 方法来查找嵌套对象中的任何错误值吗?

    如果我有一个对象 例如 const obj field1 subfield1 true subfield2 true field2 subfield3 true field3 subfield4 false subfield5 true 然
  • Node.js SSL 服务器冻结,CPU 高,未崩溃但无连接

    我希望任何人都可以帮助我解决这个问题 在我们公司 我们正在设置一个连接到 Java Push 服务器的 Node js 服务器 我使用 https 模块而不是 http 和 SLL 证书 节点和客户端之间的连接是通过socket io在服务
  • 如何在Python中按行总和对矩阵进行升序排序?

    回答了完全相同的问题here https stackoverflow com questions 18721094 quick way to sort an array with respect to row sum in matlab但在
  • Drupal 6 中特定节点的自定义模板?

    我知道有大量不同的自定义模板文件 例如 page tpl php 和 node tpl php 等 但是有没有办法为特定节点 ID 制作自定义模板 这在node 3 tpl php 中不起作用 但是有没有办法做到这一点 更新代码 funct
  • 使用 Python 交换字符串中每对相邻字符的最简单方法是什么?

    我想交换字符串中的每对字符 2143 变成 1234 badcfe 变成 abcdef 我怎样才能在Python中做到这一点 单行 gt gt gt s badcfe gt gt gt join s x x 2 1 for x in ran
  • Flutter for 循环生成小部件列表

    我有这样的代码 但我希望它迭代整数数组以显示动态数量的子项 return Container child Column children
  • 您需要处置对象并将它们设置为 null 吗?

    您是否需要处理对象并将它们设置为 null 或者当它们超出范围时垃圾收集器会清理它们吗 当对象不再被使用并且垃圾收集器认为合适时 对象将被清理 有时 您可能需要设置一个对象null为了使其超出范围 例如您不再需要其值的静态字段 但总的来说通
  • C++ 自动代码风格指南测试 [重复]

    这个问题在这里已经有答案了 可能的重复 是否有一个免费工具可以根据一组编码标准检查 C C 源代码 https stackoverflow com questions 93260 a free tool to check c c sourc
  • 如何解决“数据读取器中没有查询”错误?

    考虑以下代码 answer today AddDays 356 Dim command1 As New MySqlCommand Insert into UserScanner Username Password Address Conta
  • 新的 ggplot2 和自定义箱线图代码

    我一直在使用 Kohnke 代码的修改版本这个帖子 https stackoverflow com questions 3010403 jitter if multiple outliers in ggplot2 boxplot我为 out
  • 如何在php中获取重复的多维数组

    我有一个多维数组 Array 0 gt Array a gt 1 b gt 2 c gt 3 d gt 4 1 gt Array a gt 1 b gt 5 c gt 3 d gt 4 2 gt Array a gt 1 b gt 2 c
  • 从远程服务器获取 ios 应用程序的时间

    我想知道我的 iOS 应用程序如何从远程服务器 NTP 其他 获取日期时间 而不是使用本地 iPad 日期时间 并在 NSDate 上对其进行转换 Thanks https github com jbenet ios ntp https g
  • 如何在 R 中将整个数据框附加到 CSV

    我已经可以使用以下命令将一行附加到 CSVcat这使得这变得非常容易 cat my row 1 2 3 4 mydf csv sep n append TRUE 但是据我所知 您不能将 cat 与整个数据框 多列和行 一起使用 我这样做是因
  • 使用 mpi 将矩阵写入单个 txt 文件

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