我正在修改我很久以前写的一些代码,并决定重写它以更好地利用线程(以及更好地利用一般编程......)。
它位于此处:https ://github.com/buddhabrot/buddhabrot/blob/master/basic.c :
这是一个呈现佛像分形的应用程序。由于超出这个问题范围的原因,很难使用记忆化来优化它,基本上如果你对此进行分析,超过 99% 的时间都花在最里面的循环中,最终会:
buddhabrot[col][row]++;
多个线程将执行此代码。由于递增不是线程安全的,因此我在这部分内存周围使用了特定的互斥锁。因此,buddhabrot 内存中的每个可寻址位置都有一个单独的互斥体。
现在,这当然比使用一个锁更有效(这肯定会使所有线程相互等待),但它的内存效率较低;看来互斥锁也需要一些数据。我还想知道在具有数百万互斥锁的 pthreads 实现中的其他影响?
我现在还有另外两个策略要考虑:
为地图中的每个“区域”使用一组密度较低的互斥锁。因此,例如,对 [col/16][row/16] 的锁定只会在线程访问与另一个线程相同的 16 像素区域时锁定线程。锁的密度可以动态调整。但是当我对此建模时,我想知道我是否没有解决甚至可能由内核实现的现有问题,而且我也无法真正找到一种方法来解决这个问题而不会减慢速度。我也考虑过“互斥树”,但所有这些在这个循环中都太慢了(给出一个指示,在优化编译器背后的一些数学运算的顺序后,我可以多挤出大约 30% 的处理器时间) . 有没有一个主题,我如何寻找更多关于“互斥密度规划”的信息..?
复制每个线程的内存,这样我什至不必围绕它进行互斥。但这更加内存效率低下。它将解决在不知道其影响的情况下拥有数百万个互斥锁的问题。
那么,还有什么,我能做的更好吗?