2012-02-12 3 views
7

이론적으로는 다중 스레드로 확장되는 프로그램이 있습니다. 이론적으로는 선형 적으로 확장해야합니다. 더 작은 청크로 분할되고 시스템 호출, 라이브러리 호출, 잠금, 네 개의 스레드로 실행하는 것은 쿼드 코어 시스템에서 단일 스레드로 실행하는 것보다 약 두 배 빠릅니다. 반면에 네 번 속도는 네 번에 가깝습니다.다중 스레드 성능 및 프로파일 링

pthreads, C++ 0x 스레드 및 OpenMP를 사용한 구현의 런타임은 동의합니다.

원인을 찾아 내기 위해 gprof (쓸데없는)와 valgrind (나는 아무것도 눈에 띄지 않았습니다)를 시도했습니다. 경기 침체의 원인을 효과적으로 벤치마킹 할 수 있습니까? 가능한 원인에 관한 일반적인 아이디어?

- 업데이트 -

계산은 몬테 카를로 통합을 포함하고 나는 시간의 부당한 금액을 임의의 숫자를 생성 소요되는 것으로 나타났습니다. 아직 4 개의 스레드에서 이것이 발생하는 이유는 모르지만 난수 생성기가 재진입 성이 아니라는 것을 알았습니다. 뮤텍스를 사용하면 실행 시간이 폭발합니다. 다른 문제를 확인하기 전에이 부분을 다시 구현하겠습니다.

성능을 크게 향상시킨 샘플링 클래스를 다시 구현했습니다. 나머지 문제는 사실 CPU 캐시의 논쟁이었습니다 (Evgeny가 의심 하듯이 캐시 그 린드에 의해 밝혀졌습니다).

답변

4

oprofile을 사용할 수 있습니다. 또는 가난한 사람의 의사 프로파일 러 : gdb에서 프로그램을 실행하고 중지 한 다음 중지 된 부분을 찾으십시오. "valgrind --tool = cachegrind"는 CPU 캐시가 얼마나 효율적으로 사용되는지 보여줍니다.

몬테카를로 통합은 매우 메모리 집약적 인 알고리즘 인 것으로 보입니다. 메모리 대역폭이 어떻게 사용되는지 추정 해보십시오. 그것은 프로그램의 성능을 제한하는 요소 일 수 있습니다. 또한 시스템에 하이퍼 스레딩이있는 2 코어 만있는 경우 2 스레드와 비교하여 4 스레드의 경우 더 빨리 작동하지 않아야합니다.

관련 문제