2012-02-15 2 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는 라운드 로빈 스케줄링을 사용하여 각 스레드를 실행합니다. 멀티 코어 머신에는 인터리브 스레드 만 표시됩니다.

편집 :

아래에있는 내 의견과 일치에서

, 나는 당신이보고 싶어하는 스레드가 당신의 OS 스케줄러에 따라 경우가 아닌 한, 실행하는 무작위 생각합니다.

단일 코어 머신에서 멀티 스레딩을하는 것은 실제로 유용하지 않습니다. 두 개의 스레드에 대한 병렬 처리는 성능을 약간 향상시킬 수 있지만 리턴이 줄어들고 포크와 조인의 오버 헤드로 인해 성능이 저하됩니다.

+0

순차적으로 생성되는 경우 단일 코어에서 openmp를 사용할 때 이점이 없습니다. 인터 스레드 방식으로 스레드를 실행할 수 있기 때문에 Pthread가 더 좋을 것입니다. – klijo

+0

예, pthreads는 인터리브 방식으로 스레드를 생성 할 수 있지만 임의로 실행한다는 의미는 아닙니다. 이는 각 스레드가 실행을 시작할 때 CPU에 대한 개별 시간 슬롯 만 얻으므로 OS 문제에 더 가깝습니다. 각 스레드가이 시간 슬롯 내에서 완료되면 모든 스레드가 작업을 순차적으로 완료하는 것을 볼 수 있습니다. 그렇지 않으면 당신은 그것들이 라운드 로빈 방식으로 작동하는 것을 보게 될 것입니다 (이것은 당신의 OS가 어떻게 스케쥴링 하는지를 가정 한 것입니다). – Pochi

관련 문제