带动态分配的 MPI 矩阵乘法:段。过错

2023-12-07

我正在 OpenMP 中制作矩阵乘法程序,但收到以下错误消息:

[Mecha Liberta:12337] *** Process received signal ***
[Mecha Liberta:12337] Signal: Segmentation fault (11)
[Mecha Liberta:12337] Signal code: Address not mapped (1)
[Mecha Liberta:12337] Failing at address: 0xbfe4f000
--------------------------------------------------------------------------
mpirun noticed that process rank 1 with PID 12337 on node Mecha Liberta exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------

这就是我定义矩阵的方式:

  int **a, **b, **r;

  a = (int **)calloc(l,sizeof(int));

  b = (int **)calloc(l,sizeof(int));

  r = (int **)calloc(l,sizeof(int));

  for (i = 0; i < l; i++)
      a[i] = (int *)calloc(c,sizeof(int));

  for (i = 0; i < l; i++)
      b[i] = (int *)calloc(c,sizeof(int));      

   for (i = 0; i < l; i++)
      r[i] = (int *)calloc(c,sizeof(int)); 

这是我的发送/接收(我很确定我的问题应该在这里):

  MPI_Send(&sent, 1, MPI_INT, dest, tag, MPI_COMM_WORLD); 
  MPI_Send(&lines, 1, MPI_INT, dest, tag, MPI_COMM_WORLD);   
  MPI_Send(&(a[sent][0]), lines*NCA, MPI_INT, dest, tag, MPI_COMM_WORLD); 
  MPI_Send(&b, NCA*NCB, MPI_INT, dest, tag, MPI_COMM_WORLD);

and:

MPI_Recv(&sent, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);  
MPI_Recv(&lines, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&a, lines*NCA, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&b, NCA*NCB, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); 

谁能看出问题出在哪里吗?


这是 C 语言、多维数组和 MPI 的常见问题。

在这一行中,说:

MPI_Send(&b, NCA*NCB, MPI_INT, dest, tag, MPI_COMM_WORLD);

您告诉 MPI 发送从 b 开始的 NCAxNCB 整数到dest,MPI_COMM_WORLD带标签tag. But, b 不是指向 NCAxNCB 整数的指针;它是一个指向 NCA 的指针,指向 NCB 整数。

所以你想要做的是确保你的数组是连续的(无论如何可能对性能更好),使用如下所示:

int **alloc_2d_int(int rows, int cols) {
    int *data = (int *)malloc(rows*cols*sizeof(int));
    int **array= (int **)malloc(rows*sizeof(int*));
    for (int i=0; i<rows; i++)
        array[i] = &(data[cols*i]);

    return array;
}

  /* .... */

  int **a, **b, **r;

  a = alloc_2d_int(l, c);
  b = alloc_2d_int(l, c);
  r = alloc_2d_int(l, c);

and then

  MPI_Send(&sent, 1, MPI_INT, dest, tag, MPI_COMM_WORLD); 
  MPI_Send(&lines, 1, MPI_INT, dest, tag, MPI_COMM_WORLD);  
  MPI_Send(&(a[sent][0]), lines*NCA, MPI_INT, dest, tag, MPI_COMM_WORLD); 
  MPI_Send(&(b[0][0]), NCA*NCB, MPI_INT, dest, tag, MPI_COMM_WORLD);

MPI_Recv(&sent, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);  
MPI_Recv(&lines, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&(a[0][0]), lines*NCA, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&(b[0][0]), NCA*NCB, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); 

应该按预期工作更多。

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

带动态分配的 MPI 矩阵乘法:段。过错 的相关文章

