英特尔MPI分布式内存:使用q <m processors =“”构建一个M * N块的墙。

时间:2016-08-30 11:51:19

标签: mpi intel

=“”

想象一下,我有M个独立的工作,每个工作都有N个步骤。工作彼此独立,但每个工作的步骤应该是连续的。换句话说,J(i,j)应该仅在J(i,j-1)结束后开始(i表示作业索引,j表示步骤)。这与构建宽度为M且具有N个块的高度的墙是同构的。

每个作业块只能执行一次。使用一个CPU(也是相同的顺序)执行一个工作块所需的时间对于不同的块是不同的,并且事先不知道。

使用MPI执行此操作的简单方法是将工作块分配给处理器,并等待所有这些工作块在下一次分配之前完成其块。通过这种方式,我们可以确保优先级得到执行,但会有很多等待时间。

有更有效的方法吗?我的意思是当处理器完成其工作时,使用某种环境变量或共享内存,可以决定接下来应该做哪个工作块,而无需等待其他处理器完成工作并使用通信做出集体决策。

2 个答案:

答案 0 :(得分:1)

你有M个工作,每个工作有N个步骤。您还有一组大小为W的工作进程,介于2和M之间。

如果W接近M,那么你能做的最好就是简单地将它们分配给1:1。如果一个工人提前结束就没问题了。

如果W远小于M,并且N也相当大,这是一个想法:

  1. 估算一步完成的平均或典型时间。请调用此T.如果您在一开始就有一个非常差的估算器,您可以随时调整此估算值。
  2. 在工人中平均分配M个工作岗位,并启动它们。告诉工人在超时之前尽可能多地执行他们分配的工作步骤,比如T * N / K.稍微超出超时以完成当前作业可以确保前进。
  3. 让工人彼此沟通他们完成的步骤。
  4. 重复,再次均匀地划分作业,同时考虑每个作业的完整程度(例如,两个50%的完整作业与一个0%的完整作业相同)。
  5. 这个想法是让所有工人有足够的时间每次完成大约1 / K的总工作量。如果没有工作需要比K * T多得多,这将是非常有效的。

    由你来找到一个合理的K.也许试试10。

答案 1 :(得分:0)

这是一个想法,IDK,如果它是好的:

维护一个共享变量:n =最后面任务的进度。即任何M个任务已完成的最低步数。它从0开始,因为所有任务都从第一步开始。它保持为0,直到所有任务完成至少1步。

当处理器完成作业步骤时,请检查当前正在对n处理的步骤的进度。如果n < current_job_step - 4,请切换任务,因为我们正在处理的任务远远落后于最远的任务。

我选择4来在过多的切换与仅在几个任务中进行过多的连续工作之间取得平衡。根据需要进行调整,也可以在接近结束时使其自适应。

在没有两个线程同时抓取相同工作单元的情况下切换任务是非常重要的,除非您有一个做出所有决策的调度程序线程。如果这是在单个共享内存计算机上,则可以使用锁定来保护优先级队列。