Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenMP:任务中的竞争条件_C_Multithreading_Parallel Processing_Openmp - Fatal编程技术网

C OpenMP:任务中的竞争条件

C OpenMP:任务中的竞争条件,c,multithreading,parallel-processing,openmp,C,Multithreading,Parallel Processing,Openmp,给定此代码示例,练习是使用任务将代码与OpenMP并行。这是一组项目,我们要计算好的项目。 这不完全是家庭作业。这是为了准备考试。我的想法如下: int count_good (item_t* item) { int n = 0; while (item) { #pragma omp task { if (is_good(item)) n++; } item = item->next

给定此代码示例,练习是使用任务将代码与OpenMP并行。这是一组项目,我们要计算好的项目。

这不完全是家庭作业。这是为了准备考试。我的想法如下:

int count_good (item_t* item)
{
    int n = 0;
    while (item) {
       #pragma omp task
       {
       if (is_good(item))
          n++;
       }
       item = item->next;
    }
    #pragma omp taskwait
    return n;
}
...

int main ()
{
...
#pragma omp parallel
{
#pragma omp single
    count_good(some_times);
}
}

一个问题是
n
,它是单个线程的一个私有变量,但它可以由不同的任务同时增加。这会产生竞争条件吗?使用
#pragma omp critical
可以避免吗?

您可以使用
减少
来计算“好”项目。下面的代码将为您完成这项工作。你可能想要阅读和阅读


您必须显式地将
n
声明为
shared
,否则默认情况下它将是
firstprivate
(因为它在封闭上下文中是隐式的
private
)。然后,为了确保
n
的原子增量,您应该应用
原子更新
构造。最后,您的代码应该如下所示:

int count_good (item_t* item)
{
    int n = 0;
    while (item) {
       #pragma omp task shared(n)
       {
       if (is_good(item))
          #pragma omp atomic update
          n++;
       }
       item = item->next;
    }
    #pragma omp taskwait
    return n;
}
critical
构造的开销比原子增量高得多,至少在x86上是这样

int nCount = 0;
#pragma omp parallel reduction(+ : nCount)
{       
    for(struct item_t *listWalk = some_items; listWalk != NULL; 
      listWalk = listWalk->next)
    {
        #pragma omp single nowait
        {
            if( isGood(listWalk) ){
            nCount += 1;
            }
        }           
    }
}
int count_good (item_t* item)
{
    int n = 0;
    while (item) {
       #pragma omp task shared(n)
       {
       if (is_good(item))
          #pragma omp atomic update
          n++;
       }
       item = item->next;
    }
    #pragma omp taskwait
    return n;
}