随机推荐

  • 如何使用 PHP 来使用 JavaScript?

    设想 我使用创建了一个过滤IF ELSE当用户单击 BOX A 和 BOX B 然后假设 BOX A 已满 在用户点击 保存按钮 后 将显示一条确认消息 说明 您选择的盒子已经满了 您想保存其他物品吗 这是我的代码
  • 如何在 Powershell 中同时对多个服务器运行命令

    我正在寻找一种方法来同时重新启动多个服务器上的三个服务 我知道如何使用循环针对服务器列表重新启动服务 但由于我有许多服务器 因此需要很长时间才能等待每台服务器上的每个服务按顺序重新启动 有没有办法立即向所有服务器发送重新启动服务命令 而不是
  • Python:找出本地时区

    我想将日志文件中的 UTC 时间戳与本地时间戳进行比较 创建本地时datetime对象 我使用类似的东西 gt gt gt local time datetime datetime 2010 4 27 12 0 0 0 tzinfo pyt
  • 异步启动长时间运行的进程

    在我们的 Web 应用程序中 用户可以进行需要更新大量数据库表的更改 所有这些的加载时间最长可达 30 秒 我不希望用户在导航到另一个页面之前等待该操作完成 我已将长时间运行的代码放在自己的页面上 例如 updateinfo aspx 并尝
  • 在 .net 4.0 中使用实体框架与 Oracle 数据库 - 可能吗?

    我正在构建一个针对 Net 4 0 的应用程序 目前不能更高 我需要访问 Oracle Db 11g 并且我想使用实体框架 为了能够做到这一点 我知道我必须使用 Oracle 托管数据访问 Oracle ManagedDataAccess
  • “参数无效。”使用保存位图时

    我正在尝试以指定的编码质量保存位图 jpg 格式 但是 在调用保存方法时出现异常 参数无效 如果我省略 bmp save 中的最后两个参数 它就可以正常工作 EncoderParameters eps new EncoderParamete
  • 易失性、互锁性、锁定性

    假设一个类有一个public int counter由多个线程访问的字段 这int仅递增或递减 要增加此字段 应使用哪种方法 为什么 lock this locker this counter Interlocked Increment r
  • 使文本位于图像上的一行上方

    我正在开发一个项目 尝试在所有浏览器尺寸的图像上的一行上方添加文本 当您看到下面的 codpen 链接时 这一点会更清楚 我现在面临的问题是 一旦我将顶部值设置到正确的位置并更改浏览器宽度 文本就不再位于该行上方 text position
  • 每台服务器的套接字连接的实际/硬限制是多少

    我有许多客户端设备打开由 Windows 2008 R2 服务器上运行的服务公开的套接字连接 我想知道并发客户端连接数的硬限制是什么 根据本文 一个硬限制是 曾经 16 777 214 实际限制还取决于您的应用程序 例如 如果您为每个连接创
  • java.lang.IllegalStateException:使用 Auth.GOOGLE_SIGN_IN_API 时不得在 GoogleApiClient.Builder 中设置范围

    我正在使用带有身份验证 api 的驱动器 api 我需要先登录谷歌帐户 然后将文件上传到驱动器 问题是 当我仅使用未经身份验证的驱动器 api 时 显示无法登录 我首先使用 GoogleSignInOptions gso new Googl
  • 具有多个成员的高效运算符<

    假设一个类有多个与对象顺序相关的成员 例如 A T1 x T2 y 标准执行情况operator lt 我知道是 bool A operator lt const A a return x lt a x x a x y lt a y 但这对
  • 如何在 Windows 中使用 pyspark 启动 Spark Shell?

    我是 Spark 的初学者 并尝试按照此处的说明进行操作 了解如何使用 cmd 从 Python 初始化 Spark shell http spark apache org docs latest quick start html 但是当我
  • 在 IntelliJ 或 Android Studio 中使用 HTTP 作为默认值

    我知道这可能看起来像一个奇怪的请求 这可能有助于解释为什么谷歌研究没有帮助我找到答案 但由于一些防火墙问题 通过 HTTPS 连接到外部资源需要很长时间或完全超时 目前我的依赖项如下所示 dependencies compile fileT
  • IE9 中的 SVG 缩放问题

    在 IE9 中使用小 svg 时遇到问题 它在右侧被切断 不居中 Supposed to be a X My SVG
  • 安全规则 - 可以读取的数据列表?

    因此 我的应用程序具有在许多用户之间共享的 对话 对话 有很多 用户 我可以在特定对话中使用模拟器让作者获得 read 授权 但我不确定如何在以用户身份登录时获取对话列表 我无法使用 on child added 在 对话 上 因为 对话
  • 如何在 android 中打开 SQLite 数据库?

    如果我使用另一个应用程序而不是通过 android 运行时创建数据库 假设使用 SQLite Manager firefox 扩展 那么我如何在我的 android 应用程序中使用该数据库 生成的 Sqlite 文件 由于 SQLite 是
  • 如何使用 Google 的 Gson API 正确反序列化 JSON?

    简而言之 这是我要在 JAVA 中解析的 JSON 对象的草图 object1 item1 String Array Object item2 lt gt more items object2 lt gt more objects 这些是P
  • 当我尝试从中调用 Java 方法时,Matlab 锁定 jar 文件

    我正在用 Java 开发一个库 需要在 Matlab 中使用它 Java 和 Matlab 代码都在不断开发中 因此 每当我重建 Java 代码并创建新的 jar 文件时 我都需要在 Matlab 代码中重新加载它并在那里使用新的 jar
  • 何时使用 function() 、 function 或 () => function(callback)

    我一直在寻找一个好的解释 所以对我来说一切都很清楚 例子
  • 带动态分配的 MPI 矩阵乘法:段。过错

    我正在 OpenMP 中制作矩阵乘法程序 但收到以下错误消息 Mecha Liberta 12337 Process received signal Mecha Liberta 12337 Signal Segmentation fault