openMP,primefacesvs关键?

primefaces和关键在openMP有什么区别? 我可以做这个

#pragma omp atomic g_qCount++; 

但不是这样

 #pragma omp critical g_qCount++; 

对g_qCount的影响是一样的,但是做的是不一样的。

一个OpenMP的关键部分是完全通用的 – 它可以围绕任何任意的代码块。 但是,通过在每次线程进入和退出关键部分(在序列化的固有代价之上)时引起显着的开销,您付出了一般性。

(另外,在OpenMP中,所有未命名的关键部分都被认为是相同的(如果您愿意,所有未命名的关键部分只有一个锁),以便如果一个线程位于上面的[未命名]关键部分, [unnamed] critical section。正如你可能猜到的那样,你可以通过使用命名的临界区来解决这个问题)。

primefaces操作的开销要低得多。 在可用的情况下,它利用提供(例如)primefaces增量操作的硬件; 在这种情况下,在进入/退出代码行时不需要locking/解锁,它只是做硬件告诉你不能被干扰的primefaces增量。

好处是开销要低得多,一个线程在primefaces操作中不会阻塞即将发生的任何(不同的)primefaces操作。 缺点是primefaces支持的操作受限制。

当然,无论哪种情况,都会产生序列化的代价。

以前的答案是很好的,除了一点点的想法,在OpenMP中,所有未命名的关键部分是相互排斥的。 关键和primefaces之间最重要的区别是primefaces只能保护一个赋值,并且可以和特定的运算符一起使用。

关键部分:

  • 确保代码块的序列化。
  • 可以扩展到适当使用“name”标签来连续化块组。

  • 比较慢!

primefaces操作:

  • 速度要快得多!

  • 只保证特定操作的序列化。

最快的方式既不重要也不primefaces。 与临界值相比,加成比简单加成要贵200倍,primefaces加成比简单加成要贵25倍。

最快的选项(并不总是适用)是给每个线程自己的计数器,并在需要总和时减less操作。

atomic的局限性很重要。 他们应该在OpenMP规范中详细说明。 MSDN提供了一个快速的备忘单,如果这不会改变,我不会感到惊讶。 (Visual Studio 2012从2002年3月开始实施OpenMP。)引用MSDN:

expression式声明必须具有以下forms之一:

x binop = expr

x++

++x

x--

--x

在前面的expression式中: x是一个带标量types的lvalueexpression式。 expr是一个标量types的expression式,它不引用x指定的对象。 binop不是重载操作符,是+*-/&^|<<>>

我build议在可能的情况下使用atomic ,否则命名为关键部分。 命名它们很重要。 您将避免以这种方式debugging头痛。

当需要为单个指令启用互斥时,primefaces的性能相对较高,对于omp来说类似的情况是不正确的。

primefaces是一个单一的语句关键部分,即你locking一个语句执行

关键部分是对代码块的locking

一个好的编译器会像第一个那样翻译你的第二个代码