|
ARM cycle count, как правильно мерять производительность кода. |
|
|
|
Dec 3 2009, 10:59
|

Частый гость
 
Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970

|
Здравствуйте, уважаемые армоведы. Просмотрев внимательно по форуму, я нашел много упоминаний о измерении производительности кода под ARM. Одни меряют время, другие пробуют посчитать циклы (cycle count). В ветке немного затронули проблему измерения тактов, то детально не обсуждали. И у меня возник вопрос, как правильно оценить эффективность и производительность кода? Ну вот, например как оценить скорость выполнение FFT? Я так понимаю, было б правильно посчитать сколько он занимает тактов, а потом умножить на время одного такта. Тогда под разными процессорами можно было б сказать, за сколько выполнится преобразование. Для Блекфин как то получены цифры, но вот с помощью чего? В Keil можно померить время выполнения функции в Симуляторе. Но что это за время? Ведь код может выполнятся из внутреннего кеша процессора или из внешней памяти. По этому возник еще один вопрос, есть ли какие либо дополнительные тулзы что б мерить не время, а именно cycle count с учетом всех задержек после выполнения инструкций?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Dec 3 2009, 11:06
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Bosicc @ Dec 3 2009, 13:59)  По этому возник еще один вопрос, есть ли какие либо дополнительные тулзы что б мерить не время, а именно cycle count с учетом всех задержек после выполнения инструкций? Тулзов, которые учитывали бы все, в природе нет. Поэтому остается только в симуляторе посмотреть время выполнения того же FFT в идеальных условиях, а затем ввести некоторый поправочный коэффициент с учетом вейтстейтов, загрузки шин, работы кэша и т.п, о чем симулятор не догадывается. А реальное время можно измерить только на реальном железе аппаратно.
|
|
|
|
|
Dec 3 2009, 11:20
|

Частый гость
 
Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970

|
Цитата(aaarrr @ Dec 3 2009, 13:06)  Тулзов, которые учитывали бы все, в природе нет. Хм... это Вы имеете в виду под АRМ? Потому что для DSP есть профайлеры, которые довольно неплохо меряют cycle count. Цитата(aaarrr @ Dec 3 2009, 13:06)  ввести некоторый поправочный коэффициент с учетом вейтстейтов, загрузки шин, работы кэша и т.п А есть идеи как примерно рассчитать этот коэффициент? Может есть какие доки?
|
|
|
|
|
Dec 3 2009, 11:29
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Bosicc @ Dec 3 2009, 14:20)  Хм... это Вы имеете в виду под АRМ? Потому что для DSP есть профайлеры, которые довольно неплохо меряют cycle count. Да, под ARM. Каждый производитель снабжает ядро своими контроллерами памяти, шинными коммутаторами, иногда и кэшем. Далеко не всегда документация на них доступна (например, на тот же MAM от NXP), поэтому сделать универсальное решение практически невозможно. С DSP все проще - тулзы как правило создает сам разработчик кристалла, который знает его досконально. Цитата(Bosicc @ Dec 3 2009, 14:20)  А есть идеи как примерно рассчитать этот коэффициент? Может есть какие доки? ИМХО, только получить опытным путем.
|
|
|
|
|
Dec 3 2009, 12:38
|

Частый гость
 
Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970

|
Цитата(scifi @ Dec 3 2009, 14:08)  Чтобы получить ответ на этот вопрос, я обычно секундомером пользуюсь. На мой взгляд, это самый "правильный" способ :-) Я думаю что в эту цифру будет внесена погрешность, которая состоит из времени обращения к памяти и т.д. Поскольку код программы может хранится где угодно. А речь идет как оценить качество кода, в не зависимости от конкретной реализации железа. Если написать код: Код MOV R0,R1 // 1 cycle // stolen cycle - processor wait x cycles LDR R0,R2 // 2 cycle То суммарное время будет 3 такта + х тактов которые будет стоять процессор. Необходим такой механизм, при котором можно будет померят количество тактов кода с учетом архитектуры ядра. ( задержками между инструкциями )
|
|
|
|
|
Dec 3 2009, 14:11
|

Частый гость
 
Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970

|
Цитата(aaarrr @ Dec 3 2009, 14:44)  Ну, обычные вейтстейты умеет учитывать большинство симуляторов, только причем тут "архитектура ядра"? Архитектура ядра - это я имел в виду чему будут равны вейтстейты под тот или иной процессор. А как они умеют его учитывать? Они выдают количество тактов или время необходимое на выполнение куска кода? Я искал тулзы которые показывали б количество тактов инструкций + количество вейтстейтов.
|
|
|
|
|
Dec 3 2009, 15:03
|

Частый гость
 
Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970

|
Цитата(AlexandrY @ Dec 3 2009, 16:35)  Keil считает так как будто код выполняется из кэша. Keil правильно показывает такты, можете базироваться на его результатах. Я запускаю Keil Simulator, ставлю брейкпоин на нужную мне функцию, открываю Performance Analyzer и вижу в нем Calls, Time(Sec), Time(%). Следовательно, могу померять только время. А где можно посмотреть Cycles? У меня uVision V3.62c, MDK 3.22a Подскажите пожалуйста, куда глянуть что б увидеть результат по тактам.
|
|
|
|
|
Dec 3 2009, 17:21
|
Частый гость
 
Группа: Свой
Сообщений: 92
Регистрация: 16-05-05
Из: Kiev
Пользователь №: 5 080

|
Цитата(aaarrr @ Dec 3 2009, 14:44)  P.S. LDR выполняется 3 такта. почему три? по документации один вроде, если результат не используется на следующем такте и не модифицируется смещение. или я - неправ?
|
|
|
|
|
Dec 3 2009, 21:42
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(aaarrr @ Dec 4 2009, 00:34)  По документации - S+N+I (+S+N if R15 loaded), т.е. 3 или 5 тактов. А я вроде мерял на ARM7 LPC - 2 такта получалось. Кстати если работать с FAST IO у LPC эти регистры прямо к ядру подключены то на ARM7 цикл Код while(1) { FIO0SET0 = 1; FIO0CLR0 = 1; } выполняетя 6 таков - по 2 такта STR и 2 такта branch а вот на LPC1700 уже за 4 такта - по 1 такту STR и 2 такта branch, потому что если добавить еще пару SET CLR - то цикл становится 6 тактов. (причем мерял на 100 Mhz частоте, но код был из RAM).
|
|
|
|
|
Dec 3 2009, 21:48
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(KRS @ Dec 4 2009, 00:42)  А я вроде мерял на ARM7 LPC - 2 такта получалось. На ARM7 STR - 2, LDR - 3/5. B - тоже 3, так что должно было получится 7 тактов у вашего цикла.
|
|
|
|
|
Dec 4 2009, 16:25
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Bosicc @ Dec 3 2009, 17:03)  Я запускаю Keil Simulator, ставлю брейкпоин на нужную мне функцию, открываю Performance Analyzer и вижу в нем Calls, Time(Sec), Time(%). Следовательно, могу померять только время. А где можно посмотреть Cycles? У меня uVision V3.62c, MDK 3.22a
Подскажите пожалуйста, куда глянуть что б увидеть результат по тактам. Запускаете отладку, внизу, в статусе, ближе к правому краю t1: ... Жмете правой кнопкой мыши... наводите мышь... А время в такты перевести сможете, вы же частоту генератора знаете. Правда, у меня Keil 4.0
Сообщение отредактировал ViKo - Dec 4 2009, 16:28
|
|
|
|
|
Dec 16 2009, 12:22
|
Частый гость
 
Группа: Свой
Сообщений: 92
Регистрация: 16-05-05
Из: Kiev
Пользователь №: 5 080

|
Цитата(AlexandrY @ Dec 3 2009, 17:27)  А.. , так у вас притензии к Performance Analyzer-у Keil-а. Смотрите описание команды командной строки Keil-а - PerformanceAnalyze Открываю mVision3 v3.62с - Смотрю описание PerformanceAnalyze и вижу сноску что команда не доступна в arm симуляторе. Я правильно понимаю, что в симуляторе (без железа) кол-во тактов ядра на выполнение куска кода подсчитать невозможно или я не прав? Если неправ, ткните где написано, как это сделать.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|