Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程渲染,如何优化_Java_Multithreading_Performance - Fatal编程技术网

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指令。没有锁。