我刚刚开始在python中使用OpenMPI。我用不同的输入(比如300个)运行相同的任务,每次几百次。结果彼此独立,每个进程都打印出一个文件的最终答案,因此实际上不需要进程相互通信。但是,开始新的迭代需要完成前一个进程的所有进程。
我有两个问题。第一个很容易,我认为答案是肯定的,但是如果有人能给我指点什么,那会很好。写入文件时,流程不会发生冲突,对吧? (有内置锁机制吗?)
我的其他问题是,如果其中一个过程需要很长时间才能完成(与执行相同任务的其他过程相比太长,所以可能需要2到3倍)并且由于少数过程,该计划的继续执行被阻止?是否有某种方法可以跟踪进程运行的时间,如果超过特定的时间限制,我可以终止它吗?
如果有人能指出我正确的方向,我会非常感激。
答案 0 :(得分:0)
写入文件时,可能(通常是)某些协调或序列化,但不是在应用程序级别。这些内核级隐式锁不是应用程序可以请求的,但会对性能产生很大影响。
考虑这种情况
" A在偏移0处写入500个字节.B在偏移量1000和#34;
处写入500个字节这些写入可能同时发生 - 但很大程度上取决于底层文件系统。 GPFS和Lustre具有对块(GPFS)或页面(Lustre)进行操作的锁定协议。 A和B都会尝试锁定。一个人将成功并立即行动,另一个人将在A完成后继续进行。
答案 1 :(得分:0)
这里有很多,所以我要引用你问题的某些部分,一步一步。
我用不同的输入(比如300个)运行相同的任务几百次。
如果可以的话,只需启动N个进程就会更有效率,并且在开始时为每个进程提供M个输入。不要M次启动N次。
结果彼此独立,每个进程都打印出一个文件的最终答案,因此实际上不需要进程相互通信。
然后也许你对MPI毫无用处。重点是沟通,所以如果你不这样做,那就完全没必要了。
但是,开始新的迭代需要完成前一个进程的所有进程。
哦,那通讯不是吗?换句话说,你的模式是:
N个作业处理N个输入,等待全部完成,并重复M次。
但是可能每次M次迭代的每个输入都取决于前一次,因为你说过前一次迭代必须在开始下一次迭代之前完成。这是更多的沟通!所以你的模式是:
N个作业处理N个输入,等待全部完成,然后计算下一组N个输入,并重复M次。
写入文件时,进程不会发生冲突,对吧? (有内置锁机制吗?)
右。如果两个进程写入同一文件的不同区域,则不存在冲突。可能存在性能损失,但这只有在您写了很多内容时才有意义。您也可以在“追加”模式下打开文件,在这种情况下,任何单个写入到几千字节的内容都是原子的,这也可能适用于某些用例。如果您需要编写大量数据,最好从每个进程写一个单独的文件。
如果其中一个过程需要很长时间才能完成(与执行相同任务的其他进程相比太长,所以可能需要2到3倍),并且由于少数几个,继续执行该计划被阻止?是否有某种方法可以跟踪进程运行的时间,如果超过特定的时间限制,我可以终止它吗?
您不应该这样做,因为稍后将由另一个进程缓慢处理相同的输入。除非您认为输入可能有问题,否则每个进程应保留自己的内部计时器,并在超出预定限制时放弃。