我很想知道使用OpenMP的优势(并因此连接到第三方库,假设您是C ++程序员),而C ++ 0x提供了良好的并行结构。
有人能为我提供专业人士吗?和利弊。在C ++ 0x内置构造中使用OpenMP?
答案 0 :(得分:3)
我不得不承认我还没有深入研究过C ++ 0x,但据我所知,“仅仅”提供了一些通用并行化的原语。
另一方面,OpenMP是一个相对高级的抽象,可以将代码并行化,只有一个目的:通过在多个CPU核心之间分配工作来提高性能(而不是提高UI响应能力,或者与异步通道进行通信)OpenMP使这一点变得非常简单,因为它提供了一种紧凑的语法并且自动执行很多操作,例如:管理线程池和调度线程以均匀分配工作。在最好的情况下,这意味着并行化现有算法就像将以下内容放入代码一样简单(在适当的位置):
#pragma omp parallel for
(当然它通常有点复杂。)
然而,这需要付出双重代价:
OpenMP是通过编译指示实现的,并且与C ++语法集成得很差。例如,以下直截了当的代码是非法的:
void f() {
#pragma omp critical
{
return;
}
}
那是因为你不能过早地离开OpenMP“块”。相当糟糕。
OpenMP力求尽可能与平台无关。因此,它缺少一些有趣的原语。例如,OpenMP中没有yield
命令,没有fetch_and_add
原语,也没有compare_and_swap
或LL / CS。
答案 1 :(得分:1)
对于使用gcc的Open MP,libgomp
自带gcc并且不是第三方。我的理解是,这与其他编译器类似。