내 컴퓨터에는 두 개의 프로세서가 있고 각 프로세서가 1.86GHz에서 실행된다는 것을 알고 있습니다.
내 PC 프로세서의 클럭 펄스를 수동으로 측정하고 싶습니다. 아이디어는 내 프로그램에 있는 어셈블러 라인 수와 내 컴퓨터가 이를 실행하는 데 걸리는 시간 사이의 몫을 계산하는 것입니다. time 조립 지침의 수입니다(이것은 "클럭 주기"로 이해됩니다). 다음과 같이 진행하고 싶습니다.
- C 프로그램을 작성하고 이를 어셈블리 코드로 변환했습니다.
- I 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
그건 작동하지 않습니다. 각 명령을 실행하는 데 걸리는 클록 사이클 수(1개가 아닌 꽤 많은 클록 사이클이 소요됨)는 해당 명령을 둘러싼 명령의 정확한 조합에 따라 크게 달라지며 특정 CPU 모델에 따라 다릅니다. 또한 인터럽트가 발생하고 커널 및 기타 작업이 사용자와 혼합된 명령을 실행합니다. 게다가 주파수는 부하와 온도에 따라 동적으로 변경됩니다.
최신 CPU에는 클럭 사이클을 정확하게 계산할 수 있는 모델별 레지스터가 있습니다. 이것을 읽고 고해상도 타이머를 사용하여 일정 시간 후에 다시 읽은 다음 두 값을 비교하여 해당 기간 동안의 (평균) 빈도를 찾을 수 있습니다.