OpenMP对3D程序优化有用吗

pango2005 2007-05-21 11:55:39
我在开发一3D场景编辑器程序,使用OpenGL平台显示场景,在显示场景前需要在CPU将几何体的顶点数据计算出来,然后送给显卡显示;

从NVIDIA的一些显卡编程优化资料得知,用于OpenGL显示用的线程最好没有任何繁重的CPU计算任务,就是说OpenGL线程的任务最好只有

发送渲染命令以及交换前后缓冲,主要不要有任务阻塞;顶点计算的任务量还是挺重的,所以我想了两个解决办法:

- 将顶点计算的任务分配到一专门的线程执行,不在OpenGL线程执行,就是说在渲染N帧时,后台要有个线程在同时计算N+1帧的顶点

数据;

- 将顶点计算的代码做OpenMP优化,让多个线程同时计算顶点数据;

方法1实现比较困难,方法2较方便,但我想OpenMP是把计算任务分配给多个线程执行,调用线程还是要被阻塞直到所有线程的计算任务

结束,无非阻塞的时间要比单线程方式短,所以我也在考虑方法2的性能是否比方法1差;当然我是第一次接触OpenMP,对OpenMP的运行机

制的认识还比较肤浅,所以存在上述的疑问;我想知道方法2和方法1的性能是否差不多(如果是的话我就用方法2了,谁不喜欢简单解决

问题的办法啊)?大家说说把
...全文
465 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
IntelSupport 2007-05-28
  • 打赏
  • 举报
回复
这个问题非常好。

你的两种解决方案分别对应两种不同的多线程实现方式。第一种属于隐式多线程化,既使用OpenMP这类高层多线程语言实现;第二种属于显式多线程化,既使用window Threads、POSIX threads等底层线程库实现。

两种实现方式的优缺点类似于高级语言和低级语言的区别。用OpenMP实现多线程简单,能对一些简单的程序结构快速多线程化;跨平台性好;但程序员对线程的控制较少,因此程序员不能实现某些复杂的线程调度模型。就性能上来说通常不如使用Window/POSIX 线程库实现的线程。而使用Window/POSIX 线程库进行多线程化的优缺点正好和OpenMP相反,能对线程的调度等进行特殊控制,因此性能提升的空间比较大;但编程复杂,调试困难,很能锻炼程序员的功力。真所谓天下没有免费午餐,想要性能好,就得付出代价,呵呵。具体采用那一种方式,需要根据实际情况,在复杂度和性能之间进行权衡。

如果单从性能角度来看,你的第一种解决方案显然要比用OpenMP的方案好,这是从算法上就保证的,第一种方案是顶点线程和渲染线程分别独立运行,是真正的多线程;而使用OpenMP的话,程序的整体结构还是单线程的,除非单线程情况下,更新顶点的时间比渲染的时间大很多,也就是说渲染线程的时间可忽略不计,这样用OpenMP对顶点运算进行多线程化,能达到的性能提升比较显著,否则则不然。openmp很简单,只要加几行pragma,就可以做个实验验证一下性能提高的幅度。

3D游戏是很耗CPU的应用,也有很多可多线程化的地方,以前没有多核CPU的时候,多线程对3D游戏性能的意义不是很大,但现在和将来多核CPU越来越多。只有多线程的游戏才能充分利用CPU的计算资源,显示更多特效,如复杂的粒子,物理,AI,动态阴影等,给玩家带来精彩体验。因此对游戏开发者来说,无论是使用OpenMP还是底层线程库,学习和掌握多线程编程的技巧对将来的发展都是很有好处的。

flyingdog 2007-05-25
  • 打赏
  • 举报
回复
楼主的想法基本上都是正确的。
对于2种方法的比较也是对的。
其实OpenMP的好处是并行容易,不容易出错。
要是考虑性能,当然是自己写多线程性能高,当然这样花的开发时间就长了。
使用OpenMP,如果有n个核,那理想情况下也只能把计算时间变成1/n。
如果这个不能满足你的需求,那还是按照你的第一个方法吧。
pango2005 2007-05-24
  • 打赏
  • 举报
回复
我的软件是做实时的3D饼图动画,由于各种原因3D饼图顶点数据(以及纹理坐标,法向量)在通过Shader在GPU计算的方法不好实现,所以还是在CPU先计算好顶点数据,然后让显卡完成渲染,其实计算的时间也不是很长,但我想让程序的性能更好些,以便能同时渲染好几个动画,所以考虑通过多线程和OpenMP方式优化程序;
“zidongli“兄说"OpenGL渲染的时候先要计算(CPU)完成,才下一步渲染(GPU),
所以我觉得不需要专门分离线程了”,这话我有点不同,如果在GPU渲染某帧动画时,同时有一后台线程计算下帧的顶点数据,这样渲染和顶点计算能同时进行,效率不是会更好吗?“使用OpenMP就不用自己单独写线程了。”我不同意这点,使用OpenMP,我仍然要等待到所有的顶点计算完毕后才开始渲染,只是等待时间要比未使用OpenMP的程序要短,但毕竟还是要等待,渲染和顶点计算没有在两个核心同时运行,所以我是认为使用OpenMP不比自己单独写线程来的性能高;
当然以上只是我的个人观点,我想INTEL老大极力宣传和推广OpenMP,那OpenMP也必然有其过人之处,只是小弟我限于自己的认识水平,始终想不通OpenMP为何比开辟单独的顶点计算线程的方式老的高,所以也确定不了优化的方案,所以还请大家帮我解惑
lserlohn 2007-05-23
  • 打赏
  • 举报
回复
我认为这样其实是不行的

让CPU去做顶点计算就是南辕北辙,实际上CPU计算更耗时间,而且将顶点数据传送到显卡上去还得先布置顶点。
茶禅如水 2007-05-22
  • 打赏
  • 举报
回复
如果该编辑器工作在多核和多CPU系统上,使用OpenMP可能会使性能提高。
如果是在单核上跑,OpenMP 不适合性能提高。
建议你尝试一下 Intel的cpp编译器的优化功能,可以自动向量化(参数-QxP等),
可以在生成代码中有利指令级并行的SSE类指令,这可能会在对程序性能有提升,特别对于数据运算。
茶禅如水 2007-05-22
  • 打赏
  • 举报
回复
使用OpenMP就不用自己单独写线程了。
只需要将OpenMP的编译器指令写好,特别针对for循环。
支持OpenMP的编译器会帮你自动生成多线程程序,一般根据CPU的数目来确定线程数,已达到最大性能。

OpenGL渲染的时候先要计算(CPU)完成,才下一步渲染(GPU),
所以我觉得不需要专门分离线程了。

需要注意的是OpenMP不负责程序检查,自己要做好数据的保护。
pango2005 2007-05-22
  • 打赏
  • 举报
回复
谢谢楼上的回复,我的软件是跑在多核CPU上,但我想知道的是我是该用OpenMP优化原来的串行程序,还是将计算顶点的串行程序放入一专门的线程,与渲染线程独立,就是说以上两个方法哪个性能会更好?

568

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