3.光能传递的多线程化设计
由上面的伪代码可以看出,在每一个光能传递循环(one iteration)中,对于任何一个被选中表面 i ,都要遍历所有其他的表面 j 来计算形状因子并且更新辐射度和和发射率。因为不同表面之间的计算是独立的,可以考虑在每一个光能传递循环中,对表面数据集使用多个线程并行地进行处理。由此我们引入 Scheduler-Worker 线程池模型,如下图所示:

Scheduler 是调度线程,它把待处理的表面分配到 Worker 工作线程池中。Worker 线程池负责对 Scheduler 分配来的线程进行处理。因为每个表面处理的时间是不同的,使用该模型的好处在于当一个线程完成计算时就能得到 Scheduler 调度来的待处理表面,使线程池对CPU 的利用率最大化,同时可较好地实现负载均衡。在实现时我们根据 CPU 物理核的个数设定 Worker 工作线程的个数,使得程序的性能随着 CPU 物理核的个数增加而增长,实现良好的可伸缩性(Scalability)。
4.Intel Thread Profiler 分析
英特尔线程分析工具 Thread Profiler 能够对线程活动行为进行可视化显示,在线程化开发过程中可以帮助开发者确定多线程设计和实现的合理性,提高开发效率。
(1)可视化显示线程运行情况
使用 Thread Profiler 的 Timeline 图可以看到应用程序的多个线程随着时间推移的执行情况和线程间的交互情况。下图为未优化前单线程的光能传递在 Timeline 图上显示情况,深绿色块表示线程处于活动状态(Active),浅绿色块表示现场处于等待(Wait)状态,粉红色线表示线程创建或终止,黄色线表示调度到另一个线程。从下图可以看出原程序中每一次光能传递循环主线程都会创建一个新的线程来计算,一共进行了 5 次光能传递循环。

我们将光能传递多线程化后,在英特尔四核处理器平台上运行的 Timeline 图如下所示:

(2)并行性分析
为充分发挥多核处理器并行处理的优势,我们需要尽量提高并行代码所占的运行时间比例。通过 Thread Profiler 的 Profile 视图我们可以看出在我们的设计中光能传递算法部分的并行程度已经达到较高水平,能够有效地利用四个内核。


