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가 없거나 없으면)는 전혀 발생하지 않습니다. 이 스레드를 닫을 수있는 방법이 있습니까?
GCC 및 libgomp/환경 변수를 활성화/비활성화 해보십시오.'GOMP_CPU_AFFINITY = 0-31' 31 여기서 cpu core 수는 -1입니다. 더 예측 가능한 결과를 얻으려면'OMP_WAIT_POLICY = active'가 필요합니다. – osgx
고마워요!그러나 나는 당신의 목적과 행동이 지속되도록 노력했습니다. OpenMP가 최적의 워크로드 배포를 찾을 때까지 다른 chunsize를 시도 할 수 있습니까? 나는 특정 chunksize를 설정하지 않았다. –
여전히 동일한 동작을하는 일부 모델 코드를 표시 할 수 있습니까? – osgx