2015-01-19 2 views
0

for 루프가 병렬 처리되는 openMP 프로그램이 있습니다. 마스터 스레드가 많은 경우를 제외하고는 모든 스레드가 나머지 스레드보다 몇 배 빠릅니다 ... 예를 들어 4 개의 스레드로 실행 중일 때 스레드 0은 다른 스레드보다 오래 전에 완료되지만 동일한 스레드를 실행하고 있습니다 코드로, 거의 동일한 양의 작업이 가능합니다.일반 openMP - 스레드 속도가 다릅니다

Windows에서 리소스를 처리하고 프로그램에서 사용하는 스레드에서 작업을 스왑하고 느리게 처리 할 수 ​​있습니까? 아니면 내 코드가 문제가 될 가능성이 더 큽니까? 이 프로그램이 OS에서 발생하는 피할 수없는 문제인 경우 프로그램에서 오류를 찾는 데 시간을 낭비하지 않도록하고 싶습니다. ...

+1

실제 코드가 공개되지 않고 나쁜 행동을 제공하는 것은 무엇입니까? 그러나 참조를 원하면 http://stackoverflow.com/questions/13355559/openmp-slower-more-than-one-threads-cant-figure-out을 참조하십시오. – user1929959

+0

게시하기에 너무 많은 코드가 있다고 생각합니다 ... 질문은 실제로 openMP의 일반적인 동작에 관한 것입니다. 각 스레드에서 똑같이 빠르게 계산할 수 있습니까? – MikkelSecher

+0

중요한 부분을 버리지 않고 필수 요소로 코드를 추출하는 데 시간을 허비하지 않으면 질문이 닫힐 수 있습니다. –

답변

0

스레드가 우선 순위를 갖는 이유는 OpenMP 런타임과 OS간에 문제가 될 수 있습니다. 어떤 컴파일러를 사용하고 있습니까? 스레드가 종료되면 어떻게 측정합니까?

이 경우 OpenMP 병렬 성능을 향상 시키려면 schedule 지시문과 함께 동적 스케줄링 정책을 사용합니다. 마스터 쓰레드가 CPU에서 더 많은 사이클을 얻는다면,이 경우 더 많은 작업을 수행 할 것입니다. 일반적으로 각 스레드를 똑같은 속도로 계산할 수는 없지만 크기 차이가있는 순서를 관찰하는 경우 런타임과 OS 사이의 불일치처럼 들릴 수 있습니다.

+0

고마워,이게 내가 찾던 해답이었다. 몇 가지 실험을 한 후에, 백그라운드에서 OS에서 실행되는 프로세스가 적을수록 스레드가 더 많이 실행된다는 것이 분명 해졌다. 사용 가능한 모든 코어를 사용할 때 스레드 중 하나가 항상 상당히 느립니다. 슈퍼 컴퓨터의 한 노드에있는 노드에서 32 개의 코어를 테스트하고 많은 리소스를 사용하여 큰 운영 체제를 실행하지 않을 때 성능이 더 균일하지 않은지 확인합니다. – MikkelSecher

+0

또한 프로세스 바인딩에주의해야합니다. 스레드를 정확히 동일한 속도로 가져 오는 것이 항상 실용적이지는 않을 수 있으므로 OpenMP 내에서 동적 스케줄링을 고려하는 것이 좋습니다. – user2548418

0

스레드 찾기 실행은 많은 일들에 의존하므로 많은 가능성이있을 수 있습니다. 스레드가 작업을 완료 할 때 리소스를 해제해야 할 때처럼 잠금 메커니즘이 있는지 또는 리소스 가용성인지 등이 있습니다. 더 많은 요소가 있습니다. 그래서 내가 제안하는 것은 vtune이라는 도구를 사용하고 코드를 프로파일 링하면 스레드가 시간과 이유를 낭비하는 곳이 어디인지 명확하게 알 수 있습니다. 나는 그것이 도움이되기를 바랍니다.

관련 문제