当前作业完成后,如何编排集群中的成员以从单个文件读取新输入?

How to orchestrate members in a cluster to read new input from a single file once the current job is done?

我正在使用暴力进行全局优化。我想知道是否可以使用 Fortran MPI 文件 I/O:

完成以下任务

我有三个节点,A、B、C。我希望这些节点在六组参数输入中搜索最优值,这些参数输入按以下矩阵排列:

0.1 0.2 0.3
0.4 0.5 0.6
0.7 0.8 0.9
1.1 1.2 1.3
1.4 1.5 1.6
1.7 1.8 1.9

一个行向量表示一组参数输入。哪个节点读取哪组参数输入的顺序无关紧要。我只需要通过六组参数将节点A、B、C编排到运行,得到相应的惩罚函数值,并将输出保存到一个文件即可。

比如A节点拉第一组,B节点拉第二组,C节点拉第三组。每个节点需要一段时间才能完成各自的计算。由于计算时间因节点而异,因此 C 可能是第一个完成第一轮计算的人,然后是 B,然后是 A。在这种情况下,我希望节点 C 随后拉取第四组输入,节点 B 拉取第五个,节点 A 读取最后一个集合。

A <--- 0.1 0.2 0.3
B <--- 0.4 0.5 0.6
C <--- 0.7 0.8 0.9
C <--- 1.1 1.2 1.3
B <--- 1.4 1.5 1.6
A <--- 1.7 1.8 1.9

困扰我的是,由于各个节点运行时间的不确定性,第二轮计算哪个节点读取哪个集合的顺序是事先不知道的。所以我想知道是否有一种方法可以使用 MPI 文件 I/O 对我的代码进行动态编程以获得这种并行需求。谁能告诉我一个代码模板来解决这个问题?

非常感谢。

尽管我很痛苦地提出它,但这可能是 MPI 的一个很好的用途 "Shared file pointers"。这些也适用于 Fortran,但我会弄错语法。

每个进程都可以从文件中读取一行 MPI_File_read_shared 这个独立的 I/O 例程将更新全局 "shared file pointer" 位的状态。如果 B 或 C 快速完成工作,他们可以再次调用 MPI_File_read_shared。如果 A 很慢,无论何时调用 MPI_File_read_shared,它都会读取尚未处理的内容。

一些警告:

  • 共享文件指针没有得到太多关注。
  • 共享状态的全局位通常是...一个隐藏文件。所以是的,它可能无法很好地扩展。不过,对于几十个进程应该没问题。
  • 共享状态的全局位存储在文件系统中。某些文件系统(如 PVFS)不支持确保此共享状态始终正确所需的锁定。