2017-12-21 1 views
3

루프의 각 반복을 OpenMP 섹션으로 만들어 OpenMP에서 범위 기반 for 루프를 병렬 처리하려고합니다. 나는이 작업을 수행 할 수 :OpenMP가 for 루프 안에 섹션을 가질 수없는 이유는 무엇입니까?

#pragma omp parallel sections 
{ 

for (auto x : range) { 
    #pragma omp section 
    // LOTS OF CODE HERE 
} 

} 

그러나이 작동하지 않습니다 - 컴파일러는 섹션이 섹션을 구성의 #pragma OMP 내에 있어야합니다 뿌려줍니다. 내가 잘못했거나 OpenMP가이 섹션이 for 루프 내에 있다는 것을 이해할 정도로 똑똑하지 않습니까?

+1

Wjy 섹션이 아닌 테이크로 시도하지 않습니까? 그것은 더 자연스러운 코드 일 것입니다. – Harald

+1

작업을 의미합니까? – xcski

+1

죄송합니다. 예! 내가 의미하는 작업 :) – Harald

답변

2

OpenMP 섹션은 병렬로 실행될 수있는 다소 관련이없는 코드 비트 용입니다. 아이디어에는 알고리즘 내에서 수퍼 조직이 아니지만 어떤 순서로든 심지어는 병렬로 실행될 수있는 다른 부분이 있습니다. 이것은 매우 평범한 병렬 처리 방법으로 코드에서 많이 볼 수는 없습니다.

어쨌든 sections 구조 내의 모든 블록은 section 블록으로 둘러싸여 야하므로 코드는 표준을 준수하지 않습니다. 그러나 첫 번째 블록은 첫 번째 section 블록으로 암시 적으로 묶여 있으므로 선택 사항입니다. 여기에 암시 적으로 for 루프 앞에 암시 적으로 #pragma omp section을 추가해야하는 경우 코드가 가질 수있는 감각을 알 수 있습니다. 루프는 섹션에 있고 몸은 다른 ​​섹션에 있습니다.

for 루프를 사용하면 코드 구조가 매우 복잡해 지므로 omp parallel for 지시문을 사용할 수 있어야합니다. 루프 경계를보다 명확하게 나타 내기 위해 for 비트 만 다시 작성하면됩니다.

+0

루프를 기반으로 범위를 사용해야하므로이 작업을 명시 적으로 수행하고 있습니다. OpenMP는 omp parallel을 사용하여이 범위 기반 for 루프를 사용할 수 없습니다. 그래서 내가 섹션을 사용하는 이유입니다. 대신에 작업을 사용할 수 있습니다. – xcski

관련 문제