Mandelbrot的每个像素计算如何划分到不同的节点?

Posted

技术标签:

【中文标题】Mandelbrot的每个像素计算如何划分到不同的节点?【英文标题】:How to divide each pixel calculation of Mandelbrot into different nodes? 【发布时间】:2013-04-17 02:10:10 【问题描述】:

我的问题是我应该使用什么数据结构将工作分配给每个线程并从中获取计算值。我想到的第一件事是使用包含 x、y 和 iterate_value 的结构填充向量 [0] .. 向量 [63999](用于 800x800 像素)。将这些向量传递给每个节点->然后将给定向量进一步划分给每个核心(Os-thread)->然后将给定向量进一步划分给每个线程。有没有其他可能的方式来发送和接收这些值?并且如果我以向量方式执行此操作,我应该通过值传递向量还是通过引用传递向量,在这种情况下哪个会更好?

【问题讨论】:

【参考方案1】:

mandelbrot 集的不同点需要不同的时间来计算(靠近边缘的点更昂贵),因此给每个工作人员偶数个像素将使他们中的一些人比其他人更快地完成。

将图像分成小矩形(图块)。使用多线程队列创建工作列表,并用图块填充它。每个工作线程循环,从工作列表中挑选一个图块并提交结果,直到工作列表为空。

【讨论】:

谢谢 rmmh 的回答。我感到困惑的地方是破坏了图像部分。所以假设我将图像分成 2 - 这很简单,只是分成 2,但是除以 3 时,我如何划分图像是否重要(因为它永远不会被均匀划分,在后一种情况下说,同时划分为 5000 个线程( 800/ 500 = 1.6) 小数点丢失并且一些像素不包含在图块中) @goonda,只需选择一个平铺尺寸并计算出覆盖图像所需的数量。瓷砖也不需要全部相同。使用 rmmh 建议的工作队列,工作单元(瓦片)的数量不需要与工人的数量相匹配。 ok 最后一个问题 - 在从每个核心中的所有线程收集计算值时(比如每个核心使用 13 个线程),我应该在向量中收集这些值吗(比如 vector[0] ... [12])?并将其退回以供进一步使用?【参考方案2】:

像素是均匀分布的,那么为什么要发送每个像素的坐标呢?只需告诉每个节点其左下像素的 x 和 y 坐标、像素之间的间距和像素数。这样,您的工作单元规格就是一个小的常数大小。

就更大的设计而言,拥有比物理内核更多的工作线程来运行是没有意义的。每个内核的多个线程的上下文切换只会降低性能。

【讨论】:

感谢您的回答。你能告诉我如何将 2d 图像划分为 2,3, 13, ...。我已经在 rmmh 回答中评论了如何分割图像。我仍然对分割图像部分感到困惑。是的,我将使用很多线程

以上是关于Mandelbrot的每个像素计算如何划分到不同的节点?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 计算图像中所有不同区域的像素

图像分割

计算大 Mandelbrot 图像的最佳方法

AVX计算精度

在数据库中存储 Mandelbrot 值的最佳方法可能是啥?

如何使用 C++ 正确计算 BMP 图像中每个像素的字节数?