回路范围的OpenMP

OpenMP For Loop Ranges

本文关键字:OpenMP 范围 回路      更新时间:2023-10-16

我想使用OpenMP在二维网格上并行操作,其中每个线程都将使用网格的一个子部分。

想象一个函数f(lower,upper,grid),它将处理一个子段,给定其下限和上限(假设下限和上限指的是网格的一个轴)。

我的问题是,是否可以在不显式计算lowerupper的情况下调用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