在运行MPI代码的集群中,是否是发送到所有节点的所有声明变量的副本,以便所有节点都可以在本地访问它,而不是执行远程内存访问?
答案 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将
因此,该地址被赋予该函数,因为在某些节点上该函数将写入该变量。只有价值通过网络发送。