【发布时间】:2016-02-13 15:38:00
【问题描述】:
我在理解共享内存的工作原理方面存在一些问题。有一个主要过程和N个其他过程。主进程向其他进程发送数据,我是这样弄的(数据放在shared_mem[i] for i进程):
int *shared_mem = calloc(numb_of_parts, sizeof(double));
if(world_rank == 0)
{
for(int i = 1; i < numb_of_parts; i++)
{
MPI_Send(shared_mem+i, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
}
}
接下来的进程计算一些东西并在同一个单元格中写入数据:
{
MPI_Recv(shared_mem+world_rank, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
/* do smth with shared_mem[i] */
MPI_Send(shared_mem+world_rank, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
}
然后我等待所有进程并想计算主进程中所有单元格(带有新数据)的总和:
PI_Barrier(MPI_COMM_WORLD);
if(world_rank == 0)
{
for(int i = 0; i < numb_of_parts; i++)
{
sum += shared_mem[i];
}
}
但结果我总是得到以前数据的总和,即在主进程数组中没有改变。怎么了?
【问题讨论】:
-
2 条评论:1/
shared_mem对于一个根本不共享的数组来说是一个非常糟糕的名称,2/ 你声明它int*但将它用作double所以这会导致问题... -
能否提供mcve。请已修复数据类型问题。