我编写了一个绘制Mandelbrot图像的Java程序。为了使它有趣,我将for循环计算每个像素的颜色分为两半;每一半都将作为一个线程执行,从而并行化任务。在两个核心的一个cpu系统上,使用两个线程方法与一个主线程的性能差不多是两倍。我的问题是在一个两个双核处理器系统上,并行化的任务是否会在不同的处理器之间分配,而不是仅仅在一个处理器上使用两个核心?我认为前一种情况比后一种情况要慢,只是因为主板线上2个CPU之间的通信延迟。
有什么想法吗?
由于
答案 0 :(得分:2)
运行某个线程的处理器(或核心)是依赖于操作系统的东西。我认为操作系统通常不会在多CPU或多核系统之间做出任何重大区分,因此具有4个内核的单个proc系统上的程序将与具有2个双核处理器的系统进行相同的调度。
一般来说,我的经验是线程将或多或少均匀地分布在所有可用的处理器上。因此,如果您要观看在具有4个内核的系统上运行的程序的CPU图表,您会看到每个内核的利用率大约为25%。您可以在大多数操作系统上为特定的CPU /核心设置线程关联,但我不确定该功能是否在Java中可用。
答案 1 :(得分:1)
如果我正确理解您的描述,您只有2个主题。不可能同时使用4个内核和2个线程。理想情况下,您至少需要与系统中的核心一样多的线程。由于Mandelbrot集的非均匀成本分布(集合中的点的计算比集合之外的点更昂贵),最佳线程数可能更高(我会尝试4×核心数。)
我将计算每个像素颜色的for循环划分为2个半部
我不确定你的意思,但你应该在线程之间划分最外面的循环(迭代Y坐标)。这将减少两个或更多CPU争用同一缓存行的可能性(假设图像以行主顺序呈现。)
注意:Runtime.getRuntime().availableProcessors
将告诉您系统有多少核心。