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