2011-02-05 5 views
4

세 개의 중첩 루프가 있지만 가장 안쪽 만 병렬 처리가 가능합니다. 외부 및 중간 루프 정지 조건은 가장 안쪽 루프에 의해 수행 된 계산에 따라 달라 지므로 순서를 변경할 수 없습니다.openmp를 사용하여 내부 루프를 병렬화하십시오.

필자는 가장 안쪽 루프 바로 앞에서 OPENMP pragma 지시문을 사용했지만 두 스레드가있는 성능은 1보다 성능이 더 좋지 않습니다. 나는 스레드가 외부 루프의 반복마다 만들어지기 때문이라고 생각합니다.

외부 루프 외부에서 스레드를 만들 수 있지만 가장 안쪽 루프에서 스레드를 만드는 방법은 없습니까? 사전

+2

코드를 표시하거나 문제를 보여주는 간단한 예제를 보여주십시오. –

답변

4

현재의 멀티 코어 컴퓨터 시스템은 이러한 미세한 내부 루프 병렬 처리에는 적합하지 않습니다. 스레드 생성/분기 문제 때문이 아닙니다. Itjax가 지적했듯이, 사실상 모든 OpenMP 구현은 스레드 풀을 이용합니다. 즉, 많은 스레드를 사전 작성하고 스레드가 파킹됩니다. 따라서 실제로는 스레드를 생성하는 오버 헤드가 없습니다. 스레드 작업/작업을 파견

  • :

    그러나 이러한 병렬화 내부 루프의 문제는 두 개의 오버 헤드를 따르고 있습니다 적어도 우리가 작업을 할당해야 우리가 물리적 스레드를 만들 필요가없는 경우에도 (= 논리적 작업 생성) 주로 동기화가 필요한 스레드

  • 스레드 결합 : 팀의 모든 스레드가 끝나면이 스레드를 결합해야합니다 (OpenMP 지시문을 사용하지 않은 경우). 이것은 일반적으로 매우 집중적인 동기화 인 장벽 작업으로 구현됩니다.

따라서 스레드 할당/결합의 실제 수를 최소화해야합니다. 호출 당 내부 루프의 작업량을 늘려 오버 헤드를 줄일 수 있습니다. 루프 언 롤링과 같은 일부 코드 변경으로이를 수행 할 수 있습니다.

4

OpenMP를 에서

덕분에 스레드 풀을 사용해야합니다, 그래서 당신은 스레드 당신이 루프를 실행할 때마다 다시되지 않습니다. 엄밀히 말하자면, 이는 사용중인 OpenMP 구현에 달려 있습니다 (GNU 컴파일러가 풀을 사용한다는 것은 알고 있습니다). 허위 공유와 같은 다른 일반적인 문제를 찾아 보시기 바랍니다.

+0

모든 댓글 주셔서 감사합니다. 나는 내 코드를 다시 살펴볼 것이다. 누구든지 멀티 스레드 코드를 위해 좋은 무료 프로파일 러/코드 분석기를 제안 할 수 있습니까? – Hernan

+1

@Hernan, 인텔 ® 스레드 프로파일 러 – osgx

+0

@osgx, 인텔 프로파일 러는 매력처럼 작동합니다. –

관련 문제