找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4916|回复: 0

案例分析:Radiosity 光能传递渲染器的多核优化

[复制链接]
发表于 2008-7-8 15:31:48 | 显示全部楼层 |阅读模式
intel除了CPU,软件上也有很多好东西。从intel抄来一篇文章让大家看看。
案例分析:Radiosity 光能传递渲染器的多核优化
发布日期: 2007年8月8日 | 最后修改日期: 2007年8月14日
作者:吴晓昶

英特尔软件与解决方案事业部


1.概述
本案例介绍了广州市圆方计算机软件工程有限公司与英特尔软件与解决方案事业部(以下简称“英特尔”)合作,基于英特尔多核平台,对其开发的室内设计系统 TPM5000 的光能传递渲染核心进行性能优化的过程,描叙了光能传递渲染器的多线程化设计和利用英特尔的线程分析工具 Thread Profiler 来辅助性能分析的方法。

光能传递渲染(Radiosity,又称辐射度渲染)是 3D 室内设计软件中常用的渲染方法之一,对室内场景使用光能传递渲染可以生成十分逼真的光影效果。光能传递需要进行大量复杂的运算,对计算机系统的性能要求很高,对硬件平台的运算速度和能力都有很苛刻的要求。

2.光能传递简介
光能传递是一种与视点无关(view-independent)的全局照明(global illumination)算法, 它模拟场景中漫反射表面间的光能传递过程。假定所有到达物体表面(surface)的光线都会被反射回场景中,这样场景中所有可见的物体都能发出光线或反射光线,光能在场景的表面间可以互相传递。

光能传递前的场景

光能传递后的场景


物体表面间光的能量传递遵循以下光能传递方程:

直观的看,从一个表面辐射出来的光能(辐射度) 等于该表面本身发射出的光能 加上从其他
表面发射到该表面且被该表面反射的光能
光能传递算法有很多种,其中 Progressive Radiosity 是一种逐步求精算法,它能够在每一次光能传递循环计算完成后显示中间的渲染结果,随着循环次数的增加,场景从黑暗逐渐变得明亮,逐步接近真实的效果。圆方室内设计系统 TPM5000 使用的即是 Progress Radiosity,其原始的单线程版本算法可以用伪代码表示成如下形式:
  对每一次光能传递循环(one iteration):
     选择一个表面 i                           
     对每一个表面 j:                        
            计算形状因子 Fij                  
           更新表面j的辐射度               
           更新表面j的发射率               
      设置表面i的发射率为 0               



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 图如下所示:


一共有 4 个 Worker 线程,Worker 线程个数等于 CPU 物理核的个数,每一次光能传递循环主线程都会创建一个新的 Scheduler 线程,一共进行了 5 次光能传递循环。

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

(3)负载均衡分析
在 Thread Profiler 的 Profile 视图中我们按照 Thread 进行分组并观察 4 个工作线程的活动情况,从下图可以看出,我们使用的线程池使 4 个工作线程在四核上保持了较好的负载均衡。


5.优化结果
用于测试的硬件平台的配置如下:
 英特尔® 奔腾 4 单核平台英特尔® 酷睿2 双核平台英特尔® 酷睿2 四核平台
CPU英特尔® 奔腾 4 3.40G 英特尔® 酷睿™2 2.67G 英特尔® 酷睿™2 2.67G
芯片组英特尔 G945英特尔 G965英特尔 975X
内存双通道 DDR2-667 1G X 2
显卡ATI Radeon X1800
操作系统Windows XP SP2(Build 2600)

我们选用了一个典型的室内场景模型进行光能传递计算,如图结果显示圆方室内设计系统 TPM5000 的光能传递渲染核心经过多核优化后,在英特尔® 酷睿™2 双核平台上的运行速度是在英特尔® 奔腾 4 单核平台上的 3.18 倍,在英特尔® 酷睿™2 四核平台上的运行速度是在英特尔® 酷睿™2 双核平台上的 1.81 倍。


6.总结
光能传递渲染需要进行大量复杂的运算,需要进行多线程化以充分利用多核的处理能力,可对在算法的每次计算循环中进行数据并行化处理。英特尔线程分析工具 Thread Profiler 能可视化的显示线程行为并辅助开发人员进行性能分析。最终的结果显示我们的多线程化方案在英特尔多核平台上表现出良好的性能和可伸缩性。

7.参考资源
[1] Stephen Spencer, Overview of Radiosity:
http://www.siggraph.org/education/materials/HyperGraph/radiosity/overview_1.htm
[2] Threading Methodology: Principles and Practices:
http://www.intel.com/cd/software/products/asmo-na/eng/219349.htm
[3] Intel Thread Profiler:
http://www3.intel.com/cd/software/products/apac/zho/310760.htm


我们邀请您在本页 发表评论 (不受客服控制),或直接向我们的支持中心 提问.
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-19 16:00 , Processed in 0.026809 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表