Java多线程渲染,如何优化

时间:2014-10-16 17:35:56

标签: java multithreading performance

我正在研究分形渲染软件。 基本设置是我有一个大的二维数组(图片),其中值递增。

简单的渲染过程是

while( iteration < maxIteration ) {
    update some pixel in array;
}

平行化非常简单;只需要几个线程同时执行此操作, 因为每个线程(很可能)同时使用不同的像素, 即使数组中存在更新冲突,也没关系。 数组在线程之间共享!

但是,为了跟踪完成的iteratin总数,我需要iteration 易变,我怀疑这会慢一点。

令我感到困惑的是,我获得了4个线程和16个线程几乎相同的速度, 我在64核机器上运行它,由Runtime.getRuntime().availableProcessors()验证。

一个问题是我无法控制线程在数组中的位置,因此,问题可能是大小写缓存未命中?该数组的大小为fullhd-image:1920x1080x4 longs。

因此,我寻求可能的问题和解决方案,因为我认为这可能是一种常见的问题。

编辑:我尝试优化的代码可用here(sourceforge)。 类ThreadComputator代表一个线程,所有这些都进行迭代。 完成的迭代次数存储在共享变量currentIteration中, 其中(在当前代码中)在同步块中递增。

所有线程都写入Histogram对象,该对象本质上是一个很大的双精度数组。 写入此内容并不需要是原子的,因为覆盖很少,并且容忍错误。

1 个答案:

答案 0 :(得分:2)

我认为您已回答了自己的问题。

Because I implement the chaos game algorithm.  This means that the next pixel 
I need to work on depends non-deterministically on current pixel.

您的计算机上有一个功能随机访问的内存系统;但是,只有在本地化(在缓存页面内)读写时才能实现最快的性能。

我会像这样重新实现你的算法:

  1. 获取所需的所有写入时间&#34;时间&#34;,将它们包装在类/数据结构中,以便按内存页/缓存行对它们进行排序和分组。
  2. 生成需要访问的内存页面列表。
  3. 随机将一个待访问的内存页面分配给一个线程。
  4. 在该线程在另一个内存页面上运行之前,运行该页面的所有更新。
  5. 是的,它不再是100%随机的;但是你可以通过计算&#34;写入时间来减轻这种情况。并假设同一写入时间内的所有写入同时发生。它仍然会非常糟糕地打破你的记忆,但至少它会捶打少一点。