ARM без ALU сколько для операций

0

У меня была проблема с ARM Cortex M3 с некоторой функциональностью, которая требует умножения и деления натуральных чисел. Дело в том, можно ли делать вычисления между 128 битами чисел? Мне нужно знать, сколько сборочных операций требуется, чтобы программное обеспечение эмулировало несколько двух 32 чисел и разделило два 32 битовых номера, а затем я вычислил время потребления моих вычислений. Я застрял с некоторыми расчетами, и мне нужна помощь, потому что, может быть, мне нужно изменить свой UC на кору M4 с аппаратным ALU.

Ты можешь помочь мне с этим?

Учитывая простой код C:

uint32_t var1 = 12304;
uint32_t var2 = 1892637198;
uint64_t result = var1*var2;

И objdump ассемблер:

   0:   b480            push    {r7}
   2:   b085            sub     sp, #20
   4:   af00            add     r7, sp, #0
        uint32_t var1 = 12304;
   6:   f243 0310       movw    r3, #12304      ; 0x3010
   a:   60fb            str     r3, [r7, #12]
        uint32_t var2 = 1892637198;
   c:   f645 230e       movw    r3, #23054      ; 0x5a0e
  10:   f2c7 03cf       movt    r3, #28879      ; 0x70cf
  14:   60bb            str     r3, [r7, #8]

        uint64_t result = var1*var2;
  16:   68fb            ldr     r3, [r7, #12]
  18:   68ba            ldr     r2, [r7, #8]
  1a:   fb02 f103       mul.w   r1, r2, r3
  1e:   460a            mov     r2, r1
  20:   f04f 0300       mov.w   r3, #0
  24:   e9c7 2300       strd    r2, r3, [r7]

Поэтому, если я рассчитываю, например, множественное умножение, я могу получить целую инструкцию (потому что загрузка значений в регистры так плюс 3 инструкции для каждой загрузки) или только умножение (в данном случае 6 команд)

Из-за умножения двух переменных 128 бит, отформатированных как (x ^ 5 + x), где x - 32-битная переменная, дайте мне (a + b) (c + d) ab + ad + bc + bd 4 умножить (или 3 с помощью алгоритмов). Поэтому, если я должен вычислить 4 * (3 + 3 + 6) или 4 * (6+? +?).

  • 0
    Как насчет размещения некоторых кодов?
  • 0
    @Jake 'Alquimista' LEE - я публикую простой пример и эквивалентный код сборки
Теги:
assembly
arm
alu

2 ответа

1
Лучший ответ

Инструкции по ARM

Эта страница содержит все количество циклов на инструкцию для процессора ARM M-Series. Если у вас есть код сборки (который звучит так, как вы?), То должно быть достаточно легко добавить все ваши циклы, умножить на 1/clock_freq и получить общее время, потраченное на различные сценарии.

  • 0
    Основываясь на этой ссылке, M3 включает 32-битное умножение и деление, поэтому для этих операций эмуляция не требуется. Для 128-битных операций вам потребуется реализовать математические вычисления повышенной точности. Я не уверен, что передовые методы выполнения этого будут более эффективными, чем эмуляция длинных и длинных рук (подобно тому, как человек делает это с карандашом и бумагой).
  • 0
    @rcgldr Я знаю немного математики, но как насчет Ассемблера? :)
Показать ещё 1 комментарий
0

Другим решением является использование systick для измерения количества циклов.

См. Эту ссылку от ARM

Изменить: вы можете установить счетчик на максимум и принудительно повторно загрузить его значение счетчика, как только оно достигнет 0.

//Настройка Systick
* STRVR = 0xFFFFFF; //max count * STCVR = 0; //принудительно перезагрузить регистр значения счетчика * STCSR = 5; // включить подсчет FCLK без прерывания

Вы можете прочитать регистр STCVR, который является нижним регистром до и после функции, а затем удалить служебные циклы (чтобы прочитать регистр STCVR).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню