다중 스레드 버전에서 PageRank 버전을 구현했습니다. 저는 4 코어 Q6600에서 실행하고 있습니다. 나는 그것이 4 개 스레드를 생성하는 설정 실행하면, 내가 얻을 : 나는 128 개 스레드를 실행하면왜 코어보다 스레드 수가 더 빠릅니까?
real 6.968s
user 26.020s
sys 0.050s
내가 얻을 :
real 0.545s
user 1.330s
sys 0.040s
이 나에게 아무 의미가 없습니다. 기본 알고리즘은 sum-reduce입니다.
- 모든 스레드는 입력의 일부를 합칩니다.
- 동기화;
- 각 스레드는 다른 스레드의 결과 중 일부를 누적합니다.
- 주 스레드는 모든 스레드의 중간 값을 합한 다음 계속할지 여부를 결정합니다.
프로파일 링이 도움이되지 않았습니다. 내 코드를 이해하는 데 어떤 데이터가 도움이 될지 모르겠다. 단지 물어보십시오.
정말 그게 당혹 스럽네.
이 경우 입력은 무엇입니까? 뭔가 IO 바인딩? 개별 단계에 대한 측정 값이 있습니까? –
더 많은 스레드가 있으면 각 스레드는 한 번에 완료 할 수있을만큼 작은 청크를 얻게 될 가능성이 있습니까? 일부 스케줄링 시스템은 스레드의 첫 번째 슬라이스에 약간의 시간을줍니다. 시간 내에 완료되지 않으면 일정이 잡히고 정상 조각에 참여합니다. 작업이 매우 단순한 수준으로 분류되는 경우 응용 프로그램에 대한 조각을 더 많이 확보하고 다른 프로세스를 강탈함으로써 "시스템을 도박"할 수 있습니다. 더 높은 우선 순위로 실행 해보고 유사한 결과를 얻는 지 확인할 수 있습니다. –
입력이 모두 처음부터 읽혀 지므로 IO 바운드가 아닙니다. 필자는 멀티 스레딩 코드의 상당 부분을 다시 작성하고 잘못된 공유의 인스턴스를 제거했습니다. 거짓 공유 수정으로 속도가 약간 증가했습니다. – laurencer