足球比分直播

基于多核平台的OGRE+3D引擎关键模块分析和优化.pdf

返回
基于多核平台的OGRE+3D引擎关键模块分析和优化.pdf_第1页
第1页 / 共62页
基于多核平台的OGRE+3D引擎关键模块分析和优化.pdf_第2页
第2页 / 共62页
基于多核平台的OGRE+3D引擎关键模块分析和优化.pdf_第3页
第3页 / 共62页
基于多核平台的OGRE+3D引擎关键模块分析和优化.pdf_第4页
第4页 / 共62页
基于多核平台的OGRE+3D引擎关键模块分析和优化.pdf_第5页
第5页 / 共62页
点击查看更多>>
资源描述:
Abstract II Abstract With the development of multi-core computers, parallel computing technology has been widely used in many areas of computer science. Thread-level parallelism is now the most popular parallel computing . However in graphic applications, thread-level parallelism technology is only used in very low level such as loading resources and audio dependent thread. The reason is that all the existed 3D engines are designed to be single thread, so much of the CPU is wasted. OGREObject-Oriented Graphics Rendering Engine, is now a popular 3D engine, which is developed with C. In OGRE engine, the graphic API is encapsulated and it has the advantages of convenience and expansibility. OGRE is a classic single-threaded graphic engine. Aiming at this problem, a research on OGRE, a popular 3D engine, is given in this paper. Two important modules in OGRE, Rendering System and Collision System, are verified with parallel computing technology, which has representation and practicability. As to the Rendering System of OGRE, Firstly, the logical frame is parallelized by the of OpenMP. Then, according to the Win32 library and the DirectX11 multithread support, a new is presented to parallelize the rendering frame and then applied to graphic engine. The Collision System of OGRE is only in low level. Aiming at this problem, we build an balanced BSP tree based on the original Collision System. Then we use synchronism depth priority traversing to traverse the built BSP tree. At last we use OpenMP to make it parallel. The accuracy of Collision System is successfully increased and the advantage of parallelism is proved. The testing on the multi-core plat shows that, the optimized modules, endering System and Collision System, gain a higher rendering speed and CPU utilization, and also better CPU load balancing. All the above proves of the feasibility and superiority of thread-level parallelism technology on multi-core plat. Keywords Multi-core, Multithreading, 3D Engine, OpenMP, DirectX11, Collision Detecion万方数据目录 III 目 录 摘 要 .............................................................. I Abstract........................................................... II 第一章 绪 论 ........................................................ 1 §1.1 课题背景 .................................................... 1 §1.2 论文研究的目的和意义 ........................................ 2 §1.3 本文主要工作 ................................................ 2 §1.4 本文组织结构 ................................................ 3 第二章 课题背景与相关技术介绍 ....................................... 4 §2.1 多核与并行计算 .............................................. 4 §2.1.1 多核处理器 .............................................. 4 §2.1.2 并行计算概述 ............................................ 5 §2.1.3 多核中的并行技术 ........................................ 5 §2.1.4 多线程编程 .............................................. 6 §2.2 3D 引擎 ..................................................... 7 §2.2.1 概述 .................................................... 7 §2.2.2 实时碰撞检测技术 ........................................ 8 §2.2.3 Direct3D ................................................ 9 §2.2.4 Direct3D11 ............................................. 10 §2.3 本章小结 ................................................... 12 第三章 OGRE 三维图形引擎 ........................................... 13 §3.1 OGRE 的起源 ................................................ 13 §3.2 OGRE 设计特性 .............................................. 14 §3.3 OGRE 主要模块 .............................................. 16 §3.4 OGRE 渲染流程 .............................................. 18 §3.5 问题的提出 ................................................. 19 §3.6 本章小结 ................................................... 20 第四章 OGRE 渲染系统的优化 ......................................... 21 §4.1 OGRE 渲染系统分析 .......................................... 21 万方数据目录 IV §4.1.1 逻辑帧分析 ............................................. 21 §4.1.2 渲染帧分析 ............................................. 23 §4.2 逻 辑帧的 OpenMP 并行化 ...................................... 24 §4.2.1 OpenMP 并行区域编程 .................................... 24 §4.2.2 最优模块选择 ........................................... 25 §4.2.3 最 优区域选择 ........................................... 27 §4.2.4 逻辑帧的并行化实现 ..................................... 28 §4.3 渲染帧的并行化 ............................................. 29 §4.3.1 前人工作分析 ........................................... 29 §4.3.2 OGRE 渲染队列 .......................................... 30 §4.3.3 渲染帧的并行化方案 ..................................... 32 §4.3.4 渲染帧的并行化实现 ..................................... 34 §4.4 本章小结 ................................................... 35 第五章 OGRE 碰撞检测系统的优化 ..................................... 36 §5.1 实时碰撞检测相关技术 ....................................... 36 §5.1.1 层次包围体技术 ......................................... 36 §5.1.2 实时碰撞检测的步骤 ..................................... 37 §5.2 OGRE 碰撞检测系统分析 ...................................... 38 §5.3 AABB 层次包围体平衡二叉树的构建 ............................ 39 §5.3.1 BSP 树 ................................................. 39 §5.3.2 OGRE 中平衡二叉树的构建 ................................ 40 §5.4 AABB 包围盒平衡二叉树的遍历 ................................ 41 §5.4.1 常用遍历算法分析 ....................................... 41 §5.4.2 基于同步深度优先遍历法的碰撞检测串行实现 ............... 42 §5.4.3 基于 OpenMP 的逐步求精并行化 ............................ 44 §5.5 本章小结 ................................................... 45 第六章 实验结果与讨论 .............................................. 47 §6.1 OGRE 源码的获取和编译 ...................................... 47 §6.1.1 获取源码 ............................................... 47 § 6.1.2 编译源码 .............................................. 47 万方数据目录 V §6.2 渲染系统优化实验 ........................................... 48 §6.2.1 实验步骤 ............................................... 48 §6.2.2 实验结果 ............................................... 49 §6.2.3 结果讨论 ............................................... 51 §6.3 碰撞检测系统优化实验 ....................................... 52 §6.3.1 实验结果 ............................................... 52 §6 .3.2 结果讨论 ............................................... 54 §6.4 本章小结 ................................................... 54 第七章 总结与展望 .................................................. 55 §7.1 总结 ....................................................... 55 §7.2 展望 ....................................................... 56 参考文献 ........................................................... 57 致 谢 ............................................................. 60 攻读硕士学位期间参与的课题及发表的论文 ............................. 61 万方数据第一章 绪论 1 第一章 绪 论 §1.1 课题背景 1971 年,英特尔公司推出了世界上第一个处理器 4004,它由 2300 个晶体管组成,运算能力达到每秒 4 万次 [1]。此后的 30 年,处理器的发展依照著名的摩尔定律(摩尔曾预测从 1975 年起, CPU 芯片所包含的晶体管数量每 18 个月就会增加一倍 [2])所预测的那样迅猛发展,计算机科学的发展也迎来了黄金期。今天,在一块芯片上集成的晶体管数量已经增 加至上亿个,每秒钟的运算次数也从最初的百万次提高到几十亿次以上。然而,随着处理器中晶体管数量的增加,发热量过大的问题开始显现, CPU 制作工艺上的限制越发明显,通过增加晶体管数量来提升 CPU 性能的方法已经很难继续下去 [3],摩尔定律开始遭受质疑。 在这种情况下,多核处理器的出现为处理器的发展开辟了一条新路。所谓多核处理器,就是将两个或多个相对独立的处理器核心集成在同一块芯片上,既降低了功耗,又提高了 CPU 性能,摩尔定律因此得以延续 [4]。经过几年的摸索和发展,目前多核处理器已成为处理器市场的主流产品,被广泛应 用于个人计算机、大型服务器和嵌入式等多个领域,多核取代单核已是大势所趋。 并行计算( Parallel Computing)是同时使用多个小计算部件解决大的计算问题的方法 [5],其本质是通过增加空间复杂度来解决串行算法中时间复杂度过大的问题。随着多核处理器和通用集群技术的发展,并行计算技术也开始经历着从发展到成熟乃至普及的阶段。 多核平台中并行计算技术通常分为指令级并行( Instruction-Level Parallelism, ILP)和线程级并行( Thread-Level Parallelism, TLP)两种,而线程级并行(多线程技术)被普遍认为将是下一代高性能处理器的主流技术 [6]。随着多核计算机的普及,多线程编程技术已经广泛用于计算机科学的多个领域,也正引领着程序设计由串行到并行的转变 [7]。 计算科学发展的另一个前沿是计算机图形学。目前,计算机图形学已经被广泛应用到诸如计算机动画和影视制作、计算机游戏、生物医药、建筑、地质探勘甚至航天和军事等很多领域中,而三维( 3D)技术作为计算机图形学的前沿技术,更是已经成为当前科研领域甚至人们日常生活中的热议话题 [8]。 3D 引擎的出现极大提高了 3D 应用程序开 发的效率。它封装了 3D 场景处理的常用算法,提供给开发人员一套简洁易用的接口,将开发人员从繁重的底层基万方数据基于多核平台的 OGRE 3D 引擎关键模块 研究和 优化 2 本图元操作中解放出来 [9]。 然而,现阶段在 3D 引擎中并行计算技术尚未得到有效的应用 [10], 多线程技术在 基于 3D 引擎开发的 图形应用程序中的应用 只是 停留在资源加载和音频独立线程等较浅层面。 通过对此类应用程序的性能测试来看, GPU 性能仍占绝对主导地位,而对于 CPU 只是考验其单核性能,使用四核或者带超线程技术的 “八核 ”处理器几乎不会有任何性能提升。这是因为目前 3D 引擎的渲染流程仍采用单线程设计,在多核成为大势所趋 的情况下大量 CPU 资源被浪费,瓶颈依然卡在 CPU上面。 §1.2 论文研究的目的和意义 OGRE( Object-Oriented Graphics Rendering Engine,面向对象图形渲染引擎)是当前流行的一款开源 3D 图形引擎,它使用 C开发,巧妙的运用场景图和场景内容分离的方法管理场景,封装了底层图形 API,具有使用方便,扩展性强等优点 [11]。 如前所述,并行计算技术已经被广泛应用于计算机科学的多个领域,然而在图形应用程序中,目前却只是停留在资源异步加载和音频独立线程等较浅层面,而在最考究 计算机性能的渲染系统和碰撞检测系统等复杂模块中,并行计算的应用尚未展开,相关研究也鲜有报导 [10]。 OGRE 是一款典型的用串行方法设计的图形引擎,本文的研究出发点是以OGRE 3D 引擎作为介质,研究线程级别的并行计算在 3D 引擎几个关键技术点中的可行性或优越性,其中涉及到 Win32 多线程 API、最新图形 API DirectX11中的多线程支持、 OpenMP 方法以及针对并行程序的平衡二叉树的讨论。 §1.3 本文主要工作 本文首先分析了 OGRE 的框架,然后针对 OGRE 中的两个关键模块渲染系统和碰撞检测系统 展开研究,验证多核系统下多线程技术的优越性。 针对 OGRE 单线程的渲染系统,本文将其划分为两部分分别进行多线程优化。对于逻辑运算部分,本文用 OpenMP 方法实现了并行化;对于渲染部分,本文利用最新版本的图形 API DirectX11 的多线程支持,结合 Win32 多线程 API 和OGRE 中渲染队列的特点,提出了一种新的 Fork-Join 渲染方案,成功实现了渲染帧的并行化。 万方数据第一章 绪论 3 针对 OGRE 中碰撞检测系统检测精度较低的问题,本文在 OGRE 中已有AABB 包围盒的基础上完成了 AABB 层次包围盒平衡二叉树的构建,随后对比讨论 了常用二叉树遍历算法的优劣,并使用同步深度优先遍历法对构建的平衡二叉树进行搜索遍历。最终采用 OpenMP 方法实现了碰撞检测系统的并行化。 在多核系统下的实验证明,通过对 OGRE 的并行优化成功的提高了图形应用程序的性能,提升了 CPU 利用率,改善了 CPU 负载均衡问题。 §1.4 本文组织结构 全文分为 七 章 第二章为综述部分,介绍了本文涉及的相关背景和技术。 第三章为系统分析部分,阐述了 OGRE 的特性并分析了 OGRE 的系统整体框架和渲染流程 ,定义了渲染模块中逻辑帧和渲染帧的概念。 第四章 是对 OGRE 渲染系统的 优化。 对 于 渲染循环中的逻辑运算部分 , 首先从代码层面详细分析了逻辑帧的运行原理,分析了可并行化的最优区域并用OpenMP 实现了逻辑帧的多线程处理 ; 对 于 渲染循环中的底层渲染部分 , 先从代码层面详细分析了渲染帧的运行原理,分析了 OGRE 中的渲染队列和 DirectX11中的多线程原理,提出并实现了一种新的 Fork-Join 渲染方案,实现了渲染帧的并行化。 第 五 章 是对 OGRE 碰撞检测系统的优化。在 OGRE 已有碰撞检测系统的基础上讨论了层次包围盒技术和并行程序设计的平衡二叉树的构建,最后用OpenMP 方法实现了碰撞检测的 并行化。 第 六 章为实验结果部分。分别对第 4、 5 章中的实现方法进行了实验验证,并对实验结果进行了讨论。 第 七 章为总结和展望部分。对本文的主要工作和创新点进行了总结,对未来的研究进行了展望。 万方数据基于多核平台的 OGRE 3D 引擎关键模块 研究和 优化 4 第二章 课题背景与相关技术介绍 §2.1 多核与并行计算 §2.1.1 多核处理器 中央处理器( Central Processing Unit, CPU)是计算机中最核心的部分,相当于整个计算机体系的 “大脑 ”,无论对于个人微型计算机还是高性能的大型计算机, CPU 的规格参数都是评价计算机性能的重要标准。 CPU 主要由运算器和 控制器组成,分别是计算机的运算核心和控制核心。 CPU 按照字长的不同可以分为 4 位、 8 位、 16 位、 32 位和 64 位等。 1971 年,英特尔公司推出了世界上第一个 CPU 4004,它由 2300 个相隔距离为 10 微米的晶体管组成,处理字长为 4 位,时钟频率是 108 KHz,运算能力达到每秒 4 万次 [1]。此后的几十年,正如著名的摩尔定律(摩尔预测从 1975年起, CPU 芯片所包含的晶体管数量每 18 个月就会增加一倍 [2])所预测的那样,CPU 开始迅猛发展。 1978 年,英特尔推出了字长为 16 位 8086 处理器,每个芯片中的晶体 管数量为 29000 个,时钟频率达到 4.77 MHz。随后的 15 年, CPU 的生产工艺继续高速发展,集成的晶体管数量和时钟频率也是不断提升。 1993 年, 80586 处理器的诞生标志着奔腾( Pentium)时代的来临,它的时钟频率达到了 200 MHz,含有310 万个晶体管。 2000 年,英特尔奔腾四处理器诞生,随后经过不断发展,今天的奔腾四至尊版 840 处理器,在一块 CPU 芯片中已经能够集成 2.5 亿个晶体管,时钟频率也达到 3 GHz 以上,每秒钟的运算次数已从最初的百万次提高到 30 亿次以上。 从上世纪 70 年代以后 30 年中 , CPU 的发展不断的验证着摩尔定律的正确性。到了 21 世纪,随着奔腾四处理器的发展,一块处理器芯片中已经集成高达两亿多个晶体管,但此时半导体制作工艺上的限制越发明显, CPU 的发展开始遭遇瓶颈。 在这种情况下,多核处理器的出现为处理器的发展开辟了一条新路。多核处理器不同于多处理器,它将两个或多个相对独立的处理器核心集成在同一块芯片上,每个处理器核心都拥有独立的逻辑和控制单元。 它特殊的体系结构有效的解万方数据第二 章 课题背景与相关技术介绍 5 决了单核的功耗问题,并使 CPU 能够依照摩尔定律发展下去。 事实上在单核处理器年代,运行在计算机上的应用程序就开始支持 多线程技术,在程序执行时,多个线程并发执行,但 处理器在同一时间只能处理一个线程。多核的出现实现了程序执行由并 发 向并 行 的转变,程序中的线程可以被分配到多核处理器的每一个处理器核心上并行执行,从而大大提高了执行效率 [12]。 §2.1.2 并行计算概述 并行计算( Parallel Computing)是同时使用多个小计算部件解决大的计算问题的方法,其本质是通过增加空间复杂度来解决串行算法中时间复杂度过大的问题。随着多核处理器和通用集群技术的发展 [7],并行计算技术也开始经历着从发展到成熟乃至普及的阶段。 基于 并行的程序设计要点主要在于寻找规模较大的复杂串行问题的可并行性区域 [12],选择合理的并行算法,并行任务的合理组织和尽量减少额外的消息传递。理论上来讲并行设计的方法主要有三种 [7]( 1)利用并行库或者制导语句实现并行。例如当前流行的 MPI 和 OpenMP 都是基于该方法。( 2)设计基于并行的程序语言。目前来说,该方法成本过高,而且可能会给用户会带来无法预料的风险。( 3)设计能够将串行程序自动转为并行的机制。该方法实现的难度很大,就当前来说尚未有成熟的应用。三种方法中,第一种相对比较成熟,也是当前更易于被使用和 研究的方法。 §2.1.3 多核中的并行技术 多核系统中并行计算技术通常分为两种指令级并行和线程级并行。 ( 1)指令级并行 指令级并行的前提是指令之间是相互独立的,即不必等待相互的运算结果、不同时使用同一个运算部件、不同时访问同一个存储单元 [12],这样可以在处理器中并行的执行这些指令。 ( 2)线程级并行 线程级并行将并行计算的级别由指令级上升到线程级 [13][14],线程是现代计算机操作系统分配和调度时间资源的基本单位。在多核系统下,通过线程的并行化使得处理器能够同时执行多个线程 [15],从而提高处理 器的利用率。线程级并行也被当做是未来高性能处理器的主流技术 [6]。 万方数据基于多核平台的 OGRE 3D 引擎关键模块 研究和 优化 6 §2.1.4 多线程编程 随着多核计算机的普及,线程级并行计算已经广泛用于计算机科学的多个领域 [16],也正引领着程序设计由串行到并行的转变,下面结合本文用到的两种方法对多线程编程技术做简单的介绍。 §2.1.4.1 Win32 多线程 API Win32 API 是 Windows 操作系统内核与应用程序之间的桥梁,它将操作系统内核提供的功能进行函数封装,应用程序通过对相关函数的调用来执行对应的系统功能 [17]。为了向应用程序提供多线程的支持, Win32 API 函数库中提供了一些用于处理多线程程序的函数集。用 Win32 API 进行多线程程序设计具有诸多优点,例如基于 Win32 的应用程序执行代码小,运行效率高等,但是它要求程序员编写的代码较多,且需要程序自行管理操作系统提供给程序的所有资源 [18]。 Win32 函数库中提供了包括创建线程、终止线程、线程同步、建立互斥区等操作多线程的函数。 1.创建线程 在主线程和任意活动线程都可以创建新的线程,函数如下 HANDLE CreateThread LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId; 如果创建成功则返回线程的句柄,否则返回 NULL。 dwCreationFlags 参数决定新线程创建后是立刻执行还是挂起,若将参数值设为 CREATE_SUSPENDED,那么线程被创建后并不马上执行,而是先挂起,直到调用 ResumeThread 后才开始启动线程,此过程中可以通过 BOOL SetThreadPriorityHANDLE hThread,int nPriority函数来设置线程的优先权。 另外,可以调用 VOID ExitThreadDWORD dwExitCode 和 BOOL TerminateThreadHANDLE hThread,DWORD dwExitCode函数分别在线程的内部和外部终止线程 。 2.线程同步 在多线程处理过程中多个线程经常要同时访问一些资源,而且由于这种共享资源引起的访问冲突是不 可避免的,为了解决此类线程同步问题, Win32 API 中提供了多种同步控制对象。 Win32 API 提供了一组能使线程阻塞其自身执行的等待函数。使用等待函数万方数据
展开阅读全文
收藏
下载资源

加入会员免费下载





足球比分直播