OpenMP 任务等待不起作用
OpenMP taskwait not working
在下面的代码中,我使用#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
看起来您不一定需要使用封闭的并行/单个/任务循环布局。如果不打算指定线程数,则系统应默认使用最大可用线程数。您可以使用 OMP 并行 for' 在 OMP 构造外部获取此值omp_get_max_threads()'. Then you can use just the taskloop structure, or just replace it with a
#pragma。
我认为您的代码的问题是#pragma omp taskwait
行。单个线程在遇到taskloop
构造时应分叉为多个线程,然后折叠回单个线程。我认为您可能会使用#pragma omp taskwait
命令触发单个线程的全新分叉。绝对不会触发线程分叉的#pragma omp taskwait
的替代方案是#pragma omp barrier
.我认为进行这种替换将使您的代码以当前形式工作。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- OpenMP 任务等待不起作用
- setSockopt在C 中不起作用(超时设置为1s,等待更长的时间)