2011-05-13 7 views
7

다중 스레드 버전에서 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입니다.

  1. 모든 스레드는 입력의 일부를 합칩니다.
  2. 동기화;
  3. 각 스레드는 다른 스레드의 결과 중 일부를 누적합니다.
  4. 주 스레드는 모든 스레드의 중간 값을 합한 다음 계속할지 여부를 결정합니다.

프로파일 링이 도움이되지 않았습니다. 내 코드를 이해하는 데 어떤 데이터가 도움이 될지 모르겠다. 단지 물어보십시오.

정말 그게 당혹 스럽네.

+0

이 경우 입력은 무엇입니까? 뭔가 IO 바인딩? 개별 단계에 대한 측정 값이 있습니까? –

+0

더 많은 스레드가 있으면 각 스레드는 한 번에 완료 할 수있을만큼 작은 청크를 얻게 될 가능성이 있습니까? 일부 스케줄링 시스템은 스레드의 첫 번째 슬라이스에 약간의 시간을줍니다. 시간 내에 완료되지 않으면 일정이 잡히고 정상 조각에 참여합니다. 작업이 매우 단순한 수준으로 분류되는 경우 응용 프로그램에 대한 조각을 더 많이 확보하고 다른 프로세스를 강탈함으로써 "시스템을 도박"할 수 있습니다. 더 높은 우선 순위로 실행 해보고 유사한 결과를 얻는 지 확인할 수 있습니다. –

+0

입력이 모두 처음부터 읽혀 지므로 IO 바운드가 아닙니다. 필자는 멀티 스레딩 코드의 상당 부분을 다시 작성하고 잘못된 공유의 인스턴스를 제거했습니다. 거짓 공유 수정으로 속도가 약간 증가했습니다. – laurencer

답변

10

의도적으로 프로세서보다 많은 스레드를 생성하는 것은 쓰레드가 I/O, 뮤텍스 또는 기타 유용한 작업을 제공하여 뭔가 기다리는 것을 막는 "예비 사이클"을 사용하는 데 사용되는 표준 기술입니다 프로세서가 수행해야합니다.

스레드가 I/O를 수행하는 경우 속도 향상을위한 강력한 경쟁자입니다. 각 스레드가 I/O를 기다리는 동안 프로세서는 I/O를 차단할 때까지 다른 스레드를 실행할 수 있습니다 , 첫 번째 스레드에 대한 데이터가 준비 될 때까지 등등.

또 다른 가능한 원인은 스레드가 거짓 공유을 경험하고 있다는 것입니다. 동일한 캐시 라인 (예 : 배열의 인접 요소)에있는 서로 다른 값에 데이터를 쓰는 두 개의 스레드가있는 경우 캐시 라인이 앞뒤로 전송되는 동안 CPU를 차단합니다. 더 많은 스레드를 추가하면 인접한 요소에서 작동 할 가능성이 줄어들고 잘못된 공유 기회가 줄어 듭니다. 데이터 요소에 여분의 패딩을 추가하여 크기가 적어도 64 바이트 (일반적인 캐시 라인 크기)가되도록 쉽게 테스트 할 수 있습니다. 네 스레드 코드 속도가 빨라지면 이것이 문제가되었습니다.

+3

허위 공유에 대한 추측은 아주 좋은 것입니다. 하지만 런타임의 큰 차이를 고려할 때, 나는 작업 분할 논리에서 경쟁 조건 버그를 의심하기 때문에 많은 스레드가있는 버전이 일부 작업을 "잊어 버리고"다른 스레드만큼 많은 작업을 수행하지 못합니다. – Ringding

6

스레드가 메모리와 같은 일부 리소스를 차단하는 동안 여분의 CPU주기가있을 것입니다. 이러한 CPU주기는 다른 스레드에서 사용할 수 있습니다. 내가 본 데이터는 ... 4 스레드 버전이 각 코어의 100 % 사용률을 표시합니까? 그렇지 않은 경우 예비 CPU주기를 발견했습니다.

관련 문제