
내 PC에는 두 개의 프로세서가 있으며 각 프로세서는 1.86GHz에서 실행된다는 것을 알고 있습니다.
내 PC 프로세서의 클럭 펄스를 수동으로 측정하고 싶습니다. 내 생각은 프로그램에 있는 어셈블러 라인 수와 내 컴퓨터가 이를 실행하는 데 소비하는 시간 사이의 몫을 계산하는 것입니다. CPU가 처리하는 시간당 어셈블리 명령의 수입니다(이것이 제가 '클럭 주기'라고 이해한 것입니다). 나는 다음과 같은 방법으로 하기로 생각했다.
- 저는 C 프로그램을 작성하고 이를 어셈블리 코드로 변환합니다.
- 나는 do: 를 수행합니다.
$gcc -S my_program.c
이는 gcc 컴파일러에게 마지막 단계인 my_program.c를 바이너리 객체로 변환하는 것을 제외한 전체 컴파일 프로세스를 수행하도록 지시합니다. 따라서 어셈블러 코드로 변환된 C 프로그램 소스가 포함된 my_program.s라는 파일이 있습니다. 내 프로그램에 있는 줄 수를 셉니다(이 숫자를 N이라고 부르겠습니다). 나는 그렇게 했습니다.
$ nl -l my_program.s | tail -n 1
그리고 나는 다음을 얻었습니다:1000015 .section .note.GNU-stack,"",@progbits
즉, 이 프로그램에는 수백만 줄의 코드가 있습니다.
- 나는 한다:
$gcc my_program.c
그것을 실행할 수 있도록. 나는 다음을 수행합니다:
$time ./a.out
("a.out"은 my_program.c의 바이너리 개체 이름입니다) 프로그램을 실행하는 데 소요되는 시간을 얻기 위해(T라고 부르겠습니다) 다음을 얻습니다.real 0m0.059s user 0m0.000s sys 0m0.004s
내가 검색하고 있는 시간은 목록에 표시된 첫 번째 시간인 "실제"라고 가정합니다. 왜냐하면 다른 시간은 내가 실행하는 것과 동일한 순간에 내 시스템에서 실행 중인 다른 리소스를 참조하기 때문입니다 ./a.out
.
따라서 N=1000015 라인이고 T=0.059초입니다. N/T 분할을 수행하면 주파수가 17MHz에 가깝다는 것을 알 수 있는데 이는 분명히 정확하지 않습니다.
그런 다음 내 컴퓨터에서 다른 프로그램이 실행되고 하드웨어 리소스(더 이상 진행하지 않고 운영 체제 자체)를 소비한다는 사실로 인해 프로세서가 "처리 능력"을 "분할"하고 클럭 펄스가 진행되는 것이라고 생각했습니다. 더 느리지만 확실하지 않습니다.
그러나 이것이 옳다면 내 프로그램이 소비하는 CPU 리소스(또는 메모리)의 비율도 찾아야 한다고 생각했습니다. 왜냐하면 그렇게 하면 실제 CPU 속도에 대한 (잘) 대략적인 결과를 얻기를 정말로 열망할 수 있기 때문입니다.
그리고 이는 내 프로그램의 '리소스 소비 가치'를 어떻게 찾는지에 대한 문제로 이어집니다. 명령 에 대해 생각해 보았지만 $ top
내 프로그램이 실행되는 데 소요되는 짧은 시간(0.059초)으로 인해 즉시 삭제되었습니다. 이 짧은 시간 동안 메모리 사용량이 최고조에 달하는 것을 육안으로 구별하는 것은 불가능합니다.
그럼 이것에 대해 어떻게 생각하세요? 아니면 나에게 무엇을 하라고 권하시나요? 제가 하려고 하는 이 작업을 수행하는 프로그램이 있다는 것을 알고 있지만 가능한 가장 "보편적인 방법"을 통해 수행하는 데 관심이 있기 때문에 원시 bash를 사용하여 수행하는 것을 선호합니다(더 안정적인 것 같습니다).
답변1
그건 작동하지 않습니다. 각 명령어를 실행하는 데 걸리는 클록 사이클 수(하나가 아닌 꽤 많은 시간이 소요됨)는 주변 명령어의 정확한 조합에 따라 크게 달라지며 정확한 CPU 모델에 따라 다릅니다. 또한 인터럽트가 들어오고 명령이 실행되는 커널 및 기타 작업이 사용자의 명령과 혼합되어 있습니다. 게다가 주파수는 부하와 온도에 따라 동적으로 변합니다.
최신 CPU에는 정확한 클럭 사이클 수를 계산하는 모델별 레지스터가 있습니다. 이것을 읽고 고해상도 타이머를 사용하여 일정 기간 후에 다시 읽고 두 값을 비교하여 해당 기간 동안의 (평균) 빈도를 알아낼 수 있습니다.