2016-02-13 79 views
1

我在理解工作如何共享内存时遇到了一些问题。有一个主流程和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

2评论:1 /'shared_mem'对于一个根本不共享的数组来说是一个非常糟糕的名字,2 /你声明它是'int *'但用它作为'double',所以这将导致问题... – Gilles

+0

你能否提供[mcve](http://stackoverflow.com/help/mcve)?请解决数据类型问题。 – Zulan

回答

0

你可以尝试decleare double *shared_mem = calloc(numb_of_parts, sizeof(double));?目前,它被删除为int*,因此shared_mem[i]shared_mem+i可能不是预期的结果,因为int的大小可能不同于double的大小。

此外,还有MPI功能可显著帮助您:

而@Gilles是正确的:缓冲区mem_shared不在进程之间共享。实际上,每个进程分配自己的缓冲区mem_shared,这就是为什么需要消息传递的原因。

以下是基于代码片段的工作代码。我必须为根进程添加接收参数。它缺少什么?编译mpicc main.c -o main -sdt=c99并运行mpirun -np 4 main

/* -*- Mode: C; c-basic-offset:4 ; -*- */ 
/* 
* (C) 2001 by Argonne National Laboratory. 
*  See COPYRIGHT in top-level directory. 
*/ 

/* This is an interactive version of cpi */ 
#include <mpi.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int main(int argc,char *argv[]) 
{ 

    int numb_of_parts, rank; 
    MPI_Init(&argc,&argv); 
    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
    MPI_Comm_size(MPI_COMM_WORLD,&numb_of_parts);  


    int *mem = calloc(numb_of_parts, sizeof(double)); 
    if(rank == 0) 
    { 
     mem[0]=0; 
     for(int i = 1; i < numb_of_parts; i++) 
     { 
      mem[i]=i; 
      MPI_Send(mem+i, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); 


     } 
     for(int i = 1; i < numb_of_parts; i++) 
     { 
      MPI_Recv(mem+i, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     } 

    }else{ 
     MPI_Recv(mem+rank, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     /* do smth with shared_mem[i] */ 
     mem[rank]=mem[rank]*2; 
     MPI_Send(mem+rank, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); 
    } 



    MPI_Barrier(MPI_COMM_WORLD); 
    double sum=0; 
    if(rank == 0) 
    { 
     for(int i = 0; i < numb_of_parts; i++) 
     { 
      sum += mem[i]; 
     } 

     printf("sum is %g\n",sum); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

的问题可以在/* do smth with shared_mem[i] */ ...如果它什么都不做,或者如果它不修改mem[rank]

+0

我有固定的类型,但仍然有同样的问题:( – NikitaRock

+0

我这么不留神,我忘了在主进程中recive消息,而且主进程中的c没有任何变化,谢谢! – NikitaRock