저는 하드웨어 성능 카운터(HPC) 작업을 하고 있으며 이러한 카운터를 사용하여 특정 이벤트를 정확하게 측정하려고 합니다.
나는 하드웨어 성능 카운터의 불확실성(부정확성)이 다음으로 인해 발생할 수 있다는 것을 발견했습니다.페이지 오류런타임에 발생합니다. 페이지 폴트 수는 명령어 및 분기 수에 직접적인 영향을 미칩니다.
내 질문: 소스 코드의 정적 분석을 사용하여 페이지 오류 수를 예측(또는 계산)하는 방법이 있습니까? 그렇지 않다면 이를 동적으로 달성할 수 있습니까?
답변1
모든 페이지 오류에 대한 로그를 절대적으로 생성할 수 있지만 이를 안정적으로 예측할 수는 없습니다. 가상 메모리를 끄고 소프트웨어가 RAM 또는 L2에 적합한지 확인하세요. 아마도 Zram이 도움이 될 것입니다. 더 나은 결과를 원한다면 값을 설정하고 실시간 운영 체제를 사용할 수도 있습니다.
답변2
실시간으로 처리해야 할 일이 있는 것 같습니다. 이 경우 페이지 폴트가 중요하지 않은지 확인하는 올바른 방법은 이를 예측하려고 시도하는 것이 아니라(거의 불가능함) 페이지 폴트가 언제 어디서 발생하는지 관리하는 것입니다.
POSIX 호환 및 POSIX 유사 시스템에서 이를 수행하는 가장 쉬운 방법은 시작 시 및 플래그 세트를 mlockall()
사용하여 libc에서 함수를 호출하는 것입니다. 이는 세 가지 작업을 수행합니다.MCL_CURRENT
MCL_FUTURE
- 이는 프로세스에 의해 매핑된 메모리가 교체되는 것을 방지합니다(적어도 호출할 때까지는
munlockall()
). - 오작동을 일으킨다모두현재 매핑된 페이지입니다. 첫 번째 요점과 함께 이는 매핑된 메모리 영역에 대한 액세스가 페이지 오류를 생성하지 않음을 의미합니다.
- 새로 매핑된 페이지가 매핑되면 오류가 발생합니다. 즉, 메모리 할당 호출은 해당 메모리 영역의 내용을 메모리로 가져오는 데 필요한 페이지 오류 수만큼 정확하게 트리거되며 할당이 완료된 후 후속 액세스에서는 페이지 오류가 트리거되지 않습니다.
이는 문제만 해결한다는 점에 유의하세요.당신의프로그램. 시스템에서 실행 중인 다른 코드로부터 여전히 간섭을 받을 수 있지만 불행하게도 이에 대해 할 수 있는 일이 많지 않습니다(실시간 예약 우선 순위로 실행하는 것 외에는 별 도움이 되지 않습니다).