Перейти к содержанию
    

Blackfin. Время выполнения команд и задержки.

В документе"EE197 Multi-cycle Instructions and Latencies.pdf" присутствует интересная инфа про такты ожидания конвейера. Почему-то не удалось найти эти данные в основных документах - Hardware Reference Manual, Programming Reference Manual, Instruction Set Reference. Откуда товарисч, который автор этого EE197, взял информацию. Инфа, кстати, верная - проверил - и на симуляторе, и в железе все так и есть.

 

Например, в упомянутом ЕЕ сказано, что

 

(if LC0 > 1)

- LC0/LC1 reg written to (например, LC0 = R0)

 

или

 

- LT0/LB0 written to and LC0 != 0 (например, LT0 = [sP++])

 

то на следующей команде возникнет stall аж в 9 тактов!

 

И ведь это весьма значимая информация. Почему ее в основных документах не найти? Или плохо искал? Ткните тогда носом, плиз? :)

 

И еще. Указанные нюансы встают в полный рост, когда происходит переключение контекста в RTOS, например. Т.е. там при восстановлении контекста (при активизации задачи/треда) происходит запись в эти регистры LCx/LTx/LBx, что неминуемо должно приводить неслабому увеличению времени выполнения. Учитывая, что контекст у черного фина сам по себе немаленький - порядка 180 байт или 44 32-битных слова, то время переключения делается тоже заметным. Даже если по одному такту на слово, то 44+44=88 тактов только на то, чтобы пихнуть контекст текущего процесса в стек и вытолкнуть контекст следующего из стека. А упомянутые stall'ы еще добавляют порядка 20-80 тактов. Да еще надо между метаниями контекстов переключить указатели стеков, сохранить/восстановить статус прерываний, это еще порядка двух десятков тактов. Т.е. при самом лучшем раскладе получается 88+20+20=128 тактов.

 

Но вот попался рекламный проспект про ThreadX, где сказано, что Context Switch равен 105 тактов! Это как? Как такое возможно, если в лучшем случае выходит 128 тактов? Или там не все регистры сохраняют? Но тогда это не должно работать по определению. Или это просто какое-то рекламное лукавство?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение очень простое. В EE197 прямо об этом и сказано, нужно обнулить lcX (или убедиться что там ноль).

r0 = 0;

lc0 = r0;

lc1 = r0;

Дальше можно загружать lcX без всяких задержек чем угодно.

Предварительно, разумеется lc0,lc1 сохраняются в удобном месте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение очень простое. В EE197 прямо об этом и сказано, нужно обнулить lcX (или убедиться что там ноль).

r0 = 0;

lc0 = r0;

lc1 = r0;

Дальше можно загружать lcX без всяких задержек чем угодно.

Предварительно, разумеется lc0,lc1 сохраняются в удобном месте.

Это я все видел. Только тут тоже есть вопросы. Например, при записи в LCx даже 0 все равно уходит 10 тактов на каждый. И независимо от того, какое там записано значение. Т.ч. 20 тактов как с куста. :(

 

И все же, где в доке (кроме этого ЕЕ) описаны все эти такты? Облазил HRM, PRM вдоль и поперек. Не нашел. Смутно помню, что вроде где-то попадалось, но вспомнить, хоть убей, не могу. Должно же где-то это быть! :cranky:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...