2012-05-12 13 views
0

たとえば、n要素のベクトルとn_threadを利用できます。 #pragma omp parallelを使用して、各スレッドがn/n_threadsチャンクサイズ( )を受け取り、最後にもう1つをケースに応じて使用するようにします。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 = 2500のチャンク2500のチャンクを取得する必要thread_2

  • 2503を取得する必要thread_3取得する必要thread_1 2500のチャンク
  • を取得する必要がありthread_0

    • 4チャンク
  • 答えて

    2

    要するに、それを行う。チャンクサイズを指定せずにschedule(static)句を指定するだけで、OpenMPランタイムはほぼ同じサイズのチャンクで反復カウントを分割します。それがどのくらい正確に行われるかは実装次第です。これは、OpenMP規格は静的スケジューリングについてこう言われる、

    スケジュール(静的、CHUNK_SIZE)は反復が、サイズのchunk_sizeのチャンクに分割され、指定され、チャンクはラウンドでチーム内のスレッドに割り当てられている場合スレッド番号の順に-robinファッション。

    chunk_sizeが指定されていない場合、反復空間はほぼ同じ大きさのチャンクに分割され、最大で1つのチャンクが各スレッドに配布されます。この場合、チャンクのサイズは不定であることに注意してください。

    についてN = 10003とn_threads = 4、あなたは2500チャンクサイズ及び反復スペースが、サイズ2500チャンクに2500 2500 2500 3 diviedされ、これらがスレッドに分配される指定することができる0したがって、スレッド0は2503回の反復を得るが、それらは反復空間内で連続しない。チャンクサイズを指定しない場合は、余分な反復を与えるスレッドを決定するのは実装次第です。

    +0

    私は、実行時のベクトルサイズだけを知っています(暗黙的にもchunk_sizeも)。私はpthreadsの使用を避けようとしていましたが、私が今必要なことを行うためにopenmpを使用することはできないようです。 –

    +0

    GNU OpenMPランタイムが、Mac OS X上の4つのスレッド間で 'schedule(static)'の繰り返しを103回スケジューリングする例を示します:スレッド0 - 26反復、スレッド1 - 26反復、スレッド2 - 26反復、 25反復。すべての反復は連続しています。 –

    関連する問題