2013-02-18 63 views
2

鉴于此代码示例的练习是并行使用OpenMP的代码使用任务。这是一组项目,我们想要数那些好的。 OpenMP:任务中的竞态条件

int count_good (item_t* item) 
{ 
    int n = 0; 
    while (item) { 
     if (is_good(item)) 
      n++; 
     item = item->next; 
    } 
    return n; 
} 

这不完全是家庭作业。这是为了完成考试。我的想法是这样的:

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可以避免吗?

回答

1

你将不得不显式声明nshared,否则这将是firstprivate默认情况下(因为它是隐含private在封闭的情况下)。然后为了确保n的原子增量,应该应用atomic update构造。到底你的代码应该是这样的:

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。

1

您可以使用reduction来计算“好”项目。以下代码将为您完成这项工作。您可能需要阅读this for reductionthis for traversing linked list

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; 
      } 
     }   
    } 
}