C ++并行化库:OpenMP与线程构build块
我要改造我的自定义graphics引擎,以便利用多核CPU。 更确切地说,我正在寻找一个库来并行化循环。
在我看来,OpenMP和英特尔的线程构build块都非常适合这项工作。 此外,两者都受Visual Studio的C ++编译器和大多数其他stream行编译器的支持。 而且这两个库看起来都非常简单易用。
那么,我应该select哪一个? 有没有人试过这两个库,可以给我一些缺点和利用任何一个库? 另外,你最终select了什么?
谢谢,
阿德里安
我没有广泛使用TBB,但我的印象是,它们相互补充而不是竞争。 TBB提供了线程安全容器和一些并行algorithm,而OpenMP则更多的是平行化现有代码。
就我个人而言,我发现OpenMP非常容易放入现有代码中,在这些代码中可以并行运行一个或多个可以并行运行的代码段。 但是,对于需要修改某些共享数据的情况,特别是在TBB的并发容器可能正是您想要的情况下,它并没有什么帮助。
如果你想要的是平行迭代是独立的(或者可以很容易地做到这一点)的循环,我会去的OpenMP。 如果您需要更multithreading之间的互动,我认为TBB在这方面可能会提供更多的信息。
来自英特尔的软件博客: 比较Windows *线程,OpenMP *,英特尔®线程构build模块以进行并行编程
这也是风格的问题 – 对我来说,TBB是非常类似C ++的,而我不太喜欢OpenMP编译指示(如果我必须用C语言编写的话,会使用它)。
我也会考虑团队的现有知识和经验。 学习一个新的库(尤其是线程/并发)需要一些时间。 我认为现在,OpenMP比TBB更广泛的被知道和部署(但这只是我的观点)。
还有一个因素 – 但考虑到大多数常见的平台,可能不是一个问题,便携性。 但是许可证可能是一个问题。
- TBB包含了一些来自学术研究的良好研究,例如recursion数据并行方法 。
- 例如 ,在caching友好方面有一些工作。
- 英特尔博客的讲座似乎非常有趣。
总的来说,我发现使用TBB需要花费更多的时间来更改代码库,而OpenMP则提供了快速而适中的回报。 如果你从头开始考虑一个新的模块,并考虑长期使用TBB。 如果您希望获得小而迅速的收益,请使用OpenMP。
另外,TBB和OpenMP不是相互排斥的。
我实际上已经使用了两者,而且我的一般印象是,如果你的algorithm很容易并行(例如尺寸均匀的循环,而不是太多的数据相互依赖),OpenMP更容易,而且相当好用。 事实上,如果您发现您可以使用OpenMP,那么如果您知道您的平台将支持它,那么可能是更好的方法。 我还没有使用OpenMP的新任务结构,它比原来的循环和部分选项更普遍。
TBB提供给你更多的数据结构,但肯定需要更多的预先。 作为一个加号,它可能会更好地让你意识到竞争条件的错误。 我的意思是,在OpenMP中通过不使应用程序共享(或其他任何东西)来实现竞争条件是相当容易的。 你只有在得到不好的结果时才会看到这个。 我认为这与TBB不太可能发生。
总的来说,我的个人偏好是OpenMP,尤其是考虑到它的任务performance力增强。
Viva64链接: 并行编程 。
是的,TBB更适用于C ++,而OpenMP更适合FORTRAN风格的C代码。 OpenMP中的新任务function看起来非常有趣,同时C ++ 0x中的Lambda和函数对象可能使TBB更易于使用。
在Visual Studio 2008中,可以添加以下行来并行化任何“for”循环。 它甚至可以与多个嵌套for循环一起使用。 这里是一个例子:
#pragma omp parallel for private(i,j) for (i=0; i<num_particles; i++) { p[i].fitness = fitnessFunction(p[i].present); if (p[i].fitness > p[i].pbestFitness) { p[i].pbestFitness = p[i].fitness; for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j]; } } gbest = pso_get_best(num_particles, p);
在我们添加了#pragma omp parallel之后,我的Core 2 Duo上的两个内核都被使用到了最大容量,所以总CPU使用率从50%上升到了100%。
据我所知,TBB(在GPLv2中有一个OpenSource版本可用)支持更多的C ++和C区域。 这些时候很难findC ++和通用的OOP并行化的具体信息。大多数地址function的东西像c(在CUDA或OpenCL上是一样的)。 如果你需要C ++支持并行化去TBB!