回 帖 发 新 帖 刷新版面

主题:MPI的进程标识是全局变量吗

主程序中调用了语句 MPI_COMM_RANK 来得到每一个进程的进程标识,然后主程序调用一个子程序,这个子程序里面也要用到进程标识,那子程序还用再调用一次MPI_COMM_RANK 吗?
    开始的时候我没在子程序中也写上 MPI_COMM_RANK 语句,也没在子程序开始的时候 use MPI ,程序运行出错;然后在开始的时候加上use MPI,但不写 MPI_COMM_RANK,程序运行正确;MPI_COMM_RANK 和 use MPI都加上还没试,估计结果应该是对的。
    请问高手,1.进程标识号在什么情况下可以成为全局变量?
              2.如果进程标识号可以成为全局变量,那原则上要不要让它成为全局变量? 
              3.子程序中原则上要不要使用use MPI,就是说主程序中调用use MPI 后,该语句的作用范围可不可以延伸到子程序

回复列表 (共4个回复)

沙发

1&2. 我的理解是, 使用MPI就没所谓全局变量, 因为所有变量在各个进程中都有自己的"副本".
你每次调用 MPI_COMM_RANK 只是返回该进程的进程号. 至于返回值是否为该进程全局变量是由你程序代码决定, 跟MPI没关. 你觉得有必要, 传递给子程序也是可以的, 我不觉得这里有原则性问题要把它作为全局变量或者局部变量.

3. 至于use MPI 这个, 只要模块下用到MPI的句柄我都在模块里面加上, 反正也不浪费什么. use MPI应该跟其他调用模块一样, 在这个module里use了, 这个module里的子程序子函数都可以直接调用MPI的句柄.

个人理解, 认识不深, 仅供参考.

板凳

可以說是全局變量,但只是對于單個進程而言。其他進程是用通信機制來保證同步。
如果您用了MPI,那必須USE MPI相應的東西,函數、變量、子程序,一個也不例外。

3 楼

请问2楼cgl_lgc前辈,那原则上来说,如果主程序有了 MPI_COMM_SIZE 和 MPI_COMM_RANK 语句,那子程序还用不用再把这两句写一遍?

4 楼

我不明白楼主为什么这样问? 按照cgl_lgs的表述, 进程的进程号一开始就已经确定, 理解成进程的全局变量是对的. 但你每次调用下面的函数
CALL MPI_COMM_SIZE (MPI_COMM_WORLD, Nodes, MPI_ERR)
CALL MPI_COMM_RANK (MPI_COMM_WORLD, rank, MPI_ERR)
得到的返回值是存放在Nodes, rank, MPI_ERR里面. 这些变量是否具有全局性是由你决定的. 他们会跟其他变量不同吗?

我来回复

您尚未登录,请登录后再回复。点此登录或注册