parallel-processing - omp critical 和 omp single 之间的区别

标签 parallel-processing openmp

我试图了解 #pragma omp critical 之间的确切区别和 #pragma omp single在 OpenMP 中:

Microsoft 对这些的定义是:

  • Single:让您指定应在其上执行一段代码
    单线程,不一定是主线程。
  • 关键:指定代码只在一个线程上执行
    时间。

  • 因此,这意味着在两者中,之后的确切代码部分将仅由一个线程执行,而其他线程将不会进入该部分,例如如果我们打印一些东西,我们会在屏幕上看到一次结果,对吗?

    区别如何?看起来很关键要注意执行时间,但不是单一的!但我在实践中没有看到任何区别!这是否意味着对其他线程(不进入该部分)的一种等待或同步被认为是关键的,但没有任何东西可以将其他线程保持在单一状态?它如何在实践中改变结果?

    我很感激是否有人可以向我澄清这一点,尤其是通过一个例子。谢谢!

    最佳答案

    singlecritical是两个 非常不同 事物。正如你提到的:

  • 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
    

    我希望你现在能更好地看到差异。

    为了完整起见,我可以补充一点:
  • mastersingle 非常相似有两个区别:
  • master仅在 single 时由 master 执行可以由首先到达该区域的线程执行;和
  • single在区域完成时有一个隐式屏障,所有线程都在那里等待同步,而 master没有。
  • atomiccritical 非常相似,但仅限于选择简单的操作。

  • 我添加了这些精度,因为这两对指令通常是人们倾向于混淆的……

    关于parallel-processing - omp critical 和 omp single 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33441767/

    相关文章:

    parallel-processing - 如何在JavaRDD中访问MatrixFactorizationModel

    r - 正确地将 for 循环转换为并行循环

    python - 如何并行迭代 SimPy 模拟?

    C# Parallel.For 意想不到的结果

    python - 如何利用 Python 中的线程解析大文件?

    c++ - OpenMP 代码帮助

    c - 如何将 time_t 变量打印为 float ?

    c - OpenMP 并行区域线程关联

    java - 什么是 JaMP,我如何了解它?

    python - 如何在cython中使用并行性