Написать подпрограмму getperf, приминающую в регистрах a0, a1, a2 три параметра:
- Период срабатывания прерывания по таймеру
Количество выполняемых инструкций (по версии CSR instret)
Адрес callback-подпрограммы, вызываемой из обработчика прерывания. Гарантируется, что callback-подпрограмма не меняет регистров общего назначения (кроме ra и регистров математического сопроцессора)
Также написать сам обработчик прерывания, который будет вызывать callback-подпрограмму. Вызов getperf должен устанавливать прерывание по таймеру с соответствующим периодом и выключать его по возможности сразу после выполнения указанного количества инструкций. В результате можно будет с небольшой точностью оценить быстродействие RARS.
К решению будет приписан вот такой footer: MeasurePerf_footer.asm
В этом файле определена метка main: и директива .globl main
- Все остальные метки начинаются с подчёркивания
Предполагается, что количество выполняемых инструкций умещается в instret, и задействовать instreth не надо
1000000 10 1000000 10 1000000 10 1000000 10 1000000 10 1000000 10 1000000 10 0
- На моём ноутбуке решение занимает 5.6 секунды, реальные тесты будут, как обычно, построены под 1/2 TIME LIMIT для EJudge
- За время прохождения теста процессор ноутбука разгоняется в 4 раза (поэтому проверяется только два последние замера из семи); на EJudge подобного эффекта не ожидается
Сама getperf ничего не возвращает: подсчётом занимается callback
1
Подсказка: в моём решении getperf включает прерывания по таймеру обработку ловушек, затем в цикле проверяет, не перевалило ли количество выполненных с момента включения прерывания инструкций за указанное число, затем запрещает обработку ловушек.