Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Не пора ли нам попробовать ARM? » Производительность МК


Производительность МК

Сообщений 1 страница 9 из 9

1

Разрабатывая проекты на баскоме у меня не раз возникал вопрос о скорости математических вычислений, особенно с плавающей точкой. Тема в разделе ARM потому что я их тоже протестировал, т. к. было интересно насколько 32-ух битное ядро производительнее чем 8-ми битное.
Код тестовых функций.

Свернутый текст
Код:
Function Test8(byval X As Byte) As Byte
    X = X + 20
    X = X * 12
    X = X - 3
    X = x / 5
    X = X Mod 178

    Test8 = X
End Function

Function Test16(byval X As Integer) As Integer
    X = X + 102
    X = X * 14
    X = x - 32
    X = x / 52
    X = X Mod 17820

    Test16 = X
End Function

Function Test32(byval X As Long) As Long
    X = X + 10232
    X = X * 412
    X = x - 3286
    X = X / 3
    X = X Mod 1782543424

    Test32 = X
End Function


Function Test_s(byval X As Single) As Single
    X = X + 102.543
    X = X * 412.54
    X = x - 32.432
    X = x / 3.432

    Test_s = X
End Function


Function Test_d(byval X As Double) As Double
    X = X + 102.543
    X = X * 412.54
    X = X - 32.432
    X = X / 3.432

    Test_d = X
End Function

Обычная математика с различной разрядностью переменных.
Результаты тестов. Они в тактах и содержат сумму 1000 вызовов функций.

Свернутый текст
Код:
ATmega328 - Bascom 2.0.8.1.
1 byte = 467566
2 byte = 1019516
4 byte = 2632705
Single = 2221984
Double = 5944625
Размер прошивки - 5188 байт.


ATmega328 - GCC 3.3.0, O2.
1 byte = 556851
2 byte = 729659
4 byte = 1935740
Float = 7015553
Double = 7015559
Размер прошивки - 5418 байт.


STM32F407VGT6 - GCC 5.4, O2 + LTO. 

1 byte = 17050
2 byte = 17980
4 byte = 18024
float  = 26022
double = 812320
Размер прошивки - 4872 байт.


STM32F103C8T6 - GCC 5.4, O2 + LTO. 

1 byte = 34333
2 byte = 33757
4 byte = 38022
float  = 193096
double = 1567736
Размер прошивки - 5304 байт.

STM32F030F4P6 - GCC 5.4, O2 + LTO.

1 byte = 122301
2 byte = 185132
4 byte = 246360
float  = 1474306
double = 3404609
Размер прошивки - 12324 байт.

STM32H750VBT6 - GCC 5.4, O2.

1 byte = 26018
2 byte = 28020
4 byte = 30028
float  = 26024
double = 30010
Размер прошивки - 5588 байт.

Результат в виде таблицы. Во всех ячейках кроме строки "Размер прошивки", данные в тактах, необходимых на один вызов функции.

1 байт

2 байта

4 байта

Single (Float)

Double

Размер прошивки

ATmega328 - Bascom 2.0.8.1

467

1020

2633

2222

5945

5188

ATmega328 - GCC 3.3.0

557

730

1936

7016

7016

5418

STM32F030F4P6

122

185

246

1474

3404

12324

STM32F103C8T6

34

33

38

193

1567

5304

STM32F407VGT6

17

18

18

26

812

4872

STM32H750VBT6

26

28

30

26

30

5588

Как и ожидалось, 32-ух битное ядро быстрее, причем намного. Особенно это заметно на Cortex-M3 ядре. Cortex-M4, а тем более Cortex-M7 должны быть еще быстрее, особенно при работе с плавающей точкой, которая в них поддерживается аппаратно.
Файлы. http://pure-basic.narod.ru/forum_files/ … alcTest.7z

+1

2

Конечно же результат вполне ожидаем. С сегодняшнего дня начинаю плавный переход на АРМы. :crazyfun:
Я серьёзно, серьёзнее некуда.

0

3

sva-don написал(а):

Конечно же результат вполне ожидаем.

Для однобайтных переменных результат не совсем ожидаем, ведь для 8-ми битных МК с ними не нужно программно работать. Думал что будет быстрее. Все же есть разница между 467 и 34 такта. Это отличие больше чем на порядок! А если учесть что у STM32F103C8T6 в 4.5 раз выше тактовая частота, разница в скорости вычислений будет еще больше.

Вероятно дело в том что меги аппаратно не поддерживают деление. Убрал из кода деление и результат такой.

1 byte = 135480
2 byte = 222718
4 byte = 375172
Single = 1225140
Double = 1438799

Уже лучше, но все равно не 34 такта. :dontknow:

STM32F030F4P6 тоже аппаратно не поддерживает деление, но результат тем не менее лучше чем у AVR, хотя должен быть примерно таким же.

А вообще, интересная ситуация. На Али ATmega328P и STM32F103C8T6 стоят одинаково, а возможности существенно отличаются. Видимо Atmel (теперь уже микрочип) сильно завышает цену на свои МК. :D

0

4

Я остановился на ATSAML21EG18B. Мизерное потребление даже в активном режиме, не говоря уже о режимах сна. Разработка в Atmel Studio 7. Кстати, первый раз установил. Среда хоть и тяжеловата, но весьма впечатляет.

0

5

Информацию по МК будет сложно найти. Видел на другом форуме как кто-то пытался подключить батарейку к RTC, но советов по теме не последовало, т. к. ARM от Atmel мало кто использует.

0

6

Пётр написал(а):

Информацию по МК будет сложно найти. Видел на другом форуме как кто-то пытался подключить батарейку к RTC, но советов по теме не последовало, т. к. ARM от Atmel мало кто использует.

Я уже всё скачал. Всё есть на сайте Микрочип.

0

7

sva-don написал(а):

ATSAML21EG18B

Поиковики про такой ничего не знают. :dontknow:
Возможно имелся в виду ATSAMD21G18?
На Али стоит 910 рублей (примерно 14$). Дорого для МК с ядром Cortex-M0. За эти деньги можно найти МК с ядром Cortex-M4 и даже Cortex-M7.
Повторюсь.

Пётр написал(а):

Видимо Atmel (теперь уже микрочип) сильно завышает цену на свои МК.

0

8

Протестировал STM32F407VGT6. Как и ожидалось, у него производительность еще выше чем у STM32F103C8T6. Математические вычисления (сложение, вычитание, умножение, деление и получение остатка отделения) с целочисленными переменными производятся всего за 18 тактов. С плавающей точкой одинарной точности (Float) тоже быстро работает - 26 тактов. Примерно такого результата и ожидал, ведь в МК есть математический сопроцессор и работа Float числами производится аппаратно. Плавающая точка двойной точности (Double) аппаратно не поддерживается и результат соответствующий - 812 тактов. Но это все равно лучше чем у других моделей МК.
Добавлю к этому что тактовая частота у STM32F407 равна 168 МГц (надо будет попробовать разогнать, но это будет уже другая тема) что в 10 раз больше чем у Arduino с ATmega328, а значит лучше показатель не только по числу тактов, за которые выполняются расчеты, но и по частоте ядра, что дает еще большую вычислительную мощность. :) Осталось придумать для чего ее применить. :D

+1

9

Добавил STM32H750VBT6. Он довольно быстро производит вычисления. Даже Double для него легкая задача.

0


Вы здесь » Программирование ATMEL в BASCOM. » Не пора ли нам попробовать ARM? » Производительность МК