Ассемблер

Added by Servis-engineer over 2 years ago

Написал программу миллион пустых циклов, плата LDM-MCp04 выпуска января 2013.
.include "HDL50001_pcf.inc"

.text

start:
jmp a1
getl 0x00003333
getl 0x0000F000
getl 1000000
wrl @3, WDT_KEY
wrl @3, GPIOD_DIR
setl #0, @4
wrl @5, GPIOD_OUT
setl #1, @5
complete

a1:
getl #1
subl @1, 1
setl #1, @1
jne @2, a1
je @3, a2
complete

a2:
getl 1000000
getl 0x0000F000
xor @1, #0
jmp a1
wrl @3, GPIOD_DIR
setl #0, @3
wrl @4, GPIOD_OUT
setl #1, @7
complete
Основой цикл а1, время выполения миллиона циклов 0,22с, это около 17 тактов на пять команд. Куда тратится время? Также написал простенький тест "Счастливые билеты", рассчитывающий 55252 "счастливых" билетов из миллиона, на си выполняется за 0,78с, а на ассемблере 0,63с.

bilety.7z (1.38 KB)


Replies (5)

RE: Ассемблер - Added by VaalKIA over 2 years ago

Тоже интересно, что там с тактами.

RE: Ассемблер - Added by Servis-engineer over 2 years ago

На ум приходят только задержки при записи в регистр и переходов между параграфами. Всё равно что-то много получается. Тактовая частота процессора действительно 80МГц.

RE: Ассемблер - Added by micron_multiclet over 2 years ago

Коллеги, наше видение проблемы заключается в следующем. Для того, чтобы параллелизм давал эффект необходима соответствующая загрузка исполнительных устройств. Т.е. нужны длинные линейные участки с минимумом переходов. Чем больше длина, тем больше вероятность того , что какая-то часть вычислений может быть выполнена параллельно. В этой данной тестовой программе все с точностью до наоборот. Линейный участок пять команд, который выбирается за 2 такта (4 команды + 1команда). После этой выборки процесс приостанавливается до определения нового адреса. Адрес получается после проверки условия выхода из цикла. Опять выбираются пять команд, опять простой до проверки условия и т.д. Что бы избежать этой ситуации необходимы длинные участки (15-20 команд) и проверка условия окончания цикла должна осуществляться вначале цикла, а не в конце (по крайней мере для циклов типа for).

RE: Ассемблер - Added by Servis-engineer over 2 years ago

Это понятно, что код из примера не будет выполняться параллельно, об это даже речи не шло.
Если разобрать цикл по командам.
1. Выборка первых 4-х команд.
2. Загрузка числа из регистра.
3. Число загружено, вычитается единица. Загружается пятая команда?
4. Число получено, запрос на сохранение числа в регистре. В этом же такте проверка условий и расчёт адреса перехода?
Что происходит дальше?
5. Очищается буфер коммутатора?
6. Сохраняется число в регистре?
7. Переход на новый параграф?
А где ещё 10 тактов? Может, я не учёл что-то? Согласно РЭ, цикл обрашения к портам R1 занимает четыре такта, но в примере в цикле только обращения к регистру #1.
А по неэффективности кода программы для мультиклета я с Вами полностью согласен, операциями нужно занимать все клетки.

RE: Ассемблер - Added by sprin over 2 years ago

Здравствуйте.

Когда я экспериментировал с платой HW1-MCp04 (с процессором MULTICLET P1) то получалось, что переход между параграфами составлял примерно 10-12 тактов.

(1-5/5)