2012-06-07 7 views
0

첫 번째 게시물!스레드의 임의 번호 생성 openmp

주요 편집 ..

나는 -fopenmp와 GCC를 사용하여 컴파일 내적을 계산하기 위해이 프로그램을 가지고있다. 문제는 그것이 생성하도록 말하는 쓰레드의 수를 생성하지 않는다는 것입니다. 한 컴퓨터에서 다른 스레드에 2 개의 스레드를 지속적으로 생성합니다.이 두 숫자는 모두 주어진 숫자가 아닙니다. chunkksize를 변경하여 원하는 스레드 수를 선택할 수있는 간접적 인 방법 인 (static, chunksize) 스케줄링을 사용하고 있습니다. 모든 컴퓨터가 동일한 실행 파일을 사용하고 있기 때문에 런타임에 내 지침을 무시하는 무언가가있는 것 같습니다. 나는 또한 프로그램에 전체로드와 동일한 청크 분할을 주면 하나의 스레드를 사용하지만 이전 스레드와 동일한 수의 스레드를 생성한다는 것을 알았습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

#pragma omp parallel shared(vector1, vector2, loadsize, vectorsize, final_sum) private(i, threadsum, threadid) 
    { 
    threadsum = 0; 
    threadid = omp_get_thread_num(); 

    #pragma omp for schedule(static, loadsize) 
     for (i = 0; i < vectorsize; i++){ 
      threadsum += vector1[i] * vector2[i];} 
    printf("thread %d reached up to index %d with a sum of %d\n", threadid, (i-1), threadsum); 
    #pragma omp critical 
     final_sum += threadsum; 
} 
printf("final sum: %d", final_sum);  

감사합니다,

내가 아는 한

답변

1

는 chunksize 영역은 작업의 양이 스레드에 의해 수행되어야 나타냅니다. 스레드의 생성을 제어하지 않습니다. 당신이 당신의 코드에서 볼 수 있듯이, 스레드는 당신이 스레드에 할당 된 작업의 양을 결정하는 데 사용됩니다

#pragma omp for schedule(static, loadsize) 

정적 및 동적 스케줄링을 호출 할 때

#pragma omp parallel 

를 호출 할 때 산란된다 , 컴파일 타임 또는 런타임에. 따라서 예약 수를 스레드 수와 혼동하지 마십시오.

당신이 스레드의 수를 제어해야하는 경우

omp_set_num_threads() 
+0

고맙습니다. 생성 할 수있는 스레드 수에 대한 기본 제한이있는 것처럼 보입니다. 나는 omp_get_max_threads()를 사용하여 그것들을 검사했고 단지 2 개의 스레드로 제한된다는 것을 알았습니다. – zedjay72

0

의 OpenMP 스레드의 동적 수라는 기능이 있습니다 사용합니다. 실행 시간은 병렬 블록이 OMP_NUM_THREADS으로 지정된 것보다 적은 스레드로 실행할 수 있는지를 자유롭게 결정할 수 있습니다. 이 다음 방법 중 하나를 비활성화 할 수 있도록 경우 일부 런타임은 기본적으로 활성화되어 있습니다 :

  • FALSEOMP_DYNAMIC 환경 변수의 값을 설정;
  • omp_set_dynamic(0);
  • 명시 적 병렬 영역의 스레드 수를 num_treads(#threads) 절로 명시 적으로 지정하십시오.

omp_set_num_threads()뿐만 아니라 사용되는 스레드의 수의 상한을 설정 OMP_NUM_THREADS 환경 변수 값하지만 동적 스레드가 활성화되는 경우에는 실제 개수는 여전히보다 덜 될 수있다. OMP_NUM_THREADS의 기본값은 구현에 따라 다르며 GCC 및 Intel 컴파일러의 논리 CPU 수와 같으며 최신 Oracle Studio 컴파일러의 경우 2과 같습니다.