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之一:
xbinop =expr
x++
++x
x--
--x在前面的expression式中:
x是一个带标量types的lvalueexpression式。expr是一个标量types的expression式,它不引用x指定的对象。 binop不是重载操作符,是+,*,-,/,&,^,|,<<或>>。
 我build议在可能的情况下使用atomic ,否则命名为关键部分。 命名它们很重要。 您将避免以这种方式debugging头痛。 
当需要为单个指令启用互斥时,primefaces的性能相对较高,对于omp来说类似的情况是不正确的。
primefaces是一个单一的语句关键部分,即你locking一个语句执行
关键部分是对代码块的locking
一个好的编译器会像第一个那样翻译你的第二个代码