【问题标题】:OpenMP threads, how to use omp atomic clauses correctly?OpenMP 线程,如何正确使用 omp atomic 子句?
【发布时间】:2019-03-08 12:40:46
【问题描述】:

我正在尝试并行一个从文件中成对重复读取字符串的程序。我想使用 omp atomic 以确保在每个循环中都可以正确读取该对。我将在我的代码中这样使用它:

#pragma omp atomic 
{
if(a = getmystring(fp)) fprintf(fpw, "A: %s\n", a);
if(b = getmystring(fp)) fprintf(fpw, "B: %s\n", b);
}

我的问题是我不知道类(读、写、更新、捕获)之间有什么区别,以便使用正确的类。 getmystring(fp) 是从文件中一次读取一个字符串的函数。

【问题讨论】:

    标签: c multithreading ubuntu parallel-processing openmp


    【解决方案1】:

    您似乎选择了错误的 OpenMP 构造。目标似乎是一次只允许一个线程在您的块中执行。这意味着该块旨在成为一个关键区域,用于声明它的指令是omp critical:

    #pragma omp critical 
    {
        if(a = getmystring(fp)) fprintf(fpw, "A: %s\n", a);
        if(b = getmystring(fp)) fprintf(fpw, "B: %s\n", b);
    }
    

    【讨论】:

    • 结构之间存在关键差异。 critical 构造是互斥的,因为所有线程都在竞争同一个锁(或者如果将名称添加到构造中,则竞争不同的锁)。 atomic 构造仅支持某些表达式和语句,并且对特定的内存位置也有效。这意味着,如果 i != j,a[i] 的 atomic 区域可能会与 a[j] 上的另一个 atomic 并发运行。
    猜你喜欢
    • 2011-08-19
    • 2018-12-20
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多