我在MPI编程,有两台不同的电脑。首先,我想动态地测量每台计算机的速度,然后根据它们的速度划分它们应该在它们之间读取的文件。(更快的计算机应该读取更多的卷)对于这种方法我写了一个排序程序。每台计算机在程序开始时单独运行它,但之后我应该将每台计算机的执行时间发送到另一台计算机,在它们之间划分文件。实际上我想使用这样的代码:
MPI::init();
.....
sort();
t= time of sort() execution ;
MPI_send("t");///I want to send the time of execution for the other computer here;
MPI_recieve("time");//I want to receive the time of execution from another computer //here;
.........
但是它无法正常工作,因为我不知道哪台计算机会更快完成程序,所以它变得有点复杂。这个对象的最佳解决方案是什么?
答案 0 :(得分:0)
你可以有一个简单的任务(计算pi或X小数位的东西)并分发到所有节点,让每个节点记录开始和结束时间,然后收集所有结果(是时间)。
收集结果时,根节点将阻止,直到收到所有项目。
答案 1 :(得分:0)
您可以将任务拆分为许多小任务(不是太小,或者开销太大),然后每个进程都会请求任务并处理它(类似于线程池,但使用进程)。但实际上,MPI实际上从未用于不同速度的计算机。
答案 2 :(得分:0)
master
计算分布。您可以在基准模式下运行一次程序,以获得群集中每台计算机的估计性能。然后使用MPI_Gather
将数据提取到master
排名或任何您喜欢的排名。现在,您可以将其保存到文件中供以后使用,或者如果继续执行则保留在内存中。
Rank master
可以计算每个MPI任务的边界,并使用MPI_Scatter
来分解它们。
或者,您可以将所有基准测试结果分发到所有MPI任务,如果他们都使用相同的算法来计算边界,他们可以自己计算机,知道所有其他任务的“速度”是什么。
如果您将基准测试结果保存在排名master
的文件中,则只能MPI_Broadcast
他们。 (如果是这种情况,也可以使用 Way 1 。)如果在每次计算之前运行基准测试,可以使用MPI_Allgather
将它们分配给其他MPI任务。
旁注:还请考虑基准应该反映实际执行的任务。您无法对问题1进行基准测试,并期望问题2具有相同的效率。而且大多数情况下,您无法得出严格的结论,基于纯粹的内存限制基准排序,HDD I / O的速度有多快。还有计算任务可以是内存或CPU绑定。在一台机器上,它们可以是CPU绑定的,在另一台机器上,取决于CPU架构,代码和机器本身。这就是为什么基准应该与实际任务相似,如果你真的关心性能,应该明智而谨慎地选择。
有时候改变问题的大小可能会导致令人惊讶的结果,因为数据会适应缓存以解决小问题而不会更大,并且您可以根据 critical 问题规模。并且关键问题的大小可能因机器而异。这并不容易。