我在 PyGame 中制作了一个基于 CPU 的光线追踪器,它使用每个线程一个图块来渲染屏幕的每个部分。目前,我在行之间垂直划分屏幕,这并没有给我最好的分布:我想将线程划分在覆盖 X 和 Y 方向的偶数框中。例如:如果我的分辨率为
x = 640, y = 320
并且我有 4 个线程,我想要一个由 4 个框组成的列表,以 (x_min, y_min, x_max, y_max)
的形式表示图块边界,在本例中结果为 [(0, 0, 320, 160), (320, 0, 640, 160), (0, 160, 320, 320), (320, 160, 640, 320)]
。
问题是我不知道如何自动将线程数划分为 2D 网格:我想提取最接近的两个整数相乘以匹配线程设置。如果这个数字不能被整除,则跳转到最接近的那个可以整除的数字...例如,没有两个整数可以相乘得到 7,请使用 6 或 8 代替。我尝试过
math.sqrt
,但它只适用于完全可整除的数字,如 16,即使四舍五入,它也不会为 32 等值提供准确的结果。最简单的解决方案是什么?
示例:
4 = 2 * 2
、6 = 2 * 3
、8 = 2 * 4
、9 = 3 * 3
、16 = 4 * 4
、24 = 4 * 6
、32 = 4 * 8
、64 = 8 * 8
。
您首先需要找到
nThreads
的约数,如下所示:
nThreads = 16;
divisors = [i for i in range(2,floor(nThreads/2)+1) if nThreads%i==0]
您最终会得到一个数字不断增加的列表(我不是 Python 开发人员,但这对您来说不是问题)。
如果其长度大于2:
16 -> [2,4,8]
所示:最终得到 16=4*4
。24 -> [2,3,4,6,8,12]
所示:最终得到 24=4*6
。否则你选择较少数量的线。