我正在研究分形渲染软件。 基本设置是我有一个大的二维数组(图片),其中值递增。
简单的渲染过程是
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
对象,该对象本质上是一个很大的双精度数组。
写入此内容并不需要是原子的,因为覆盖很少,并且容忍错误。
答案 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.
您的计算机上有一个功能随机访问的内存系统;但是,只有在本地化(在缓存页面内)读写时才能实现最快的性能。
我会像这样重新实现你的算法:
是的,它不再是100%随机的;但是你可以通过计算&#34;写入时间来减轻这种情况。并假设同一写入时间内的所有写入同时发生。它仍然会非常糟糕地打破你的记忆,但至少它会捶打少一点。