2015-01-08 2 views
1

현재 멀티 코어 시스템에서 성능을 향상시키기 위해 C++ 프로그램을 병렬 처리하는 중입니다. OpenMP를 사용하여 문제 (스레드 동기화, 데이터 액세스 등)를 고려한 결과 우리는 전체 프로그램을 병렬화 할 수있는 방법을 찾았지만 성능 개선은 그리 압도적이지 않습니다.start_thread 클론은 병렬 프로그램에서 대부분의 시간을 소비합니다 - 잘못된 병렬 처리 또는 잘못된 보고서입니까?

Intel VTune Amplifier를 사용하여 핫스팟 검색을 수행하여 거의 모든 함수 호출에서 병렬로 수행해야하는 libgomp.so의 "start_thread clone"이 함수의 실제 실행보다 더 많은 시간이 걸리는 것으로 나타났습니다. 나는 현재의 OpenMP 구현에, 병렬 및 직렬 지역에서 전환 거의 수수료가 없어야 것을 확인 이후

Intel VTune Result Image

이 정말 뜻밖이다. this discussion에 따르면 프로그램이 시작될 때

스레드가 시작된다 (또는 처음이 필요하다 는 구현에 따라 다름). 다른 곳에서는 프로그램을 일시 정지하고 통지 스레드가 내가 이런 짓을

가 여전히거야, 나는 중지 어디 최초의 병렬 영역을하기 전에, 이후에 하나의 스레드 만이 있었다, 디버거에서 프로그램을 중지 (병렬 또는 직렬 영역), 여러 개의 스레드가있었습니다. 그래서 나는 매번 새로운 쓰레드를 "respawing"하는 데 오버 헤드가 없어야한다고 확신했습니다.

VTune은 측정 값을 이해할 수있는 한 다른 방식으로 알려줍니다. 누군가 여기서 나를 도울 수 있습니까?

+0

-g를 사용하여 모든 사용자 모듈에 대해 디버그 정보를 켜시겠습니까? 인텔 OpenMP 구현을 사용할 수 있습니까? 이상적으로 VTune에서 병렬 프로그램 프로파일 링을 가장 의미있는 것으로 만들기 위해 두 가지 작업을 모두 수행해야합니다. – zam

답변

1

이 라이브러리의 디버그 심볼을 포함하는 libgomp에 해당하는 디버그 패키지를 다운로드하십시오. VTune이 CPU 시간을 더 잘 분류 할 수 있습니다. 핫스팟에 libgomp가 있는지 여부는 잘못된 작업 분할의 결과로 Spin Lock에 의해 발생할 수 있습니다.

screenshot의 시간이 "start_thread clone"에 11 초가 걸린다는 것을 의미하지 않습니다. 즉, 핫 스폿 (해결되지 않은 기능)이 start_thread에서 calcGrowthStep 영역까지 11 초가 걸렸습니다.