2012-02-15 8 views
1

スレッド数を4に設定しました。なぜforループを実行しているスレッドが混在していないのですか

私の問題は次のコードではシーケンシャルタイプの動作です。すべてのスレッドがidをランダムに表示したいのですが、これはpthreadの実装がどのように動作するかを示しています。

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define CHUNKSIZE 5 
#define N 1000 

int main (int argc, char *argv[]) 
{ 
    int nthreads, tid, i, chunk; 
    float a[N], b[N], c[N]; 

    /* Some initializations */ 
    for (i=0; i < N; i++) 
    a[i] = b[i] = i * 1.0; 
    chunk = CHUNKSIZE; 

    #pragma omp parallel for schedule(static,10) shared(a,b,c) private(i,tid) 
    for (i=0; i<N; i++) 
    { 
     tid = omp_get_thread_num(); 
     c[i] = a[i] + b[i]; 
     printf("Thread %d: c[%d]= %f\n",tid,i,c[i]); 
    } 
} 

セクションからの出力:

Thread 2: c[949]= 1898.000000 
Thread 2: c[980]= 1960.000000 
Thread 2: c[981]= 1962.000000 
Thread 2: c[982]= 1964.000000 
Thread 2: c[983]= 1966.000000 
Thread 2: c[984]= 1968.000000 
Thread 2: c[985]= 1970.000000 
Thread 2: c[986]= 1972.000000 
Thread 2: c[987]= 1974.000000 
Thread 2: c[988]= 1976.000000 
Thread 2: c[989]= 1978.000000 
Thread 0: c[1]= 2.000000 
Thread 0: c[2]= 4.000000 
Thread 0: c[3]= 6.000000 
Thread 0: c[4]= 8.000000 
Thread 0: c[5]= 10.000000 
Thread 0: c[6]= 12.000000 
Thread 0: c[7]= 14.000000 
Thread 0: c[8]= 16.000000 
Thread 0: c[9]= 18.000000 
Thread 0: c[40]= 80.000000 
Thread 0: c[41]= 82.000000 
Thread 0: c[42]= 84.000000 
Thread 0: c[43]= 86.000000 
Thread 0: c[44]= 88.000000 
Thread 0: c[45]= 90.000000 
Thread 0: c[46]= 92.000000 
Thread 0: c[47]= 94.000000 
Thread 0: c[48]= 96.000000 
Thread 0: c[49]= 98.000000 
Thread 0: c[80]= 160.000000 
Thread 0: c[81]= 162.000000 
Thread 0: c[82]= 164.000000 
Thread 0: c[83]= 166.000000 
Thread 0: c[84]= 168.000000 
Thread 0: c[85]= 170.000000 
Thread 0: c[86]= 172.000000 
Thread 0: c[87]= 174.000000 
Thread 0: c[88]= 176.000000 
Thread 0: c[89]= 178.000000 
Thread 0: c[120]= 240.000000 
Thread 0: c[121]= 242.000000 
Thread 0: c[122]= 244.000000 
Thread 0: c[123]= 246.000000 
+0

インターリーブされています。しかし、あなたが期待する粒度ではありません。私のマシンでは、別のスレッドが現れる前に100行ほどあります。 – Mysticial

答えて

0

は、あなたのマシンのシングルコアですか?もしそうなら、スレッドはおそらく順番に生成され、あなたのOSはラウンドロビンスケジューリングを使って各スレッドを実行します。マルチコアマシンでは、インターリーブドスレッドのみが表示されます。

EDIT:以下の私のコメントに沿って

、私は何を見たいのは、あなたのOSのスケジューラによってはそうではありませんこれは、スレッドが実行されるランダムだと思います。

単一のコアマシンでマルチスレッドを実行することは本当に便利ではありません。 2つのスレッドへの並列性は、パフォーマンスの向上をわずかにするかもしれませんが、リターンは小さくなります。フォークとジョインのオーバーヘッドにより、パフォーマンスが急速に低下します。

+0

これは、連続して生成された場合、私は単一のコアでopenmpを使用することに何の利点も見ません。インターリーブされた方法でスレッドを実行できるため、Pthreadはより優れています。 – klijo

+0

はい、pthreadsはインターリーブされた方法でスレッドを生成できますが、それらがランダムに実行されるわけではありません。これは、各スレッドが実行を開始するときにCPUの離散時間スロットを取得するだけなので、OSの問題になります。各スレッドがこのタイムスロット内で完了すると、すべてのスレッドが順番に作業を完了することがわかります。それ以外の場合は、ラウンドロビンスタイルで動作することがわかります(これがOSのスケジューリング方法を前提としています)。 – Pochi

関連する問題