1

我编写了一个绘制Mandelbrot图像的 Java 程序。为了让它更有趣,我将计算每个像素颜色的 for 循环分成两半;每一半都将作为一个线程执行,从而使任务并行化。在两核一 CPU 系统上,使用两线程方法的性能与仅使用一个主线程相比几乎是两倍。我的问题是在两个双核处理器系统上,并行化任务是否会在不同处理器之间拆分,而不是仅在一个处理器上使用两个内核?我想前一种情况会比后一种情况慢,这仅仅是因为 2 个 CPU 之间通过主板线进行通信的延迟。

有任何想法吗?

谢谢

4

2 回答 2

2

线程在哪个处理器(或内核)上运行取决于操作系统。我认为操作系统通常不会在多 CPU 或多核系统之间做出任何显着区分,因此具有 4 个内核的单个 proc 系统上的程序的调度方式与具有 2 个双核处理器的系统相同。

一般来说,我的经验是线程将或多或少均匀地分布在所有可用的处理器上。因此,如果您要查看在具有 4 个内核的系统上运行的程序的 CPU 图,您会看到每个内核的利用率大约为 25%。您可以在大多数操作系统上将线程关联设置为特定的 CPU/内核,但我不确定 Java 中是否提供该功能。

于 2010-12-22T18:00:28.063 回答
1

如果我正确理解您的描述,您只有 2 个线程。不可能同时使用 4 个内核和 2 个线程。理想情况下,您希望线程数至少与系统中的内核数一样多。由于 Mandelbrot 集的成本分布不均匀(计算集中的点比集外的点更昂贵),最佳线程数可能会更高(我会尝试 4 倍的核心数。)

我将计算每个像素颜色的for循环分成两半

我不确定你在这里的意思,但你可能应该在线程之间划分最外层的循环(通过 Y 坐标进行迭代)。这将减少两个或多个 CPU 争用同一缓存行的可能性(假设图像以行优先顺序呈现。)


注意:Runtime.getRuntime().availableProcessors会告诉你系统有多少核心。

于 2010-12-22T19:40:17.023 回答