在C中使用OpenMP将任意范围的数字分割成大小相等的分组

  • 本文关键字:分割 数字 OpenMP 范围 任意 c openmp
  • 更新时间 :
  • 英文 :


我想使用OpenMP在C中将一系列数字拆分为大致相等的大小。例如,如果我的范围从7到24,线程数为8。我希望第一个线程从7开始,到9结束。第二个线程从10开始,到12结束。第三根线从13开始,到14结束。第四个线程从15开始,到16结束,依此类推。。。直到最后一个线程从23开始,到24结束。我写的代码如下,但没有得到前面解释的结果。我想知道是否有我错过的事情可以做,或者有更有效的方法吗?非常感谢你的帮助。

基于上面给出的示例的变量预定义声明的注意事项:

first = 7
last = 24
size = 2 (which signifies the amount of numbers per thread)
r = 2    (r signifies remainder)
nthreads = 8
myid = is the thread ID in a range of 0 to 7

    if (r > 0)
    {
        if (myid == 0)
        {
            start = first + myid*size;
            end = start + size;
        }
        else if (myid == nthreads - 1)
        {
            start = first + myid*size + myid;
            end = last;
        }
        else 
        {
            start = first + myid*size + myid;
            end = start + size;
        }
    }
    else
    {
        start = first + myid*size;
        if (myid == nthreads - 1) end = last;
        else end = start + size - 1;
    }

据我所知,#pragma omp parallel for会自动将线程之间的工作划分为相等的块,在大多数情况下都可以。

然而,如果你想手动完成这项工作,这里有一段代码可以实现你想要的:

int len = last - first + 1;
int chunk = len / nthreads;
int r = len % nthreads;
if (myid < r) {
    start = first + (chunk + 1) * myid;
    end = start + chunk;
} else {
    start = first + (chunk + 1) * r + chunk * (myid - r);
    end = start + chunk - 1;
}

如果没有额外的限制,这种分配确实是最优的。

// assuming half-open interval
int n = ((end-begin)  + omp_get_num_threads() - 1)/omp_get_num_threads();
int first = begin + n*omp_get_thread_num();
int last = max(first + n, end);

最新更新