2012-02-23 3 views
0

OpenMP를 사용하여 각 스레드가 그리드의 하위 섹션에서 작동하는 2 차원 그리드에서 작업을 병렬 처리하고 싶습니다.OpenMP For 루프 범위

상한 및 하한이 주어진 하위 섹션을 처리하는 함수 f(lower,upper,grid)을 상상해보십시오 (아래쪽과 위쪽이 모눈 축 중 하나를 참조한다고 가정).

내가 가진 질문은 lowerupper을 명시 적으로 계산하지 않고 f을 호출 할 수 있는지 여부입니다.

예를 들어 for 루프가있는 경우 OpenMP는 자동으로 스레드간에 루프를 나눕니다. OpenMP가 범위를 나누어 범위의 청크를 f에 할당하는 방법이 있습니까?

감사합니다.

업데이트 : for 루프가 있다면

가 명확히하려면 :

#pragma omp parallel for 
for(int i=0;i<50;i++) 

의 OpenMP는 루프 나눌 것입니다. 제가 알고 싶은 것은 for 루프가 어떻게 나뉘어 졌는지를 아는 것과 같습니다. 나는 당신의 질문에 대한 대답은 아니오 것을 합리적으로 확신 parallel for

+0

OpenMP에서 2D 작업 세트를 동적으로 예약하도록 요청하고 있습니까? – Mysticial

+0

2D 데이터에는 여러 가지 복잡한 계산이 포함되므로 '붕괴'가있는 'for'의 간단한 적용은 실현 될 수 없습니다. OpenMP가 루프의 '하한'경계와 '상한'경계를 동적으로 구분하여 그 경계가 무엇인지를 알 수 있습니다. – Richard

+0

OpenMP가 범위를 "파악"하는 방법을 알지 못합니다. (나도 알아낼 수 없지만 ...)? 어떤 시점에서, 당신은 어떤 종류의 범위를 제공해야합니다. – Mysticial

답변

0

보다는 각 작업이 얼마나 큰 따라 omp task을 시도 할 수 있습니다

+0

아아아, 이것이 유일한 길이라는 것이 맞을지도 모릅니다. 나는이 예에서 OpenMP 패러다임이 내 애플리케이션에 적합하지 않다고 생각한다. 대안으로 TBB를 연구 중입니다. – Richard

0

(무거운 오버 헤드가. 난 당신과 같은 코드를 작성해야 할 것이라고 생각

f(lower(omp_get_thread_num()),upper(omp_get_thread_num()),grid) 

upper()lower() 지금 당신이 원하는 도메인 분해를하고있는가 입력 인수로 스레드 ID를 가지고 함수입니다.

OpenMP을 자신의 작업 방식에 맞추거나 OpenMP로 작업 방식을 적용 할 것인지 (OpenMP가 루프 반복을 스레드간에 나누는 것을 의미 함)를 결정하는 것은 여러분에게 달려 있습니다.) 문제가 있습니다.

+0

'omp task'가 동적으로 범위의 청크를 할당하는 것과 어떻게 관련이 있는지는 명확하지 않습니다. 아마도 그 질문을 이해하지 못했을 것입니다. 의견은 명확히하는 데 도움이 될 수 있습니다. – Richard