나는 C로 프로그램을 작성했습니다. 연구 결과로 작성된 프로그램입니다. 프로그램이 소비하는 정확한 CPU주기를 계산하고 싶습니다. 정확한 사이클 수. 어떻게 찾을 수 있습니까?프로세스에 의해 소비 된 CPU 클럭을 측정하십시오.
답변
아니요. 'CPU주기'의 개념은 잘 정의되어 있지 않습니다. 최신 칩은 여러 클럭 속도로 작동 할 수 있으며, 각기 다른 시간대에 서로 다른 작업을 수행 할 수 있습니다.
'전체 파이프 라인 단계 수'는 어떤 경우 의미가있을 수 있지만 얻을 수있는 방법은 없을 것입니다.
죄송 합니다만, 실용적인 것은 아닙니다. 대부분의 일반적인 OS에서는 불가능합니다. 예를 들어, 상당수의 OS는 인터럽트를 처리하기 위해 전체 컨텍스트 스위치를 수행하지 않으므로 인터럽트를 처리하는 데 소요되는 시간은 인터럽트 발생시 실행되는 모든 프로세스에 소요되는 시간이 될 수 있습니다.
"실제 목적이 아님"은 정확한 사이클 시뮬레이터에서 프로그램을 실행할 가능성을 나타냅니다. 이것들은 이용 가능하지만, 주로 실시간 임베디드 시스템에서 주로 사용되는 CPU를위한 것이지, 완전한 PC와 같은 것은 아닙니다. 더 나쁜 것은, (일반적으로) 본격적인 OS처럼 실행하는 것이 아니라 "베어 메탈 (bare metal)"에서 실행되는 코드를 실행하는 것입니다.
이론 상으로는 Windows 또는 Linux와 같은 가상 컴퓨터에서 실행될 수있는 작업을 수행 할 수도 있지만 기존의 가상 컴퓨터에 대해서는 알지 못합니다. 아마 성능면에서도 꽤 심각한 결과를 낳을 것입니다.
valgrind
도구 cachegrind
(valgrind --tool=cachegrind
)은 실행 된 명령 수, 캐시 누락 및 분기 예측 누락을 포함하여 자세한 출력을 제공합니다. 이들은 어셈블러의 개별 라인까지 설명 될 수 있으므로 원칙적으로 정확한 아키텍처에 대한 지식을 가지고이 출력에서 정확한 사이클 수를 도출 할 수 있습니다.
캐시 효과로 인해 실행에서 실행으로 변경됩니다.
cachegrind tool is here에 대한 설명서입니다.
시도 OProfile. CPU의 다양한 하드웨어 카운터를 사용하여 실행 된 명령어 수와 몇 사이클이 경과했는지 측정합니다. 이 기사의 사용 예는 Memory part 7: Memory performance tools에서 확인할 수 있습니다.
정확히 무엇을하려는 것인지 잘 모르겠지만 현대 x86 프로세서에서 수행 할 수있는 것은 관심있는 코드 블록 전후에 time stamp counter (TSC)을 읽는 것입니다. 어셈블리 레벨에서는 edx:eax
레지스터 쌍의 TSC 값을 제공하는 RDTSC
명령어를 사용하여 수행됩니다.
그러나이 접근 방식에 대한 특정주의 사항이 있습니다 (예 : 프로세스가 CPU0에서 시작하여 CPU1에서 끝나면 RDTSC
에서 가져온 결과는 명령을 실행 한 특정 프로세서 코어를 참조하므로 비교할 수 없습니다. (RDTSC
과 함께 명령 직렬화가 부족하지만, 여기서는이 점이별로 문제가되지 않는다고 생각합니다.)
정확합니다. 명령 스트림을 최적화하고 지침을 중복시킬 수있는 프로세서는 어떻습니까? 그것은 무엇으로 계산합니까? http://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts/ –