所以我试图解决的一般问题是红/蓝计算。一般的想法是你有一个带空格的NxN板,一个空间移动的红色芯片,以及向下移动一个空间的蓝色芯片。在这个计算的每一步,所有没有东西的红色(意思是红色/蓝色芯片)向右移动,如果它们在板的边缘,它们会跳到前面。在红色移动结束后,布鲁斯做同样的事情,但他们向下移动。现在,NxN板被分成TxT瓦片,其中T除以N,并且当任何红/蓝芯片的浓度在任何这些瓦片中达到阈值百分比C时计算停止。
所以我首先想到的并行解决方案是按行和列分割处理器之间的计算。粗略地说,取N,除以处理器数量,然后执行行和列。但是这个解决方案效率不高。然后我想把它分成块,每个处理器得到一个N / sqrt(P)xN / sqrt(P)块,其中P是处理器的数量,然后在边缘有互斥,这加速了计算a许多。但我认为我提出了一个更好的解决方案,与按位操作有关。我可以将行数和列数除以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]
使用所有这些信息足以在基本恒定的时间内完成每行和每列的所有工作。到目前为止,这种方法并不重要,因为对于我在电路板上连续执行的每一个动作,我需要更新每个列,它存储哪些单元格被占用,然后我最终做了相同的工作量,就好像我没有做任何这些按位操作。有没有什么方法可以存储这些不同的或以不同方式处理它们,以便我可以保持减少的运行时间?
答案 0 :(得分:0)
要考虑数据存储的几种替代方案是Morton Z顺序曲线。 Z-Ordered曲线允许您处理行和块中的列。见https://en.wikipedia.org/wiki/Z-order_curve 但一般来看,对于二维问题的四叉树应用请参见:http://www.cs.umd.edu/~hjs/pubs/Samettfcgc88-ocr.pdf
另一种方法是使用OpenCL或CUDA在GPU等并行硬件上执行此操作。