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