我试图了解 #pragma omp critical
之间的确切区别和 #pragma omp single
在 OpenMP 中:
Microsoft 对这些的定义是:
单线程,不一定是主线程。
时间。
因此,这意味着在两者中,之后的确切代码部分将仅由一个线程执行,而其他线程将不会进入该部分,例如如果我们打印一些东西,我们会在屏幕上看到一次结果,对吗?
区别如何?看起来很关键要注意执行时间,但不是单一的!但我在实践中没有看到任何区别!这是否意味着对其他线程(不进入该部分)的一种等待或同步被认为是关键的,但没有任何东西可以将其他线程保持在单一状态?它如何在实践中改变结果?
我很感激是否有人可以向我澄清这一点,尤其是通过一个例子。谢谢!
最佳答案
single
和 critical
是两个 非常不同 事物。正如你提到的:
single
指定应执行一段代码 通过单线程 (不一定是主线程)critical
指定执行代码 一次一个线程 所以前者会被执行只有一次 而后者将被执行 与线程的次数一样多 .
例如下面的代码
int a=0, b=0;
#pragma omp parallel num_threads(4)
{
#pragma omp single
a++;
#pragma omp critical
b++;
}
printf("single: %d -- critical: %d\n", a, b);
将打印
single: 1 -- critical: 4
我希望你现在能更好地看到差异。
为了完整起见,我可以补充一点:
master
与 single
非常相似有两个区别:master
仅在 single
时由 master 执行可以由首先到达该区域的线程执行;和 single
在区域完成时有一个隐式屏障,所有线程都在那里等待同步,而 master
没有。 atomic
与 critical
非常相似,但仅限于选择简单的操作。 我添加了这些精度,因为这两对指令通常是人们倾向于混淆的……
关于parallel-processing - omp critical 和 omp single 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33441767/