我在理解工作如何共享内存时遇到了一些问题。有一个主流程和N个其他流程。主进程发送数据到其他,我使它像这样(数据放置在shared_mem [I]对于i处理):MPI库和内存
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];
}
}
但作为一个结果,我总是得到,即在主处理阵列以前的数据总和H没有改变。哪里不对?
2评论:1 /'shared_mem'对于一个根本不共享的数组来说是一个非常糟糕的名字,2 /你声明它是'int *'但用它作为'double',所以这将导致问题... – Gilles
你能否提供[mcve](http://stackoverflow.com/help/mcve)?请解决数据类型问题。 – Zulan