我在这里看到过许多类似的线程,但我的问题是,我的程序实际上是在不同的设置下运行的。
例如:当我的矩阵是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);
我不明白,它应该起作用了。你认为这可能是内存问题,与指针无关吗?
所以这些问题是:
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);
}
}
为大家干杯
给出的答案基本上是问题的概要——您很可能会用尽堆栈空间来存储数组,从而耗尽为堆栈保留的内存。
因此,解决方案是动态创建数组。
以下是动态创建二维阵列的示例:
#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]
创建的数组,但这一次,内存是从堆而不是堆栈中获得的。
请注意,您可以使用[][]
语法,就像二维数组一样。
我不会详细介绍它是如何工作的,但是它足够简单,可以遵循逻辑。
我会用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
错误分析 一、错误概况,一目了然 错误概况是以错误类型为维度的分析报表,让开发者能够一目了然地掌握自己应用的错误概要信息。基础指标包括:错误次数(日均)、影响用户数(日均)、错误率、影响用户占比。并且通过趋势图展示四个指标的分日趋势变化。 通常来讲,应用的某一次具体的错误堆栈信息称作“错误详情”,但是很多错误详情拥有相同的摘要信息(通常为堆栈信息的前三句),而不同的错误摘要同样可以聚合成同一个错误