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次迭代,但它们在迭代空间中不会连续。如果你没有指定块的大小,则由实现决定哪个线程给予额外的迭代。
我只知道运行时的矢量大小(隐含地也是chunk_size)。我试图避免使用pthreads,但似乎我不能使用openmp来做我现在需要的东西。 –
下面是GNU OpenMP运行时间如何在Mac OS X的4个线程之间使用'schedule(static)'调度103次迭代的示例:线程0-26迭代,线程1-26迭代,线程2-26迭代,线程3 - 25次迭代。所有迭代都是连续的。 –