当前位置: 首页 > 知识库问答 >
问题:

MPI错误:(分割错误: 11)

昌勇锐
2023-03-14

我在这里看到过许多类似的线程,但我的问题是,我的程序实际上是在不同的设置下运行的。

例如:当我的矩阵是1024x1024

对于2个核心:错误11

对于4,8,16等工作正常。

矩阵2048x2048

对于任何核心设置:错误11。

我不明白为什么会发生这种情况,每个过程都需要一个2048/(总过程)X 2028矩阵来计算。它应该工作正常。

以下是我声明矩阵的方式:

int temp[wp][hp];

接收:

rc = MPI_Recv(&temp[0][0], wp*hp, MPI_INT, i, tag, MPI_COMM_WORLD, &status);

和发送:

 rc = MPI_Send(&temp[0][0], wp*hp, MPI_INT, 0, tag, MPI_COMM_WORLD);

我不明白,它应该起作用了。你认为这可能是内存问题,与指针无关吗?

共有3个答案

终洛华
2023-03-14

所以这些问题是:

1) 正如@PaulMcKenzie和@Alex所指出的,我必须动态分配内存。现在的问题是如果我使用

rc = MPI_Send(temp, wp*hp, MPI_INT, 0, tag, MPI_COMM_WORLD);

rc = MPI_Recv(temp, wp*hp, MPI_INT, i, tag, MPI_COMM_WORLD, &status);

正如亚历克斯所说,我的程序会因为某种原因崩溃。所以我最初的

2) 第二个问题是,我使用fwrite保存这个数组,但是当你有动态数组时,你需要这样做:

for (int i = 0; i < w; i++){
for (int j = 0; j < h; j++){
    fwrite(&im[i][j], sizeof(int), 1, yourfilename);
}
} 

为大家干杯

姜磊
2023-03-14

给出的答案基本上是问题的概要——您很可能会用尽堆栈空间来存储数组,从而耗尽为堆栈保留的内存。

因此,解决方案是动态创建数组。

以下是动态创建二维阵列的示例:

#include <stdlib.h>
//...
int** create2DArray(unsigned nrows, unsigned ncols)
{
   unsigned i;
   int** ptr = malloc(nrows * sizeof(int*));  // allocate pointers to rows
   if ( ptr != NULL )
   { 
       int* pool = malloc(nrows * ncols * sizeof(int)); // allocate pool of memory
       if ( pool != NULL )
       {
           for (i = 0; i < nrows; ++i, pool += ncols )
               ptr[i] = pool;  // point the row pointers into the pool
       }
       else
       { 
          free(ptr);  
          ptr = NULL;
       }
   }
   return ptr;
}

void delete2DArray(int** arr)
{
   free(arr[0]);  // remove the pool
   free(arr);     // remove the pointers
}

int main()
{ 
   int **temp = create2DArray(2048, 2048); 
   if ( temp != NULL )
   {
       temp[0][0] = 10;  // for example you can use it like a 2D array
       delete2DArray(temp);  // free the memory
   }
}

这将在本质上创建一个连续的2D数组,类似于您试图使用int temp[2048][2048]创建的数组,但这一次,内存是从堆而不是堆栈中获得的。

请注意,您可以使用[][]语法,就像二维数组一样。

我不会详细介绍它是如何工作的,但是它足够简单,可以遵循逻辑。

穆建华
2023-03-14

我会用malloc创建数组

int *temp =(int*)malloc(wp * hp * sizeof(int));

然后我会将其他行更改为

rc = MPI_Recv(temp, wp*hp, MPI_INT, i, tag, MPI_COMM_WORLD, &status);

rc = MPI_Send(temp, wp*hp, MPI_INT, 0, tag, MPI_COMM_WORLD);

当我完成数组时,我释放它。

free(temp)

就像一位评论者已经说过的,以你的方式分配数组是不合法的。

编辑:

如果要访问二维数组,请使用以下模式:

temp[rowToAccess * numberOfColumns + columnToAcess]
 类似资料:
  • 问题内容: 我陷入了一个似乎无法解决的问题。拆分时,我应该能够获取 ID,名称,并 通过设置 row [0],row [1],row [2]进行检查 。奇怪的是,只有row [0](id)似乎有效。 名称,检查 给我一个错误。有人可以进一步帮助我吗? 数据示例: 码: 错误信息: 解决了 似乎文件末尾的值(问号)不正确。删除此行时。我的代码正常工作(没有Patter.quote)。谢谢大家的快速答

  • 我的C++代码如下所示,问题是它输出的是“=======”,但之后却说“分段错误”。我真的不明白这个分割错误。有人能告诉我代码的哪一部分错了吗?

  • 如何解决composer中的分段错误?安装后会发生这种情况 /c/ProgramData/ComposerSetup/bin/composer:第18行:1024分段错误php"${dir}/composer.phar"$*

  • 根据其他建议,取消引用可能会出现问题,但我在调用max_element函数时甚至在取消引用之前就出现了分段错误。 最小可复制示例:

  • 功能介绍 获取错误分析报告数据,包括表格详情数据与趋势数据,所获取数据与 https://mtj.baidu.com 中报告数据一致 接口 https://openapi.baidu.com/rest/2.0/mtj/svc/app/getDataByKey 此处仅列本接口特有参数,公共参数请参考报告级API说明 获取错误概况表格数据 参数名 参数类型 是否必须 描述 method string

  • 错误分析 一、错误概况,一目了然 错误概况是以错误类型为维度的分析报表,让开发者能够一目了然地掌握自己应用的错误概要信息。基础指标包括:错误次数(日均)、影响用户数(日均)、错误率、影响用户占比。并且通过趋势图展示四个指标的分日趋势变化。 通常来讲,应用的某一次具体的错误堆栈信息称作“错误详情”,但是很多错误详情拥有相同的摘要信息(通常为堆栈信息的前三句),而不同的错误摘要同样可以聚合成同一个错误