Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MPI_聚集二维阵列_C_Parallel Processing_Mpi_Send_Distributed Computing - Fatal编程技术网

C MPI_聚集二维阵列

C MPI_聚集二维阵列,c,parallel-processing,mpi,send,distributed-computing,C,Parallel Processing,Mpi,Send,Distributed Computing,N是4,N\u glob也是4。它正好是同样大小的p为4 下面是代码的一小部分: float **global_grid; float **gridPtr; lengthSubN = N/pSqrt; subN = lengthSubN + 2; grid = allocate2D(grid, subN, subN); .. MPI_Type_contiguous(lengthSubN, MPI_FLOAT, &rowType); MPI_Type_commit(&rowTyp

N
是4,
N\u glob
也是4。它正好是同样大小的<代码>p为4

下面是代码的一小部分:

float **global_grid;
float **gridPtr; 
lengthSubN = N/pSqrt;
subN = lengthSubN + 2;
grid = allocate2D(grid, subN, subN);
..
MPI_Type_contiguous(lengthSubN, MPI_FLOAT, &rowType);
MPI_Type_commit(&rowType);
..
gridPtr = grid;
..
MPI_Barrier(MPI_COMM_WORLD);
if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Gather(&(gridPtr[0][0]), 1, rowType,
           &(global_grid[0][0]), 1, rowType, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if(id == 0)
    print(global_grid, N_glob, N_glob);
我有
p
子矩阵,我试图在根进程中收集它们,全局矩阵在那里等待它们。但是,它只会抛出一个错误,有什么想法吗

我收到seg故障:

某个应用程序进程的错误终止 PID 29058在linux16下运行 出境代码:139 应用程序以退出字符串终止:分段错误(信号11)


编辑:

我发现了这个问题,并将
global_grid
初始化为NULL,但没有成功。但是,如果我这样做:

//if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
//}
然后一切都开始了。但是,全局矩阵不应该只存在于根过程中吗


编辑2:

如果我这样做:

if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
} else {
    global_grid = NULL;
}
然后它会在这里崩溃:

MPI_Gather(&gridPtr[0][0], 1, rowType,
                global_grid[0], 1, rowType, 0, MPI_COMM_WORLD);

变量
global_grid
未在秩0以外的秩中初始化。因此,这个方程

&(global_grid[0][0])
或者这个:

global_grid[0]
导致分段错误,因为它试图访问全局网格的第一个元素

只需对MPI_Gather进行两次调用,一次调用秩0,另一次调用其他值:

if(id == 0) {
    MPI_Gather(gridPtr[0], 1, rowType, global_grid[0], 1, rowType, 0, MPI_COMM_WORLD);
} else {
    MPI_Gather(gridPtr[0], 1, rowType, NULL, 0, rowType, 0, MPI_COMM_WORLD);
}

变量
global_grid
未在秩0以外的秩中初始化。因此,这个方程

&(global_grid[0][0])
或者这个:

global_grid[0]
导致分段错误,因为它试图访问全局网格的第一个元素

只需对MPI_Gather进行两次调用,一次调用秩0,另一次调用其他值:

if(id == 0) {
    MPI_Gather(gridPtr[0], 1, rowType, global_grid[0], 1, rowType, 0, MPI_COMM_WORLD);
} else {
    MPI_Gather(gridPtr[0], 1, rowType, NULL, 0, rowType, 0, MPI_COMM_WORLD);
}

你试过使用调试器吗?嗯@KLibby我正在更新。你的代码中没有2D数组。指针不是数组,反之亦然。不要被索引运算符误导,因为它对指针和数组重载。有不同的语义。指向真正2D数组(即矩阵)的指针看起来像
int(*ip)[4]
(指向数组第一行的指针)或
int(*p2da)[4][5]
(指向2D数组的真正指针,但使用起来不太直观)。您应该删除EDIT_2、_3和_4,因为指针算法已中断
&(gridPtr[0])
以及
&(global_grid[0])
返回一个指针,指向分配在
a=malloc(M*sizeof(float*))的第一行指针
分配2d
中。这不是数据空间。您应该尝试
gridPtr[0]
global\u grid[0]
,因为它们实际上指向数据空间中的第一行。您尝试过使用调试器吗?Hmm@KLibby我正在更新。您的代码中没有2D数组。指针不是数组,反之亦然。不要被索引运算符误导,因为它对指针和数组重载。有不同的语义。指向真正2D数组(即矩阵)的指针看起来像
int(*ip)[4]
(指向数组第一行的指针)或
int(*p2da)[4][5]
(指向2D数组的真正指针,但使用起来不太直观)。您应该删除EDIT_2、_3和_4,因为指针算法已中断
&(gridPtr[0])
以及
&(global_grid[0])
返回一个指针,指向分配在
a=malloc(M*sizeof(float*))的第一行指针
分配2d
中。这不是数据空间。您应该尝试
gridPtr[0]
global\u grid[0]
,因为它们实际上指向数据空间中的第一行。您是对的,谢谢!那么我的
MPI\u-Gather()
应该是什么样子呢?@gsamaras添加了对
MPI\u-Gather
的调用。马丁谢谢,这就成功了。现在我必须将我需要的数据发送到全局矩阵,因此我需要一些解释。只有第一次MPI_聚集起作用,而在else情况下的一次不起作用?经过一点试验,似乎没有。我还问了一个问题:你说得对,马丁,谢谢!那么我的
MPI\u-Gather()
应该是什么样子呢?@gsamaras添加了对
MPI\u-Gather
的调用。马丁谢谢,这就成功了。现在我必须将我需要的数据发送到全局矩阵,因此我需要一些解释。只有第一次MPI_聚集起作用,而在else情况下的一次不起作用?经过一点试验,似乎没有。我还提出了一个后续问题: