реклама на сайте
подробности

 
 
> Вопрос по быстродействию SAM7
evgene
сообщение Mar 5 2008, 09:28
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 12-02-07
Пользователь №: 25 262



Некоторое время использую в новых проектах AT91SAM7S. Ранее не требовалось оптимизации по быстродействию, но возникла задача, в которой очень важно обеспечить высокую производительность алгоритма. После экспериментов с быстродействием, столкнулся с необъяснимым эффектом. Суть проблемы такова: написал процедуру, просмотрел в дебагере сколько тактов процессора идет на обработку. Зная частоту проца, вычислил время исполнения кода. После практического измерения, реальное время исполнения оказалось значительно выше (примерно в 1.6 раза).
Для упрощения задачи написал процедуру:
__ramfunc void Benchmark()
{
volatile unsigned int i ;
for ( i = 0 ;(i < 480000 );i++ ) ;

}
При частоте ядра 48 МГц время выполнения должно составлять около 100 мс. На практике 160 мс.
Частота ядра выставлена верно, измерения фактического времени выполнения тоже верны, все перепроверено несколько раз. Компилятор - IAR, оптимизация отключена. Смотрел асм. Там все верно (должно быть 10 тактов в одном цикле).
За счет чего падает производительность. Не понимаю где скрыт подвох.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Mar 5 2008, 09:51
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(evgene @ Mar 5 2008, 11:28) *
За счет чего падает производительность. Не понимаю где скрыт подвох.
1)Может разрешены и исполняются какие-то прерывания от таймера?
2) А почему вы решили, что один проход такого цикла исполняется 10 тактов?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
evgene
сообщение Mar 5 2008, 10:13
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 12-02-07
Пользователь №: 25 262



Цитата(Сергей Борщ @ Mar 5 2008, 19:51) *
1)Может разрешены и исполняются какие-то прерывания от таймера?


Одно прерывание действительно разрешено, от таймера, (период 1 мс, использую для измерения времени выполнения), но оно, я думаю, увеличивает время исполнения незначительно.

Цитата(Сергей Борщ @ Mar 5 2008, 19:51) *
2) А почему вы решили, что один проход такого цикла исполняется 10 тактов?


Десять тактов я увидел в дебагере, и ещё смотрел асм-листинг.

Цитата(aaarrr @ Mar 5 2008, 20:02) *
Ума не приложу, из чего там можно сделать 10 тактов. Листинг посмотреть можно?


Ниже листинг, у вас 10 тактов не получается, наверное из-за включеной оптимизации.

57 __ramfunc void Benchmark()
58 {
\ Benchmark:
\ 00000000 04D04DE2 SUB SP,SP,#+4
59 //* Set in Volatile for Optimisation
60 volatile unsigned int i ;
61 //* loop delay
62 for ( i = 0 ;(i < 480000 );i++ ) ;
\ 00000004 0010A0E3 MOV R1,#+0
\ 00000008 00108DE5 STR R1,[SP, #+0]
\ ??Benchmark_0:
\ 0000000C 00009DE5 LDR R0,[SP, #+0]
\ 00000010 701AA0E3 MOV R1,#+458752
\ 00000014 531C81E3 ORR R1,R1,#0x5300
\ 00000018 010050E1 CMP R0,R1
\ 0000001C 0300002A BCS ??Benchmark_1
\ 00000020 00109DE5 LDR R1,[SP, #+0]
\ 00000024 011091E2 ADDS R1,R1,#+1
\ 00000028 00108DE5 STR R1,[SP, #+0]
\ 0000002C F6FFFFEA B ??Benchmark_0
63
64 }
\ ??Benchmark_1:
\ 00000030 04D08DE2 ADD SP,SP,#+4 ;; stack cleaning
\ 00000034 1EFF2FE1 BX LR ;; return

Цитата(aaarrr @ Mar 5 2008, 20:02) *
Прогнал такой же тест у себя, специально добив цикл nop'ами до 10 тактов - время выполнения ~102мс.


Если не жалко, можете скинуть мне ваш проект (ie2@narod.ru). Хочу у себя его прогнать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 5 2008, 10:20
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(evgene @ Mar 5 2008, 13:13) *
Ниже листинг, у вас 10 тактов не получается, наверное из-за включеной оптимизации.

Да нет, у меня RVDS просто. И подумать не мог, что IAR может такой ужас сотворить.

Цитата(evgene @ Mar 5 2008, 13:13) *
Код
??Benchmark_0:
    LDR      R0,[SP, #+0]
    MOV      R1,#+458752
    ORR      R1,R1,#0x5300
    CMP      R0,R1
    BCS      ??Benchmark_1
    LDR      R1,[SP, #+0]
    ADDS     R1,R1,#+1
    STR      R1,[SP, #+0]
    B        ??Benchmark_0

Это не может выполниться за 10 тактов, хоть убейте.
Все правильно - ровно 16 тактов на цикл.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016