2013-12-21 6 views
1

우리는 다음 아키텍처의 작은 C++ 프로젝트를 보유하고 있습니다.알고리즘과 미리 컴파일 된 참조 구현의 속도 비율은 컴퓨터마다 다릅니다.

이 두은 DLL로 컴파일했다 :

  • 알고리즘
  • 결과의 정확성을 확인하고, 실행 속도를 측정하는 알고리즘 테스터.

그런 다음 다른 사람이 동일한 알고리즘을 구현했습니다.

  • 알고리즘의 구현에 모두 테스터를 호출하고 그 실행 속도 측정 :

    main() 기능이 수행. 이 작업은 여러 번 수행되므로 평균을 나중에 취할 수 있습니다.

  • 그들 사이의 속도 비율 (측정 된 시간/측정 된 기준 시간)을 계산하십시오. 이를 점수라고합니다.

다른 컴퓨터에서 동일한 코드와 DLL을 실행하면 매우 다른 속도 비율이 반환되는 것으로 나타났습니다. 한 컴퓨터에서 구현은 6.4 점을 받았고 동일한 구현은 다른 컴퓨터에서 2.8 점을 기록했습니다. 어떻게 그럴 수 있니?

+0

"미리 컴파일 된 참조 구현 대 알고리즘의 속도 비율은 컴퓨터에 걸쳐 다르다"- 그래, 그 프로그래머가 아닌 "실제 생활"부르는. –

+0

왜 비율이 (대략) 같을 것으로 예상합니까? – dyp

+1

컴퓨터는 모든 종류의 다소 미묘한 차이가 있습니다.예를 들어 기본 알고리즘 A와 추가 메모리를 요구하는보다 광범위한 캐싱 알고리즘 B를 고려하십시오. 시스템 1에서는 사용 가능한 RAM에 모두 적합하고 B는 빠르지 만 시스템 2 알고리즘 B에서는 스와핑을 시작하고 크롤링 속도가 느려짐 – doynax

답변

1

이 요소의 톤,하지만 여기에 몇 가지 수 :

  • CPU 캐시가 큰 하나가 될 수 있습니다. 서로 다른 프로세서는 캐시가 다릅니다 (원시 캐시 크기뿐 아니라 캐시 전략에 대해서도 마찬가지입니다). 하나는 다른 것보다 "더 똑똑"할 수도 있고, 아니면이 특정 상황에서 다른 것보다 더 잘 작동하는 것일 수도 있습니다.
  • CPU 파이프 라이닝. 지시 사항은 요즘은 단일 스레드 실행에서도 CPU에서 인터리브됩니다. CPU 파이프 라인이 작동하는 방식은 CPU마다 다르며 한 CPU는 한 번에 두 가지 특정 작업을 수행 할 수 있지만 다른 CPU는 수행 할 수 없습니다. 구현 중 하나가이를 이용하면 속도 향상을 얻습니다 (또는 둘 다 수행하면 둘 다 같은 속도에 가까워집니다).
  • CPU 명령 실행 시간은 다를 수 있습니다. 따라서 다른 CPU와 똑같은 명령어를 실행하는 한 CPU가 다른 CPU보다 더 빠르게 각각의 명령어를 처리 할 수 ​​있습니다. 한 컴퓨터의 CPU가 특정 명령을 사용하는 데 더 오랜 시간이 걸리면 (구현 중 하나가 해당 명령을 사용하는 경우) 다른 CPU가 해당 명령의 실행 시간을 단축하도록 향상되었지만 시간 차이가 커집니다.
  • CPU의 분기 예측 모델은 다를 수 있으며 특정 구현은 특정 CPU의 분기 예측 모델에 어느 정도 친숙 할 수 있습니다.
  • 운영 체제는 여러 가지면에서 메모리 할당 전략 (여러 운영 체제가 서로 다른 불일치를 유발하는 메모리 할당 전략을 갖고있는 반면 다른 운영 체제는 불일치를 최소화하는 다른 할당 전략을 가짐), CPU 시간 슬라이스 관리 (예 : 멀티 스레드 알고리즘입니까?)
관련 문제