OpenMP taskwait无法正常工作

时间:2018-06-03 23:48:56

标签: c++ c++11 openmp

在以下代码中,我使用#pragma omp parallel创建了一个并行区域。

在并行区域内,有一段代码需要仅由一个线程执行,这是使用#pragma omp single nowait实现的。

在内部,顺序区域是一个FOR循环,可以并行化,我使用#pragma omp taskloop来实现它。

循环完成后,我使用了#pragma omp taskwait,以确保其余代码只由一个线程执行。然而,似乎并没有像我期待的那样表现。多个线程正在#pragma omp taskwait之后访问代码部分,#pragma omp single nowait在定义为 std::vector<std::unordered_map<int, int>> veg_ht(n_comp + 1); vec_ht[0].insert({root_comp_id, root_comp_node}); #pragma omp parallel { #pragma omp single { int nthreads = omp_get_num_threads(); for (int l = 0; l < n_comp; ++l) { int bucket_count = vec_ht[l].bucket_count(); #pragma omp taskloop for (int bucket_id = 0; bucket_id < bucket_count; ++bucket_id) { if (vec_ht[l].bucket_size(bucket_id) == 0) { continue; } int thread_id = omp_get_thread_num(); for (auto it_vec_ht = vec_ht[l].begin(bucket_id); it_vec_ht != vec_ht[l].end(bucket_id); ++it_vec_ht) { // some operation --code removed for minimality } // for it_vec_ht[l] } // for bucket_id taskloop #pragma omp taskwait // Expected that henceforth all code will be accessed by one thread only for (int tid = 0; tid < nthreads; ++tid) { // some operation --code removed for minimality } // for tid } // for l } // pragma omp single nowait } // pragma parallel 的区域下声明。

=OR($U1=FALSE,$U1="FALSE")

1 个答案:

答案 0 :(得分:-1)

看起来您不一定需要使用封闭的parallel / single / taskloop布局。如果您不指定线程数,那么您的系统应该默认使用可用的最大线程数。您可以使用omp_get_max_threads()'. Then you can use just the taskloop structure, or just replace it with a #pragma omp parallel for`在OMP构造之外获取此值。

我认为代码的问题是#pragma omp taskwait行。单个线程在遇到taskloop构造时应分叉到多个线程,然后在之后折叠回单个线程。我认为您可能会使用#pragma omp taskwait命令触发单线程的全新分支。 <{1}} 的替代方法是#pragma omp taskwait。我认为进行此替换将使您的代码以当前形式工作。