回路范围的OpenMP
OpenMP For Loop Ranges
我想使用OpenMP在二维网格上并行操作,其中每个线程都将使用网格的一个子部分。
想象一个函数f(lower,upper,grid)
,它将处理一个子段,给定其下限和上限(假设下限和上限指的是网格的一个轴)。
我的问题是,是否可以在不显式计算lower
和upper
的情况下调用f
?
例如,如果我有一个For循环,OpenMP将自动在线程之间划分循环。有没有办法让OpenMP划分一个范围并将该范围的块分配给f
?
谢谢!
更新:
为了澄清,如果我有一个for循环:
#pragma omp parallel for
for(int i=0;i<50;i++)
OpenMP将划分for循环。我想知道的类似于知道for循环是如何划分的。
我有理由相信你的问题的答案是否定的。我认为你将不得不编写诸如之类的代码
f(lower(omp_get_thread_num()),upper(omp_get_thread_num()),grid)
其中upper()
和lower()
现在是执行所需的域分解并将线程id作为输入参数的函数。
我让你来决定是让OpenMP符合你的工作方式,还是让你的工作方法适应OpenMP(在这种情况下,这意味着让OpenMP在线程之间划分循环迭代)在任何意义上对你来说都更好。
您可以尝试omp task
,具体取决于每个任务的大小(开销比parallel for
重
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- OpenMP阵列性能较差
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- OpenMP:并行更新数组总是需要减少数组吗
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 回路范围的OpenMP
- 我在 OpenMP 中实现 Dijkstra 最短路径算法时可能存在的范围问题?