给出宽度m
和高度n
的二维数组。
我想将所有单元放入队列,以便我的k
线程程序可以处理它们。
但是,一个重要的约束条件是,当同时处理两个8向邻居单元(例如(2,3),(2,4)
,(2,3),(3,3)
和(2,3),(3,4)
)时,就会出现冲突。
我该如何找到算法来生成这样的队列,希望在O(m*n)
时间内?
顺便说一句,我设法限制了k < m*n/4
(如果已经安全了,或者告诉我为了安全起见,我必须限制k
有多小),以避免类似m=8,n=8,k=64
的情况发生。 / p>
答案 0 :(得分:1)
要开始:
将数组划分为k个矩形区域。
从左上角开始按锯齿形顺序按对角线扫描所有区域:
(0,0)-(1,0)-(0,1)-(2,0)-(1,1)-(0,2)-(3,0)-(2,1)-(1,2)-(0,3)...
似乎通过这种方案,对邻居的处理是“按时间”分开的,因此发生冲突的可能性-当不同线程执行的速度不同时,发生冲突的可能性很小。
答案 1 :(得分:0)
IMO,一种有效的策略是将数组沿长边分成k个矩形,并沿短边逐行填充。相反,沿一个方向填充所有其他矩形。沿着同一边缘工作的两个线程之间将有很长的延迟,如果这样做,它们将在相邻的单元中非常简短地执行此操作(如果我是对的,它们最多可以在三个单元上发生冲突)。
如果禁止冲突,请分成k个矩形,并让每个线程填充下半部分(任意顺序)。然后让他们在障碍处等待。然后让它们填充下半部分。
您还可以实现k-1个互斥体,以禁止成对的相邻线程对相邻的两半起作用。