MPI代码中的可变内存分配

时间:2011-11-08 22:11:55

标签: mpi

在运行MPI代码的集群中,是否是发送到所有节点的所有声明变量的副本,以便所有节点都可以在本地访问它,而不是执行远程内存访问?

1 个答案:

答案 0 :(得分:1)

不,MPI本身不能一次性为你做这件事。

每个MPI进程都有自己的内存状态,并且任何MPI进程中的每个值都可能不同。

发送/接收数据的唯一方法是使用MPI的显式调用,如Send或Recv。您可以将大部分数据打包到某个内存空间,并将此内存区域发送到每个MPI进程,但此区域不包含“每个声明的变量”,只有变量手动放入此区域。

更新

每个节点都运行该程序的副本。每个副本都会根据需要初始化变量(它可以是相同的初始化,也可以是基于MPI进程号的个体,称为Rank;来自MPI_Comm_Rank函数)。所以每个变量都存在于N个副本中;每个MPI流程一套。每个进程都看到变量,但只看到它拥有的集合。变量值自动未同步。

因此,程序员的任务是同步节点之间的变量值(mpi进程)。 例如。这是用于计算Pi的小型MPI程序:

http://www.mcs.anl.gov/research/projects/mpi/usingmpi/examples/simplempi/cpi_c.htm

它会将“n”变量的值从第一个进程发送到所有其他进程(MPI_Bcast);并且每个进程在计算后都会将自己的“mypi”发送到第一个进程的“pi”变量中(通过MPI_Reduce函数添加单个值)。

只有第一个进程才能从用户读取N(通过scanf),并且该代码根据进程的级别有条件地执行;其他进程必须从第一个进程获得N,因为它们没有直接从用户那里读取它。

Update2(对不起,迟到的答案): 这是MPI_Bcast的语法。程序员应该将变量的地址赋予此函数。每个MPI进程都会给出自己的'n'变量的地址(它可以是不同的)。 MPI_Bcast将

  • 检查当前进程的等级并与其他参数进行比较,即“Broadcaster”的等级。
  • 如果当前进程是广播者,MPI_Bcast将读取值,放在存储器中的给定地址(它将读取“Broadcaster”上'n'变量的值);然后价值将通过网络发送。
  • 否则,如果当前进程不是广播公司,则它是“接收方”。接收方的MPI_Bcast将从“Broadcaster”(使用MPI Library内部,通过网络)获取值,并将值存储在给定地址的当前进程的内存中。

因此,该地址被赋予该函数,因为在某些节点上该函数将写入该变量。只有价值通过网络发送。