2012-01-19 2 views
2

OpenMP를 사용하여 병렬 처리하는 문제가 발생했습니다. 많은 양의 데이터를 처리하는 동일한 코드 조각에 대해 주어진 횟수의 반복을 실행합니다. OpenMP가 적용되는 수준에서 각 스레드가 서브 볼륨을 처리하게합니다. 모든 반복에는 모든 작업량뿐만 아니라 모든 작업량이 있어야합니다.ICC, GCC 및 OpenMP

ICC로 컴파일 할 때 반복은 항상 예상 한 시간만큼 지속됩니다. 그러나 이상한 일이 있습니다 : GCC로 컴파일 할 때, 반복 당 시간은 증가하기 시작하여 최대 값에 도달 한 다음 안정화되는 주어진 값에 도달 할 때까지 다시 한 번 감소합니다. OpenMP없이 컴파일 된 동일한 프로그램은 ICC 또는 GCC를 사용할 때 차이가 없습니다.

누구나 해당 컴파일러에서 OpenMP의 동작을 관찰 했습니까?

[편집 1] : 가이드 및 정적 스케줄링 정책이 테스트되었습니다.

는 [EDIT 2] 코드는 다음과 다소 같습니다

COMP 난 * + 위치 K + J * n에서 직선 A의 값인가, B, C의 어떤 수행
#pragma omp parallel for schedule(static) private(i,j,k) 
for(i = 0; i < N; i++) 
    for(j = 0; j < N; j++) 
     for(k = 0; k < N; k++){ 
      a[ k+j*N+i*NN] = 0.f; 
      b[ k+j*N+i*NN] = 0.f; 
      c[ k+j*N+i*NN] = 0.f; 
      d[ k+j*N+i*NN] = 0.f; 
    } 
for(t = 0; t < T; t+=dt){ 
    /* ... change some discrete values in a,b,c .... */ 
    /*  and propagate changes     */  
    #pragma omp parallel for schedule(static) private(i,j,k) 
    for(i = 0; i < N; i++) 
     for(j = 0; j < N; j++) 
      for(k = 0; k < N; k++){ 
      d[ k+j*N+i*NN ] = COMP(a,b,c,k+j*N+i*NN); 
     } 
    } 

NN (및 일부 이웃). 중요한 것은 GCC와 ICC의이 코드가 내가 설명한 문제를 일으켰다는 것입니다. 중요한 점은, a, b, c, d의 초기화를 0.0f (f.ex, 0.5f)가 아닌 다른 값으로 변경한다는 사실을 알았 기 때문입니다. 시간 단계 증가 당 소요 시간이 발생하지 않는다는 것입니다.

[편집 3] : GOMP의 잘못이 아닌 것 같습니다. OpenMP가 비활성화 되어도 마찬가지입니다. 다시 한번, ICC (openmp가 없거나 없으면)는 전혀 발생하지 않습니다. 이 스레드를 닫을 수있는 방법이 있습니까?

+0

GCC 및 libgomp/환경 변수를 활성화/비활성화 해보십시오.'GOMP_CPU_AFFINITY = 0-31' 31 여기서 cpu core 수는 -1입니다. 더 예측 가능한 결과를 얻으려면'OMP_WAIT_POLICY = active'가 필요합니다. – osgx

+0

고마워요!그러나 나는 당신의 목적과 행동이 지속되도록 노력했습니다. OpenMP가 최적의 워크로드 배포를 찾을 때까지 다른 chunsize를 시도 할 수 있습니까? 나는 특정 chunksize를 설정하지 않았다. –

+0

여전히 동일한 동작을하는 일부 모델 코드를 표시 할 수 있습니까? – osgx

답변

1

5 월, COMP는 하드웨어가 아니라 소프트웨어로 수행되는 일부 작업을 수행합니다.이 작업은 소프트웨어에서 수행됩니다.denormal 작업이 수행됩니다.

비정규 작동은 비정규 모드로 비교할 때 실행 시간이 달라질 수 있습니다 (모든 비정규 값을 0으로 반올림 한 경우). 공정 계산을 비정규 적으로 수행하는 컴파일러에서 더 많은 작업이 이루어질 것입니다. 작업량은 반복마다 다를 수 있습니다. 기본적으로

인텔 컴파일러는 비정규 운영 및 세트 0으로 플러시 및 denormal을-있습니다 제로 어떤 -O 수준 (-O0, -O1, -O2, 등)에서 비활성화됩니다. (docs1)(docs2) 또는있을 수 있습니다 인텔 컴파일러의 -no-ftz 옵션-O1 중 하나로 설정되어 있지 -ffast-math 옵션 만 켜져 비정규이 - - 제로의 -fp-model precise

GCC 에서 :

은 사용에 비정규을 켜려면 , -O2, -O3 : (grep a -ffast-math). -ffast-math에는 denormals가 무시됩니다. (bug36821,comment#1)

따라서 COMP에 비정상적인 요소가있는 경우 ICC는이를 무시하고 GCC는 많은 소프트웨어 처리를 수행합니다.

비정품이 아닌 다른 부동 소수점 처리 차이가있을 수 있습니다.

+0

고맙습니다.하지만 해결책이 아닙니다. 사실, 계산 시간은 증가했지만 문제는 해결하지 않았습니다. –

+0

COMP에서 어떤 종류의 연산이 사용됩니까? CPU 란 무엇입니까? CPU에 "터보 부스트"또는 일부 절전 기능이 있습니까? AVX가 사용 되었습니까? – osgx

+0

COMP는 선형 연산을 수행합니다. 곱셈과 덧셈은 모든 것을 첫 번째 순서로 수행합니다. 동적 인 주파수에 어떤 관심사에서. cpu에서 (나는 당신이 그것을 의미하는 것 같아요), 나는 잘 모르겠다. 그리고 AVX에 관해서는, 어떤 종류의 벡터화도 도입하지 않았습니다. O3에서 컴파일러가 수행하는 것, 즉 XXMS 레지스터와 명령어를 사용하지만 스칼라 방식으로 만 사용합니다 (나는 그것을 확인하기 위해 어셈블러 코드를 검사했습니다) . –