c - 使用带有 MPI 的 master-worker 时,哪个大小的 block 将产生最佳性能?

标签 c load-balancing parallel-processing mpi master-slave

我正在使用 MPI 来解析一个试图解决 Metric TSP 问题的程序。我有P个处理器,N个城市要通过。

每个线程都向 master 请求工作,接收一个 block ——这是一个他应该检查并计算其中最小值的排列范围。我通过提前修剪不良路线来优化这一点。

共有 (N-1) 个!计算路径。每个 worker 都会得到一个带有数字的 block ,该数字代表他必须检查的第一条路线,也是最后一条路线。此外,大师向他发送已知的最近最好的结果,因此可以提前很容易出现坏路线,并对其遗骸进行一些下限。

每次工作人员找到比全局更好的结果时,他都会将其异步发送给所有其他工作人员和主服务器。

我不是在寻找更好的解决方案——我只是想确定哪个 block 大小是最好的。

到目前为止,我发现的最佳 block 大小是 (n!)/(n/2)! ,但它并没有产生那么好的结果。

请帮助我了解哪个 block 大小是最好的。我试图在计算量和通信量之间取得平衡
谢谢

最佳答案

这在很大程度上取决于您无法控制的因素:MPI 实现、机器上的总负载等。但是,我敢猜测它也很大程度上取决于有多少工作进程。关于这一点,请了解 MPI 产生进程,而不是线程。

最终,与大多数优化问题的情况一样,答案只是“测试很多不同的设置,看看哪一个最好”。您可能希望手动执行此操作,或者编写一个实现某种启发式(例如遗传算法)的测试应用程序。

关于c - 使用带有 MPI 的 master-worker 时,哪个大小的 block 将产生最佳性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764044/

相关文章:

c - 2D游戏开发基础

mysql-proxy 0.8.3 负载均衡无法工作

c# - C#的高可用性和可伸缩性

linux - HAProxy 降低吞吐量

sql-server - SqlServer - 选项重新编译并行执行行为

c - 使用 Win32 API 将自定义边框添加到另一个应用程序

c - 如何在我自己的shell中实现kill命令

c++ - C族语言if语句中2乘2条件的排列

c++ - CUDA:每个 GPU 线程上的 Runge-Kutta 轨迹

linux - 编辑和编译 MPIs FORTRAN 代码