【发布时间】:2016-11-14 15:30:01
【问题描述】:
所以我要解决的一般问题是红/蓝计算。总体思路是,您有一个带有空格的 NxN 板,红筹向右移动一格,蓝筹码向下移动一格。在这个计算的每一步中,所有没有阻碍的红人(意味着红/蓝筹码)都会向右移动,如果它们在棋盘边缘,它们就会跳到前面。然后在红色移动完成后,布鲁斯做同样的事情,但他们向下移动。现在 NxN 板被分成 TxT 块,其中 T 除以 N,当任何红色/蓝色筹码的浓度在这些块中的任何一个中达到阈值百分比 C 时,计算停止。
因此,我首先想到的并行解决方案是按行和列在处理器之间拆分计算。粗略地说,取 N,除以处理器的数量,然后它们处理那些行和列。但是这个解决方案并不是那么有效。然后我想把它分成块,每个处理器都有一个 N/sqrt(P)xN/sqrt(P) 块,其中 P 是处理器的数量,然后在边缘有互斥锁,这加快了计算速度很多。但我想我想出了一个更好的解决方案,它与按位运算有关。我可以将行数和列数除以 32,所以我只需要做大约 1/32 的工作。但问题就在这里,这是一个 4x4 板的示例,其中 0 = 空格,1 = 红色,2 = 蓝色
0202
0221
1122
1102
我将占用的红色存储在行中的方式是
[0000]
[0001]
[1100]
[1100]
我存储占用的布鲁斯列的方式是
[0000]
[1100]
[0110]
[1011]
然后我会有一个补充行列矩阵,其中包含所有占用单元格的信息,例如这里是行中的所有占用单元格
[0101]
[0111]
[1111]
[1101]
然后这里是列中所有被占用的单元格,
[0011]
[1111]
[0110]
[1111]
使用所有这些信息足以在基本恒定的时间内完成每一行和每一列的所有工作。到目前为止,这种方法并不重要,因为对于我在棋盘上的每一行所做的每一步,我都需要更新它存储哪些单元格被占用的每一列,然后我最终做的工作量就像我一样没有做任何这些按位运算。有什么方法可以让我以不同的方式存储它们或以不同的方式处理它们,这样我就可以保持减少的运行时间?
【问题讨论】:
标签: parallel-processing execution-time