OpenMP基于运行时参数设置固定块大小

问题描述:

假设我有一个包含n个元素和n_threads的向量。 我想使用#pragma omp parallel,使得每个线程接收n/n_threads块大小, 和最后一个取决于大小写。OpenMP基于运行时参数设置固定块大小

#include <stdio.h> 
#include <omp.h> 

int main() 
{ 

    int *v = malloc (n * sizeof(int)); 

    #pragma omp parallel for (what should i put here?) 
    for(i = 0; i < n; ++i) 
    { 
     ++v[i]; 
    } 
    return 0; 
} 

例:N = 10003,n_threads = 4

  • thread_0应该得到2500块
  • thread_1应该得到2500块
  • thread_2应该得到2500块
  • thread_3应该得到2503大块

总之 - 你不能去做。您只需指定schedule(static)子句而不指定块大小,并且OpenMP运行时会将迭代次数分为几乎相同大小的块。具体到底要做什么取决于实施。这是OpenMP标准说,关于静态调度:

当指定的时间表(静态,CHUNK_SIZE),迭代分成大小CHUNK_SIZE的块,和块分配给线程球队在圆按线程编号顺序排列。

当没有指定chunk_size时,迭代空间被分成大小近似相等的块,并且每个线程至多分配一个块。请注意,在这种情况下块的大小未指定。

对于n = 10003和n_threads = 4,则可以指定的2500块大小和迭代空间将被divied成大小2500,2500,2500,2500和3,它们将被分配给线程0的块,1,2,3和0.因此,线程0将获得2503次迭代,但它们在迭代空间中不会连续。如果你没有指定块的大小,则由实现决定哪个线程给予额外的迭代。

+0

我只知道运行时的矢量大小(隐含地也是chunk_size)。我试图避免使用pthreads,但似乎我不能使用openmp来做我现在需要的东西。 –

+0

下面是GNU OpenMP运行时间如何在Mac OS X的4个线程之间使用'schedule(static)'调度103次迭代的示例:线程0-26迭代,线程1-26迭代,线程2-26迭代,线程3 - 25次迭代。所有迭代都是连续的。 –