2017-11-20 4 views
0

위해 나는 다음과 같은OpenMP의 불평등 한 부하가 루프

따라서
while(counter < MAX) { 
    #pragma omp parallel reduction(+:counter) 
    { 
    // do monte carlo stuff 
    // if a certain condition is met, counter is incremented 

    } 
} 

처럼 보이는 OpenMP의 코드가, 아이디어는 병렬 섹션은 한 카운터가 일정 이하로 사용 가능한 스레드에 의해 실행됩니다 있다는 것입니다 값. 시나리오에 따라 (나는 여기 MC 것들을하고 있기 때문에 무작위이다.) 계산은 다른 것들보다 오래 걸릴 수있다. 그래서 여기에 노동자들 사이의 불균형이있다. 여기에는 평행선의 끝 부분에있는 암시 적 장벽으로 인해 명백해진다. 섹션.

#pragma omp parallel은 for (for nowait 지시문/동적 스케줄링)을 우회하는 방법이있을 수 있지만 for 루프의 상위 반복 번호를 알지 못해이를 사용할 수 없습니다.

어떤 아이디어/디자인 패턴과 같은 상황을 어떻게 다룰까요?

감사합니다.

답변

0

모든 항목을 단일 병렬 섹션에서 실행하고 counter에 기본적으로 액세스합니다.

int counter = 0; 
#pragma omp parallel 
while(1) { 
    int local_counter; 
    #pragma omp atomic read 
    local_counter = counter; 
    if (local_counter >= MAX) { 
      break; 
    } 
    // do monte carlo stuff 
    // if a certain condition is met, counter is incremented 
    if (certain_condition) { 
     #pragma omp atomic update 
     counter++; 
    } 
} 

atomic 액세스로 인해 while 조건에서는 직접 확인할 수 없습니다. 이 코드는 오버 슛 할 것입니다. 즉, 병렬 섹션 이후에 counter > MAX이 가능합니다. counter은 많은 스레드가 공유하고 읽고 업데이트합니다.

+0

감사합니다. - 즉시 사용해 보겠습니다. 감축 조항은 더 이상 필요하지 않습니다. 내 말은, 원자 적 연산을 사용하면 코드가 이미이 작업을 처리하고있는 것입니다. 맞습니까? – tomseidel1

+0

예이 경우 축소 절이 잘못되었습니다 - 죄송합니다. Atomics는 1) '카운터'가 올바른 총 시간을 업데이트하고 2) 항상 유효한 값을 읽어야합니다. – Zulan

+0

한 가지 더 일반적인 질문 : 스레드가 복잡한 구조체에 액세스해야하는 상황을 처리하는 가장 좋은 방법은 무엇입니까 (예를 들어, 동적으로 할당 된 배열을 의미합니다). 현재의 접근 방식은 단순히 공유되어 있었고 어떤 문제도 알지 못했습니다. 그러나 궁금합니다. 왜 #pragma atomic read가 필요합니까? firstprivate 구조체에 대한 다음 더 적합한 것인가? – tomseidel1