Java多线程渲染,如何优化
我正在开发一个分形渲染软件。 基本设置是我有一个大的二维数组(图),其中的值是递增的 简单的渲染过程是Java多线程渲染,如何优化,java,multithreading,performance,Java,Multithreading,Performance,我正在开发一个分形渲染软件。 基本设置是我有一个大的二维数组(图),其中的值是递增的 简单的渲染过程是 while( iteration < maxIteration ) { update some pixel in array; } while(迭代
while( iteration < maxIteration ) {
update some pixel in array;
}
while(迭代<最大迭代){
更新阵列中的某些像素;
}
这是愚蠢的简单并行化;只要有几个线程同时执行此操作,
由于每个线程(很可能)同时使用不同的像素,
即使数组中存在更新冲突,也可以。
数组在线程之间共享
但是,为了跟踪完成的迭代的总数,我需要iteration
易失性,我怀疑这会让代码慢一点
让我恼火的是,4个线程和16个线程的速度几乎相同,
我在一台64核的机器上运行它,这是由Runtime.getRuntime().availableProcessors()验证的
一个问题是,我无法控制线程在阵列中的工作位置,因此,问题可能是缓存未命中?该阵列的大小为全高清图像:1920x1080x4长
因此,我寻求可能的问题和解决方案,因为我认为这可能是一种常见的问题
编辑:我试图优化的代码可用(sourceforge)。
类ThreadComputator
表示一个线程,所有这些线程都进行迭代。
完成的迭代次数存储在共享变量currentIteration
中,
它(在当前代码中)在同步块中递增
所有线程都写入直方图
对象,该对象本质上是一个大的双精度数组。
写入此文件不需要是原子性的,因为覆盖很少,而且错误是可以容忍的。我想您已经回答了自己的问题
Because I implement the chaos game algorithm. This means that the next pixel
I need to work on depends non-deterministically on current pixel.
你的计算机上有一个功能随机存取的存储系统;但是,只有在本地化(缓存页内)读写时,才能实现最快的性能
我将重新实现您的算法,如下所示:
在“时间瞬间”获取所有所需的写操作,将它们包装在类/数据结构中,以便它们可以按内存页/缓存线排序和分组
生成需要访问的内存页列表
将要访问的内存页随机分配给线程
在该线程在另一个内存页上工作之前,运行该页的所有更新
是的,它不再是100%随机的;但是,您可以通过计算“写入时间”并假设同一写入时间内的所有写入都同时发生来缓解这种情况。它仍然会严重影响您的内存,但至少会减少一些影响。为什么您不能控制每个线程处理的数组块?这是一个常见的数据并行(fork/join for one)问题,许多软件产品都解决了这个问题,因为我实现了混沌博弈算法。这意味着我需要处理的下一个像素不确定地取决于当前像素。巨大的数组就像一个随机过程的直方图。想象一下,每根线都会向阵列投掷飞镖;如果我只考虑一个较小的部分,那么所有其他投掷镖将被浪费。无法“强制”算法只处理数组的一个子部分,而不进行其他部分的计算。您可能不应该使用volatile。我建议改为AtomicInteger
(或AtomicLong
)。@ngreen:使用同步;这不是比volatile慢吗?不,它使用CAS指令。没有锁。