2024年6月8日发(作者:)

OPEN CASCADE学习笔记

——并行程序开发

著: Roman Lygin

译:George Feng

这是一篇关于开源三维建模软件OPEN CASCADE内核的博文:

ROMAN LYGIN 是OPEN CASCADE的前程序开发员和项目经理,

曾经写过许多关于该开源软件开发包的深入文章,可以在他的博

客(HTTP://)上面找到这些文章。

在Open Cascade的论坛上知道了Roman Lygin在他的博客上写了

Open Cascade notes系列文章,考虑到Open Cascade的学习资料

并不多,于是从他的博客上下载了其中绝大部分文章,将其翻译过来以

方便大家学习交流。如果大家发现文中翻译有错误或不足之处,望不吝

赐教,可以发到我的邮箱fenghongkui@,十分感谢。

2012年11月22日星期四

第1节 并行程序开发综述

正如

之前的文章

提到的,我正在开发 CAD Exchanger的ACIS导入部分,并

且将其开发成并发执行的。到目前为止结果非常理想(除了STL的流解析,因为

之前文章中提到的Microsoft的bug,我安装了VS2008SP1正在检测这个错误

是否得到了修正)。所以我准备在这篇文章中分享我的经验,希望能够对其他开

发人员有帮助(有关并行性问题在论坛上讨论的也越来越多)。也希望Open

CASCADE小组能够从我的发现中受益。

我之前已经简短介绍过几次并行应用程序开发了,再强调一下在多核时代并行应

用程序将在某个时期成为主流,你最好现在就准备好应对这个趋势。这对你的职

业路线是非常有助的,这些能力将增强你的竞争力。最近发布的 Intel Parallel

Studio(它已经成为我的工具箱的很重要的部分)可以调试多线程应用程序,简化

开发人员的工作。关于并行程序开发这个方面有很多基础书籍。我现在在读的是

Timothy Mattson 等写的《Patterns for Parallel Programming》(我的一位这方

面非常熟练的同事推荐的),还有Erich Gamma 写的《Design Patterns》也是

类似的书(所有专业软件开发人员都需要读的书)。它帮助我设计CAD Exchanger

中ACIS导入部件的构架。

回到Open CASCADE,我可以明确的说Open CASCADE对于并行应用程序非

常有用,但是正如其他软件库一样需要小心使用。

一般性评述

假如从较高的角度看问题,从问题领域看,而不是从一个特定的算法的角度看。

看看什么能够并发进行,什么需要顺序执行。例如,在我的初始IGES转换(参

考这里)实验中,我特别注意了IGES组的并行转换模块,这个模块运行的非常

好。但是整个程序的性能提高非常少,因为不是这部分占用的时间最多,而是

Shape Healing占用了整个时间的50%-70%,而且该部分仍然是顺序执行的。

所以在重新设计算法之前,性能不会提高太多。我不得不重构ACIS读取器,重

新设计传统的瀑布模型结构(其中遍历模型从根节点到叶节点),然后是shape

healing模块。由此产生了很多有价值的东西。《Design Patterns》这本书具有很

好的指导作用,可以帮助确定算法的模式。

句柄

从6.2.x 开始Open CASCADE的句柄(Handle_Standard_Transient的子类)已

经对引用计数实现了线程安全。要利用这个优点,你必须定义

MMGT_REENTRANT系统变量为非空,或者在线程之间使用句柄之前调用

Standard::SetReentrant (Standard_True),这使引用计数依赖于原子态的增加/

减小(例如Windows 上的InterlockedIncrement()),而不是++,这可能并不是

原子态的。

void Handle(Standard_Transient)::BeginScope()

{

if (entity != UndefinedHandleAddress)

{

if ( Standard::IsReentrant() )