【问题标题】:Decreasing execution time of parallel red/blue computation减少并行红/蓝计算的执行时间
【发布时间】: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


    【解决方案1】:

    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 等并行硬件上执行此操作。

    【讨论】:

    • 我想我理解 Z 阶曲线的一般概念,但这将如何改善我的运行时间?如果我将行和列存储在两个不同的数组中,并且每次更改一个数组中的一行,我都需要更改另一个数组中的每一列,那么我看不出它如何改变我仍然需要更改 N 列的事实.
    • 我正在挑战假设“所以我首先想到的并行解决方案是按行和列在处理器之间拆分计算。”使用 Z 阶曲线,您可以将数据处理为瓷砖”瓷砖可以说是 8x8。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2012-12-31
    • 1970-01-01
    • 2012-10-22
    • 2021-02-09
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多