2013-01-05 1 views
1

연속 스레드 프로세서가있는 4 개의 스레드가있는 4 개의 팀을 만들어야합니다.GCC 및 OMP를 사용하는 C의 특정 스레드 순서

내가 기대하고있어 결과는, 예를 들면 :

Team 0 Thread 0 Processor: 0 
Team 0 Thread 1 Processor: 1 
Team 0 Thread 2 Processor: 2 
Team 0 Thread 3 Processor: 3 
Team 1 Thread 0 Processor: 4 
Team 1 Thread 1 Processor: 5 
Team 1 Thread 2 Processor: 6 
Team 1 Thread 3 Processor: 7 
Team 2 Thread 0 Processor: 8 
Team 2 Thread 1 Processor: 9 
Team 2 Thread 2 Processor: 10 
Team 2 Thread 3 Processor: 11 
Team 3 Thread 0 Processor: 12 
Team 3 Thread 1 Processor: 13 
Team 3 Thread 2 Processor: 14 
Team 3 Thread 3 Processor: 15 

나는 GOMP_CPU_AFFINITY 변수를 사용하여 GCC에서 프로세서 선호도를 처리 할 수 ​​있습니다.

내가 사용하고 있습니다 :

#pragma omp parallel num_threads(4) 

을 두 번 위해 2 개 포크 수준을 얻을 수 있습니다.

0 4 8 12 1 2 3 5 6 7 9 10 11 13 14 15 

은 그래서 첫 번째 포크는 "아버지 포크", 가져옵니다 : 나는 데 문제가

Team 0 Thread 0 Processor: 0 
Team 1 Thread 0 Processor: 4 
Team 2 Thread 0 Processor: 8 
Team 3 Thread 0 Processor: 12 

내가 GOMP_CPU_AFFINITY에서이 순서를 보내고 있습니다 순간

두 번째 그룹의 포크는 아무런 순서없이 만들 수 있습니다. 예를 들어, 나는이 상황을 가질 수 있습니다. (#pragma omp 원자를 사용하여 언제든지 더 많은 프로세서를 요구할 수 있습니다.)

Team 0 Thread 0 Processor: 0 
Team 0 Thread 1 Processor: 5 
Team 0 Thread 2 Processor: 6 
Team 0 Thread 3 Processor: 7 
Team 1 Thread 0 Processor: 4 
Team 1 Thread 1 Processor: 13 
Team 1 Thread 2 Processor: 14 
Team 1 Thread 3 Processor: 15 
Team 2 Thread 0 Processor: 8 
Team 2 Thread 1 Processor: 1 
Team 2 Thread 2 Processor: 2 
Team 2 Thread 3 Processor: 3 
Team 3 Thread 0 Processor: 12 
Team 3 Thread 1 Processor: 9 
Team 3 Thread 2 Processor: 10 
Team 3 Thread 3 Processor: 11 

질문 : 두 번째 탄원서를 순서대로 작성하는 방법이 있습니까? 내가 잠금 또는 무언가 일부 sinchronization 방법을해야 할 것이라고 생각

... 사전에

감사합니다!

  • 하비에르
+0

왜, 왜, 왜, 왜? 스레드는 비동기 적으로 작동해야합니다. 이 질문은 '부동 소수점 비교가 작동하지 않음'보다 더 자주 발생합니다. –

+0

@Martin : 그는 무엇이든 동기화하는 것에 대해 이야기하는 것이 아니라 스레드 ID를 프로세서 ID (NUMA 시스템에서 중요 할 수 있음)에 할당하는 것에 대해 이야기하고 있습니다. –

+0

@MartinJames : 특정 프로세서 코어에 스레드를 할당하는 데 문제가 있습니까? 잘못된 공유 영향을 최소화하기 위해 데이터를 공유하는 스레드가 동일한 프로세서에서 작동하는지 확인하는 것은 이후 ccNUMA 시스템의 성능에 매우 중요 할 수 있습니다. – Grizzly

답변

1

마지막으로 나는이 내 코드는이 작품 만들 수 :

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

int main(int argc, char *argv[]){ 
    int padre, hijo; 

    int contador = 0; 
    omp_set_nested(1); 
    int suma; 
    #pragma omp parallel private(padre) shared(contador) num_threads(4) 
    { 
     padre = omp_get_thread_num(); 

     { 

      while(contador != padre){ 
       // Don't know what to put here 
      }; 

      #pragma omp parallel private(hijo) shared(padre, contador) num_threads(4) 
      { 
       hijo = omp_get_thread_num(); 
       printf("\nFather: %d Son: %d Processor: %d\n", padre, hijo, sched_getcpu()); 
       #pragma omp master 
       { 
        contador++; 
       } 
      } 
     } 
    } 
} 

참고 : 신부님은 아버지, Hijo는 아들과 콘타 도르는 스페인어로 카운터입니다 : P

제가 직면 한 문제는 -O3 최적화로 코드를 컴파일하면 while 루프가 printf 행을 루프 안에 넣지 않으면 '사라진다'는 것입니다. 나는 다른 질문으로 그것을 묻어야한다고 생각한다.

여러분 모두에게 감사드립니다.

  • 하비에르