这个是我自己遇到的问题,后来在国外的网站上问的外国人才解决的,现在把这个问题给大家分享下。问题不大。
我当时是在做mpi并行。假设你有4个进程1~4,它们两两间要做交互(interaction),那么可以按照下面的方法进行
time1:(1,2)(3,4)
time2:(1,3)(2,4)
time3:(1,4)(2,3)
也就是说在3个时间点,便可以完成全部交互,并且任何时候都没有空闲的进程。但是当进程数n变大的时候,这个算法就比较难设计了。
比如n=6,下面的方式就是不行的。
time1:(1,2)(3,4)(5,6)
time2:(1,3)(2,4).......
上面的time2的时候5和6已经做完交互了,所以它们在time2的时候是空闲的,上述算法是不高效的。其实,一般来说我们处理的进程数n都是偶数,可以再n-1个时间点完成的。
解决这个问题就是要设计到经典的问题:edge——coloring。
上述问题实际上就是完全图(completed graph)的着色问题。这个coloring可以参看维基百科:http://en.wikipedia.org/wiki/Edge_coloring
这个图已经展示的很明了,把图中的n个点看做n个进程。n-1种颜色就是这种communication或者time节点。获取这个算法的方法在上述维基百科中也有描述,也就是
place n points at the vertices and center of a regular (n − 1)-sided polygon。For each color class, include one edge from the center to one of the polygon vertices, and all of the perpendicular edges connecting pairs of polygon vertices.
意思是,将一个点放置到n-1边行的中间,连接这个中间点与一个顶点,那么与这条线垂直的线就要染成相同的颜色。比如上图中,粉红色。中间点是与最上面的点连接的。然后有三条线与它垂直,也染成了粉红色。