Посмотрел. Но не нашел особо ничего подозрительного. И в эмуляторе допустим emustudio как-раз сделана линейная зависимость времени выполнения ash #x,R0 от значения x.
Однако на железке время выполнения вовсе нелинейно вышло в зав-ти от того сколько раз прокрутить регистр. Причем очень интересно вышло.
Вот такой код заполняет относительно длинный буфер:
Запускается, замеряется время. Затем команда сдвига меняется на ash #1, R0 и т.д.Код:mov #12345, R0 ash #0, R0
Eсли вывести время выполнения сдвигов [0..8] и приращение к предыдущему то получится скажем такое (на 1млн таких комманд в усл.ед.)
На emustudio все линейно как и ожидалось
На реальной УКНЦ однако иначе (суть не в том что эмустудио быстрее, а в нелинейности):Код:Время Приращение 363 363 388 25 413 25 438 25 463 25 488 25 514 26 539 25 564 25
причем приращения не рандомные, повторение теста выдает точно то-же самоеКод:Время Приращение 511 511 534 23 584 50 604 20 634 30 656 22 667 11 704 37 730 26
В данном коде абсолютно не используется предвыборка, значит велико значение задержки при чтении из памяти. А чтение памяти идёт с разрешения арбитра видеоконтроллера. Попробуйте счётчик сдвига поместить в регистр R1 и для подсчета использовать только одну команду ASH R1,R0. Какие будут результаты?
Агааа.. Попробовал навроде такого:
Вот теперь зависимость от количества сдвигов линейная. Времена выполнения стали навроде 600,700,800,900..Код:mov #X, R1 clr R0 ash R1, R0 ash R1, R0 ash R1, R0 ... много раз ... ash R1, R0 return
Меняя буфер на ash #X, R0(много раз) получается нелинейность (с чего я и начал собственно).
Так это что-ж такое? Процессор пока выполнял ash R1,R0 успел предвыбрать следующее за ней слово (поскольку инструкция ровно в слово лезет)?
А если след. инструкция в слово не влезла (ash #X, R0) - то он не делает предвыборку и начинается какое-то ожидание? (причем не пойми точно какое).
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)