2012-06-26 4 views
0

8 스레드 컴퓨터에서 openMP와 병렬 처리되는 많은 for 루프를 포함하는 C++ 코드가 있습니다.openMP의 병렬 처리 효율성

그러나 단일 스레드로 실행하는 속도는 병렬 8 스레드보다 빠릅니다. for-loops의로드가 증가하면 병렬 처리가 효율적으로 수행된다고 들었습니다.

여기서로드 란 예를 들어 루프의 최대 반복 횟수를 의미합니다. 것은 다량의 데이터에 대해 단일 및 8 스레드 병렬 코드를 비교할 기회가 없다는 것입니다.

어쨌든 병렬 코드를 사용해야합니까? for-loops의로드로 인해 병렬화 효율성이 증가한다는 것이 사실입니까?

+1

귀하의 질문에 너무 광범위하고 너무 적합하지 않습니다. 이를 축소하고 몇 가지 코드 샘플을 제공하십시오. –

답변

2

OpenMP의 표준 사용 사례는 루프 반복에 직접 또는 간접적 인 종속성이없는 조건으로 높은 반복 횟수 루프 반복의 스레드 팀간에 배포됩니다.

질문을 고려하여 직접적인 의존성을 알 수 있습니다. 루프 반복 실행 순서가 결과에 영향을 줍니까?. 예를 들어, 반복 N + 1이 반복 결과 N을 사용하면 이와 같은 종속성이 있으므로 루프 반복을 역순으로 실행하면 루틴의 출력이 변경됩니다.

간접적 인 종속성은 주로 스레드가 공유 데이터에 대한 액세스를 조정해야한다는 것을 의미합니다. 특히 공유 변수에 대한 쓰기가 올바른 순서로 이루어 지도록 보장해야합니다.

많은 경우 종속성을 제거하기 위해 루프가있는 종속성을 다시 디자인 할 수 있습니다.

그런 종속성이없는 반복 횟수가 많은 루프가있는 경우 OpenMP를 사용하면 속도가 향상 될 수 있습니다. 여기 꾸은 : 루프 카운트가 부분적으로 또는 전체적으로 충분히 이러한 오버 헤드를 능가 수없는 높은 경우

  • 가의 고속화 개시하고 그러한 각 루프의 끝 부분에서 계산 일부 병렬 오버가 반복을 병렬로 실행합니다. 이것이 코드에 영향을 미치는지 확인하는 유일한 방법은 테스트하고 측정하는 것입니다.
  • 이미 반복 한 것보다 루프 반복 간의 종속성이 더있을 수 있습니다. 시스템 아키텍처와 루프 내부의 계산에 따라 스레드를 프로그래밍하여 캐시 또는 I/O 리소스 또는 다른 리소스에 대한 액세스를 처리 할 수 ​​있습니다. 최악의 경우 이것은 실행 속도를 줄이는 스레드 수를 증가시킬 수 있습니다.
  • 각 OpenMP 스레드는 하이퍼 스레딩이 나타내는 의사 하드웨어가 아닌 하드웨어로 백업해야합니다. OpenMP 스레드 당 하나의 코어 인 하이퍼 스레딩은이 도메인의 뱀 오일입니다.
  • 나는 여기에 넣을 다른 buts가있을 것으로 예상한다. 아마도 다른 누군가가 도와 줄 것이다.

지금, 당신의 질문에 돌려 :

  • 는 어쨌든 병렬 코드를 사용해야합니까? 테스트 및 측정.
  • for-loops의로드로 인해 병렬화 효율이 향상되는 것은 사실입니까? 약하지만 하드웨어의 코드에 대해 테스트하고 측정하십시오.

마지막으로, 상황의 다양한 조합에서 실행 시간을 측정하고 측정 결과를 알려주지 않으면 심각한 병렬 계산 주의자가 될 수 없습니다. 거대한 양의 데이터에 대해 순차 및 병렬 실행을 비교할 수 없다면 막대한 양의 데이터를 처리 할 때 동작에 대한 예측을하기 전에 알맞은 양의 데이터를 측정하고 배운 교훈을 이해해야합니다.