2013-06-09 4 views
8

어셈블리 명령어 레벨에서 코드를 프로파일 링 할 때, 현대 CPU가 명령어를 순차적으로 또는 순차적으로 실행하지 않는다면 명령어 포인터의 위치는 실제로 무엇을 의미합니까? 예를 들어, 다음의 x64 어셈블리 코드를 가정명령어 수준 프로파일 링 : 명령어 포인터의 의미?

mov RAX, [RBX];   // Assume a cache miss here. 
mov RSI, [RBX + RCX]; // Another cache miss.    
xor R8, R8;   
add RDX, RAX;   // Dependent on the load into RAX. 
add RDI, RSI;   // Dependent on the load into RSI. 

어떤 명령에 명령 포인터는 대부분의 시간을 보낼 것인가? 나는 그들 모두를 위해 좋은 인수 생각할 수 있습니다 : 그것은 캐시 미스 때문에

  • mov RAX, [RBX]

    아마 사이클의 100 단위를하고있다.
  • mov RSI, [RBX + RCX]도 100s 사이클이 걸리지 만 이전 명령과 병렬로 실행됩니다. 명령어 포인터가 이것들 중 하나에 있다는 의미일까요?
  • xor R8, R8은 메모리로드가 끝나기 전에 순서가 잘못되어 종료되지만 명령 포인터는 이전 명령도 모두 완료 될 때까지 여기에 머물러있을 수 있습니다.
  • add RDX, RAX은 느린 캐시 미스가로드 된 후 실제로 RAX의 값이 사용되는 명령이므로 파이프 라인 스톨을 생성합니다.
  • add RDI, RSI도로드가 RSI에 종속되어 있기 때문에 스톨됩니다.

답변

6

CPU는 단지 건축 레지스터 (RAX, RBX, 등)가 특정 명령 포인터 (IP)가 있다는 것을 소설을 유지합니다. 프로그래머와 컴파일러가이 픽션을 대상으로합니다.

아직 말씀 드린 바와 같이 최신 CPU는 순차적으로 또는 순차적으로 실행되지 않습니다. 프로그래머/사용자가 IP를 요청하기 전까지는 양자 물리학 (Quantum Physics)과 같고, IP는 실행되는 명령의 물결입니다. 따라서 프로세서는 가능한 한 빨리 프로그램을 실행할 수 있습니다. 디버거 중단 점이나 프로파일 러 인터럽트 등을 통해 현재 IP를 요청하면 프로세서는 예상되는 픽션을 다시 만들어서이 웨이브 폼을 축소하여 (모든 "in flight"지침에서) 다시 레지스터 값을 수집해야합니다. 아키텍처 이름을 지정하고 디버거 루틴을 실행하기위한 컨텍스트를 작성합니다.

여기서 컨텍스트에는 프로세서가 실행을 재개해야하는 명령을 나타내는 IP가 있습니다. 순서가 잘못된 실행 중에이 명령은 아직 완료되지 않은 가장 오래된 명령이었습니다. 인터럽트가 발생했을 때 프로세서는 아마도 그 시점을 훨씬 지나서 명령을 가져오고 있었을지라도 말입니다.

예를 들어, 아마도 인터럽트는 mov RSI, [RBX + RCX];을 IP로 나타내지 만 xor은 이미 실행 및 완료되었습니다. 그러나 프로세서가 인터럽트 후에 실행을 다시 시작하면 xor가 다시 실행됩니다.

+1

하드웨어 성능 모니터링 카운터가 그 상황에서 어떻게 작동하는지 설명해 주시겠습니까? 예 : 리눅스는 PMC 기반의 통계 프로파일 링을 제공하는'perf' 서브 시스템을 가지고있다. 커널이 단지 고주파 인터럽트를 발생 시키는가? (아주 좋은 비유에 따라) IP 파 기능을 축소하고 PMC를 읽은 다음 현재 발견 된 IP에 현재 PMC의 현재 값을 할당합니다. 기능 붕괴)? 그런 다음 PMC를 재설정하고 인터럽트에서 재개합니까? – oberstet