1

n個の要素とn_threadsのベクトルが利用可能であるとしましょう。#pragma omp parallel各スレッドがn/n_threadsのチャンクサイズを受け取り、場合によっては最後のスレッドがさらに受け取るように使用したいと思います。

#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チャンクを取得する必要があります
4

2 に答える 2

3

要するに-あなたはそれをすることはできません。チャンクサイズを指定せずにschedule(static)句を指定するだけで、OpenMPランタイムは反復回数をほぼ同じサイズのチャンクに分割します。それがどの程度正確に行われるかは、実装次第です。これは、OpenMP標準が静的スケジューリングについて述べていることです。

schedule(static、chunk_size)が指定されている場合、反復はサイズchunk_sizeのチャンクに分割され、チャンクはスレッド番号の順序でラウンドロビン方式でチーム内のスレッドに割り当てられます。

チャンクサイズが指定されていない場合、反復スペースはサイズがほぼ等しいチャンクに分割され、最大で1つのチャンクが各スレッドに分散されます。この場合、チャンクのサイズは指定されていないことに注意してください。

n=10003およびn_threads=4の場合、2500のチャンクサイズを指定できます。反復スペースはサイズ2500、2500、2500、2500、および3のチャンクに分割され、スレッド0、1、2、3に分散されます。したがって、スレッド0は2503回の反復を取得しますが、反復空間では連続しません。チャンクサイズを指定しない場合、追加の反復を与えるスレッドを決定するのは実装次第です。

于 2012-05-12T13:15:10.997 に答える
0

私の知る限り、OpenMPは正確なチャンクサイズを保証していませんが、自分で計算するのはそれほど難しくありません。次にいくつかのサンプルコードを示します。

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

int main(void) {

  int n = 10003;
  int n_threads = 4;
  int chunk_size = n / n_threads;

  #pragma omp parallel num_threads(n_threads)
  {
    int id = omp_get_thread_num();
    int b = id * chunk_size;
    int e = id == n_threads - 1 ? n : b + chunk_size;
    printf("thread %d: %d items\n", id, e - b);
    for (int i = b; i < e; i++) {
      // process item i
    }
  }

  return 0;
}

サンプル出力:

thread 0: 2500 items
thread 1: 2500 items
thread 3: 2503 items
thread 2: 2500 items

注意:「各スレッドはn / n_threadsアイテムを取得し、最後の1つはアイテムを取得する」という戦略は、指定した数値には適していますが、他の場合には非常に非効率的なワークシェアリングにつながる可能性があります。たとえば、60個のアイテムと16個のスレッドがある場合、この式はすべてのスレッドに3個のアイテムを与えます。最後のスレッドは15個のアイテムを取得します。各アイテムの処理にほぼ同じ時間がかかる場合、これはプロセス全体が必要な時間の約4倍かかることを意味し、ほとんどのCPUコアはほとんどの時間アイドル状態になります。正確にこの方法で作品を配布する必要がある正当な理由がある場合にのみ、この式を使用する必要があると思います。それ以外の場合は、OpenMPによって選択されたチャンクサイズの方がおそらく優れています。

于 2018-10-30T22:24:53.730 に答える