计算大 Mandelbrot 图像的最佳方法
Posted
技术标签:
【中文标题】计算大 Mandelbrot 图像的最佳方法【英文标题】:Best way to compute a big Mandelbrot image 【发布时间】:2021-10-23 06:10:01 【问题描述】:我尝试计算分形图像,并且随着分辨率的增加,计算可能会很长,我想知道是否可以使用超线程来计算最终图像的“图块”,然后得到结果。 但是我所有拆分线程或任务的尝试都以比我在下面显示的方式更慢的计算结束(只是暴力强制 for 循环中的所有值)。
另外,我没有 NVidia GPU,我想知道我可以通过 OpenCL 加快这种计算?
现在我所拥有的只是创建一个具有给定分辨率和每边点数的位图。
Image Generate()
DateTime n = DateTime.Now;
Console.WriteLine("Generating...");
Image img = new Bitmap(resolution, resolution);
Graphics g = Graphics.FromImage(img);
double step = ((px - mx) / points) * 0.5d;
for (double x = mx; x < px; x += step)
for (double y = my; y < py; y += step)
ParseDot(CreateDot(new Complex(x, y)), g);
Console.WriteLine("Dots parsed (" + (DateTime.Now - n).TotalMilliseconds + ")");
pictureBox1.BackgroundImage = img;
pictureBox1.Refresh();
isComputing = false;
return img;
My result so far
感谢任何提示:)
【问题讨论】:
几年前我这样做的时候,我没有计算图像,而是计算了一个二维整数数组,我认为(或者可能是浮点数)。这些行可以并行访问。 你的代码的“超线程”版本在哪里? 顺便说一句,“固定”意味着系上或固定。 “加速”这个词的意思是加快速度。 【参考方案1】:使用 OpenCL,您可以实时进行 mandelbrot 缩放,比 CPU 多线程快几百倍。这个想法是用 1 个 GPU 线程计算位图上的每个像素,即并行化嵌套的 x
和 y
循环。示例源代码(通过 Aparapi 实现的 Java 和 OpenCL)以及可执行的 .jar
示例是 on my website。
【讨论】:
【参考方案2】:谢谢,我终于找到了超线程的方法,稍后我一定会看看 OpenCL,但现在我设法使用 Parallel.For() 将计算时间除以 5:
double span = (Form1.px - Form1.mx);
int parallels = 50;
List<Dot>[] dots = new List<Dot>[parallels];
Parallel.For(0,
parallels,
(iteration, state) =>
dots[iteration] = new List<Dot>();
for (double x = Form1.mx + (span / parallels) * iteration; x < Form1.mx + (span / parallels) * (iteration + 1); x += step)
for (double y = Form1.my; y < Form1.py; y += step)
dots[iteration].Add(CreateDot(new Complex(x, y)));
);
【讨论】:
以上是关于计算大 Mandelbrot 图像的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章