当前位置:  开发笔记 > 编程语言 > 正文

C++并行化库:OpenMP与线程构建块

如何解决《C++并行化库:OpenMP与线程构建块》经验,为你挑选了4个好方法。

我将改造我的自定义图形引擎,以便它利用多核CPU.更确切地说,我正在寻找一个并行化循环的库.

在我看来,OpenMP和英特尔的Thread Building Blocks都非常适合这项工作.此外,Visual Studio的C++编译器和大多数其他流行的编译器都支持它们.这两个库看起来都非常简单易用.

那么,我应该选择哪一个?有没有人尝试过两个库,可以给我一些利弊和使用任何一个库的优点?另外,你最终选择了什么?

谢谢,

阿德里安



1> Peter..:

我没有广泛使用TBB,但我的印象是,它们相互补充而不是竞争.TBB提供线程安全容器和一些并行算法,而OpenMP更像是一种并行化现有代码的方法.

就个人而言,我发现OpenMP非常容易放入现有代码中,在这些代码中你有一个可并行运行的并行循环或一系列部分.但是,对于需要修改某些共享数据的情况,它并没有帮助 - TBB的并发容器可能正是您想要的.

如果您想要的是并行化迭代独立的循环(或者可以相当容易地进行),我会选择OpenMP.如果您需要在线程之间进行更多交互,我认为TBB在这方面可能会提供更多.


关于现有代码的好处.在这里和那里插入一些pragma更容易.插入TBB可能会更困难(很大程度上取决于现有的代码风格)

2> Anonymous..:

来自英特尔的软件博客:比较Windows*线程,OpenMP*,用于并行编程的英特尔®线程构建模块

这也是风格的问题 - 对我来说TBB非常喜欢C++,而我不太喜欢OpenMP pragma(如果我不得不用C语言编写,那么就会使用它.)

我还会考虑团队的现有知识和经验.学习一个新的库(特别是涉及到线程/并发)确实需要一些时间.我认为,就目前而言,OpenMP比TBB更广为人知和部署(但这只是我的意见).

另一个因素 - 但考虑到最常见的平台,可能不是问题 - 可移植性.但许可证可能是一个问题.

TBB结合了一些源于学术研究的优秀研究,例如递归数据并行方法.

有高速缓存友好一些工作,为例子.

英特尔博客的讲座似乎非常有趣.


是的,忘了第一行某处的图释;)

3> Nikhil..:

总的来说,我发现使用TBB需要更多的时间来更改代码库,并且具有较高的收益,而OpenMP可以提供快速而适度的支付.如果你从头开始盯着一个新的模块,并考虑与TBB长期合作.如果您希望获得小的但立即获得的收益,请使用OpenMP.

此外,TBB和OpenMP并不相互排斥.



4> 小智..:

我实际上已经使用了两者,我的总体印象是如果你的算法很容易并行(例如,偶数大小的循环,而不是太多的数据相互依赖),OpenMP更容易,并且非常适合使用.事实上,如果您发现可以使用OpenMP,那么它可能是更好的方法,如果您知道您的平台将支持它.我没有使用过OpenMP的新任务结构,它比原始循环和部分选项更通用.

TBB预先为您提供了更多的数据结构,但绝对需要更多的预先.作为一个优点,它可能会让你更好地了解竞争条件错误.我的意思是,在OpenMP中通过不创建共享(或其他任何东西)来实现竞争条件是相当容易的.只有当你得到不好的结果时才会看到这个.我认为这与TBB相比不太可能发生.

总体而言,我的个人偏好是针对OpenMP,特别是考虑到其对任务的表达能力的提高.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有