我将改造我的自定义图形引擎,以便它利用多核CPU.更确切地说,我正在寻找一个并行化循环的库.
在我看来,OpenMP和英特尔的Thread Building Blocks都非常适合这项工作.此外,Visual Studio的C++编译器和大多数其他流行的编译器都支持它们.这两个库看起来都非常简单易用.
那么,我应该选择哪一个?有没有人尝试过两个库,可以给我一些利弊和使用任何一个库的优点?另外,你最终选择了什么?
谢谢,
阿德里安
我没有广泛使用TBB,但我的印象是,它们相互补充而不是竞争.TBB提供线程安全容器和一些并行算法,而OpenMP更像是一种并行化现有代码的方法.
就个人而言,我发现OpenMP非常容易放入现有代码中,在这些代码中你有一个可并行运行的并行循环或一系列部分.但是,对于需要修改某些共享数据的情况,它并没有帮助 - TBB的并发容器可能正是您想要的.
如果您想要的是并行化迭代独立的循环(或者可以相当容易地进行),我会选择OpenMP.如果您需要在线程之间进行更多交互,我认为TBB在这方面可能会提供更多.
来自英特尔的软件博客:比较Windows*线程,OpenMP*,用于并行编程的英特尔®线程构建模块
这也是风格的问题 - 对我来说TBB非常喜欢C++,而我不太喜欢OpenMP pragma(如果我不得不用C语言编写,那么就会使用它.)
我还会考虑团队的现有知识和经验.学习一个新的库(特别是涉及到线程/并发)确实需要一些时间.我认为,就目前而言,OpenMP比TBB更广为人知和部署(但这只是我的意见).
另一个因素 - 但考虑到最常见的平台,可能不是问题 - 可移植性.但许可证可能是一个问题.
TBB结合了一些源于学术研究的优秀研究,例如递归数据并行方法.
有高速缓存友好一些工作,为例子.
英特尔博客的讲座似乎非常有趣.
总的来说,我发现使用TBB需要更多的时间来更改代码库,并且具有较高的收益,而OpenMP可以提供快速而适度的支付.如果你从头开始盯着一个新的模块,并考虑与TBB长期合作.如果您希望获得小的但立即获得的收益,请使用OpenMP.
此外,TBB和OpenMP并不相互排斥.
我实际上已经使用了两者,我的总体印象是如果你的算法很容易并行(例如,偶数大小的循环,而不是太多的数据相互依赖),OpenMP更容易,并且非常适合使用.事实上,如果您发现可以使用OpenMP,那么它可能是更好的方法,如果您知道您的平台将支持它.我没有使用过OpenMP的新任务结构,它比原始循环和部分选项更通用.
TBB预先为您提供了更多的数据结构,但绝对需要更多的预先.作为一个优点,它可能会让你更好地了解竞争条件错误.我的意思是,在OpenMP中通过不创建共享(或其他任何东西)来实现竞争条件是相当容易的.只有当你得到不好的结果时才会看到这个.我认为这与TBB相比不太可能发生.
总体而言,我的个人偏好是针对OpenMP,特别是考虑到其对任务的表达能力的提高.