C++ 如何根据MPI中的速度在两台计算机之间划分任务?

C++ 如何根据MPI中的速度在两台计算机之间划分任务?,c++,mpi,C++,Mpi,我用MPI编程,用两台不同的计算机。首先,我想动态测量每台计算机的速度,然后根据它们的速度在它们之间划分应该读取的文件(速度越快的计算机应该读取更多的卷)。对于这种方法,我编写了一个排序程序。在程序开始时,每台计算机都单独运行它,但在这之后,我应该发送每台计算机对另一台计算机的执行时间,以便在它们之间划分文件。事实上,我想使用如下代码: MPI::init(); ..... sort(); t= time of sort() execution ; MPI_send("t");///I wan

我用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;
.........

但它不能正常工作,因为我不知道哪台计算机会更快地完成程序,它变得有点复杂。此对象的最佳解决方案是什么?

您可以有一个简单的任务(计算pi或小数点后X位的东西)并分发到所有节点,让每个节点记录开始和完成时间,然后收集所有结果(所用时间)


当您收集结果时,根节点将阻塞,直到收到所有项目。

您可以将任务拆分为多个小任务(不要太小,否则开销会太大),然后每个进程将请求一个任务并对其进行处理(类似于线程池,但使用进程)。但这是相当困难的,事实上,MPI几乎从未用于不同速度的计算机,因为它。

Way 1。等级
master
计算分布。 您可以在基准模式下运行程序一次,以获得集群中每台机器的估计性能。然后使用
MPI\u-Gather
将数据获取到
主列组
列组或任何您喜欢的列组。现在,如果继续执行,您可以将其保存到一个文件中供以后使用,或者将其保存在内存中

Rank
master
可以计算每个MPI任务的边界,并使用
MPI\u Scatter
将其发回

路2。每个MPI任务都计算分布。 或者,您可以将所有基准测试结果分发给所有MPI任务,如果它们都使用相同的算法来计算边界,那么它们可以计算自己的边界,知道所有其他任务的“速度”是什么

如果您将基准测试结果保存在秩
master
上的文件中,您可以
MPI\u广播它们。(如果是这种情况,不妨使用方式1)如果在每次计算之前运行基准测试,则可以使用
MPI\u Allgather
将它们分发给彼此的MPI任务

旁注:还请考虑基准应反映实际执行的任务。您不能为问题1设定基准,而期望问题2具有相同的效率。最肯定的是,基于排序的纯粹内存限制基准,您无法得出HDD I/O速度有多快的严肃结论。还有一些计算任务可以是内存限制的,也可以是CPU限制的。在一台机器上,它们可以是CPU绑定的,在另一台内存上,这取决于CPU体系结构、代码和机器本身。这就是为什么基准应该与实际任务相似,如果您真正关心性能,那么应该明智而谨慎地选择基准


有时,更改问题的大小可能会导致令人惊讶的结果,因为对于小问题,数据将适合缓存,而对于大问题,数据将不适合缓存。根据关键问题的大小,您可以观察到性能大幅下降。而且关键问题的规模可能因机器而异。这并不容易。

对不同问题进行基准测试在我看来是个坏主意。结果会因问题类型而异。用一种问题类型衡量的效率不会转移到另一种问题类型。实际问题与基准的差异越大,实际结果与基准的差异就越大。你也把它发挥到了极致。您可以对计算效率(排序)进行基准测试,并使用它来判断I/O问题(读取文件)的效率。你应该用一个尽可能接近实际任务的测试来进行基准测试。什么意思是“你应该用一个尽可能接近实际任务的测试来进行基准测试”你能解释一下吗?我认为对于这种方法来说,将排序程序的执行时间发送给另一台计算机就足够了。排序很可能受RAM内存延迟的限制,计算也很可能受内存的限制,但在很大程度上取决于代码质量和计算内核的准备,以及从磁盘读取I/O限制的文件,将产生无与伦比的处理效率信息。例如:一台计算机可以有快速的SSD驱动器,可以快速读取文件,另一台计算机可以有快速的CPU,但是有旧的HDD,并且可以快速排序和计算内容,但是读取文件的速度很慢。这是一个很好的观点,但是从我的程序中分割文件来看,我的意思是,另一方面,处理量会增加,因为我在每台计算机上只读取了整个文件一次,之后我将在它们之间分割数据进行处理。谢谢,但我应该说只有两台计算机,在计算机之间分割信息之后,我有很多发送和接收,但我的主要问题是我不知道哪种排序程序会更快完成,我应该如何编写send()和receive()来获得彼此的时间呢?相反,实现所谓的“manager-worker”模式相对容易,并且经常在异构系统上使用,而且这些系统越来越普遍。