Porównanie wydajności mikrokontrolerów STM32 podczas wykonywania typowych programów

W artykule porównano czasy wykonania przykładowych programów testowych przez różne mikrokontrolery z rodziny STM32, obliczono także wydajność z uwzględnieniem częstotliwości zegara taktującego CPU. Porównano także wyniki uzyskane w przypadku, gdy FPU było używane tam, gdzie było dostępne, oraz w przypadku, gdy FPU nie było używane.

W tekście i tabelach poniżej używane są następujące skrótowe oznaczenia dla testowanych mikrokontrolerów:

  • F0 – STM32F030@48MHz
  • L0 – STM32L053@32MHz
  • F1 – STM32F103@72MHz
  • L1 – STM32L152@32MHz
  • F4 – STM32F446@180MHz
  • F7 – STM32F746@216MHz

Czas wykonania (FPU używane, jeśli dostępne)

Wyniki

Czas wykonania (FPU nie używane)

Wyniki

 

Wnioski

Największe różnice czasu wykonania pomiędzy mikrokontrolerami wystąpiły dla obliczeń na liczbach zmiennopozycyjnych pojedynczej precyzji w przypadku pojawienia się wsparcia sprzętowego (FPU) – były rząd wielkości większe niż w pozostałych przypadkach. Dla prostych obliczeń stałopozycyjnych największy spadek czasów wykonania wystąpił między mikrokontrolerami z rdzeniem Cortex-M0(+) i mikrokontrolerami z rdzeniem Cortex-M3, dla pozostałych testów – między mikrokontrolerami z rdzeniem Cortex-M3 i mikrokontrolerem z rdzeniem Cortex-M4.

Czasy wykonania dla F0 były ok. 1,4 razy krótsze niż dla L0 i różnice między poszczególnymi testami były niewielkie. Największe różnice czasów wykonania wystąpiły dla obliczeń stałopozycyjnych.

Czasy wykonania niektórych testów były znacznie krótsze dla L1 niż dla F0: dla prostych obliczeń stałopozycyjnych – prawie 4 razy, dla FOC operującego na liczbach stałopozycyjnych – ponad 2,5 razy, dla obliczeń na macierzach liczb stałopozycyjnych – 1,8 razy. Natomiast w przypadku innych testów różnice były nieduże lub czas wykonania był krótszy dla F0 – dla obliczeń na liczbach zmiennopozycyjnych pojedynczej precyzji czasy wykonania różniły o kilka procent i w jednym przypadku czas wykonania był krótszy dla F0, dla automatu czas wykonania był ok. 15% krótszy dla F0.

Spadek czasów wykonania między F1 i F0 oraz między L1 i L0 różnił się znacząco w zależności od testu. Bardzo duży był dla prostych obliczeń stałopozycyjnych (prawie 6 razy dla L1/L0 i prawie 9 razy dla F1/F0). Duży również dla pozostałych operacji stałopozycyjnych (FOC i obliczeń na macierzach) – kilka razy. Najmniejszy dla automatu, niewielki również dla operacji na liczbach zmiennopozycyjnych pojedynczej precyzji – ok. 1,5 razy. Różnice między F1 i F0 były większe niż między L1 i L0. Podobne zależności miedzy poprawą czasów wykonania dla poszczególnych testów dotyczyły wszystkich porównań między mikrokontrolerami z rdzeniem Cortex-M0(+), a mikrokontrolerami z rdzeniem Cortex-M3.

Czasy wykonania dla F1 były ok. 1,6-2,2 razy krótsze niż dla L1. Różnice były najmniejsze dla obliczeń na liczbach zmiennopozycyjnych (pojedynczej i podwójnej precyzji).

Różnice czasów między F4 i F1 były stosunkowo duże. Jeśli FPU dostępne na F4 nie było używane, to wynosiły 3-4 razy. Największe były dla FOC i operacji na macierzach, najmniejsze dla prostych obliczeń stałopozycyjnych. Jeśli na F4 FPU było używane, to różnice dla obliczeń zmiennopozycyjnych pojedynczej precyzji wynosiły ok. 20 razy dla prostych obliczeń i obliczeń na macierzach i ponad 50 razy dla FOC.

Czasy wykonania dla F7 były ok. 1,25-2 razy krótsze niż dla F4. Najmniejsze różnice występowały dla prostych obliczeń, największe – dla obliczeń na macierzach i FFT (w przypadku wersji zmiennopozycyjnej, jeżeli FPU było używane).

Porównując poprawę czasów wykonania przy przejściu od L0 do F7, można zauważyć, że występują znaczne różnice między poszczególnymi testami. W przypadku używania FPU różnice między F7 i L0/F0 dla obliczeń na liczbach zmiennopozycyjnych pojedynczej precyzji wynoszą od kilkudziesięciu do prawie 200 razy, natomiast dla obliczeń na liczbach zmiennopozycyjnych podwójnej precyzji – jedynie ok. 10 razy, dla automatu – 10-15 razy. Pomijając wpływ FPU, największy wzrost szybkości wykonania występował dla obliczeń stałopozycyjnych (kilkadziesiąt razy między F7 i L0/F0), natomiast dla obliczeń na liczbach zmiennopozycyjnych i automatu był znacznie mniejszy (10-15 razy).

Wydajność (FPU używane, jeśli dostępne)

Wyniki

Wydajność (FPU nie używane)

Wyniki

Wnioski

W przypadku wydajności przeliczonej na częstotliwość zegara, wyniki uzyskane dla mikrokontrolerów STM32L… były z reguły lepsze niż dla odpowiednich mikrokontrolerów STM32F…, chociaż przy porównaniu czasów wykonania z reguły to wersje F… osiągały lepsze wyniki.

Największe różnice w wydajności wystąpiły dla obliczeń na liczbach zmiennopozycyjnych pojedynczej precyzji w przypadku pojawienia się wsparcia sprzętowego (FPU) – największe dla FOC i FFT, trochę mniejsze dla prostych obliczeń i obliczeń na macierzach. Dla obliczeń stałopozycyjnych i zmiennopozycyjnych podwójnej precyzji największy wzrost wydajności występował między mikrokontrolerami z rdzeniem Cortex-M0(+) i mikrokontrolerami z rdzeniem Cortex-M3. Dla obliczeń zmiennopozycyjnych podwójnej precyzji w przypadku używania FPU największą wydajność miał F1, większą niż zarówno F4, jaki i F7. Dla automatu wzrost wydajności był umiarkowany, największy pomiędzy F4 i F7.

Różnice wydajności między F0 i L0 były niewielkie (kilka procent) – największe dla obliczeń zmiennopozycyjnych, mniejsze dla stałopozycyjnych i automatu.

Mikrokontrolery z rdzeniem Cortex-M3 (F1, L1) osiągały znacznie większą wydajność niż mikrokontrolery z rdzeniem Cortex-M0(+) (F0, L0) w przypadku obliczeń stałopozycyjnych (dla prostych obliczań – ponad 5 razy, FOC – ponad 3 razy, obliczenia na macierzach – ponad 2 razy), ale dla automatu i obliczeń zmiennopozycyjnych pojedynczej precyzji różnice były znacznie mniejsze i zdarzało się, że to mikrokontrolery z rdzeniem Cortex-M0(+) miały lepszą wydajność.

Wydajność L1 była do ok. 1,4 razy większa niż F1. Największe różnice występowały dla obliczeń na liczbach zmiennopozycyjnych (pojedynczej i podwójnej precyzji) – 1,35-1,4 razy, mniejsze dla automatu i obliczeń stałopozycyjnych. Dla prostych obliczeń stałopozycyjnych wydajność F1 była minimalnie większa. Różnice w poprawie wydajności między poszczególnymi testami były podobne jak dla porównania L0 i F0.

Przy porównaniu wydajności różnice między F4 a L1/F1 były umiarkowane. Różnice czasów wykonania były duże, ale duża była również różnica częstotliwości taktowania. Duże różnice wydajności wystąpiły tylko w przypadku obliczeń zmiennopozycyjnych pojedynczej precyzji w przypadku używania FPU. Dla automatu i prostych obliczeń stałopozycyjnych różnice były nieduże. Dla obliczeń na liczbach zmiennopozycyjnych podwójnej precyzji przy włączonym FPU (gdzie włączenie FPU, powodowało uzyskanie gorszych czasów wykonania), F4 wypadło gorzej niż L1 i tylko nieznacznie lepiej niż F1.

Różnice wydajności między F7 i F4 były największe dla obliczeń na macierzach oraz FFT operującego na liczbach stałopozycyjnych i, jeśli FPU było używane, zmiennopozycyjnych,. Najmniejsze różnice występowały dla prostych obliczeń (stało- i zmiennopozycyjnych), FOC operującego na liczbach zmiennopozycyjnych oraz FFT operującego na liczbach zmiennopozycyjnych, jeśli FPU nie było używane.

Przy porównaniu zmian wydajności przy przejściu od F0 do F7 występują podobne zależności między poszczególnymi testami, jak przy porównaniu czasów wykonania. Najmniejsze różnice wydajności występowały dla obliczeń na liczbach zmiennopozycyjnych podwójnej precyzji, stosunkowo niewielkie również dla automatu. Największe różnice występowały dla obliczeń stałopozycyjnych, a w przypadku używanie FPU – zmiennopozycyjnych pojedynczej precyzji.

Podsumowanie

Otrzymane wyniki różniły się w zależności od badanego mikrokontrolera, testu (zestawu operacji i obliczeń wykonywanych przez mikrokontroler) oraz sprawdzanych opcji i mechanizmów wspomagających wykonanie. W niektórych przypadkach różnice były niewielkie, w innych bardzo duże. Wpływ niektórych opcji i ustawień był różny w zależności od mikrokontrolera, przy czym można było zauważyć podobieństwa występujące między mikrokontrolerami wyposażonymi w ten sam (Cortex-M3) lub podobny (Cortex-M0, Cortex-M0+) rdzeń. Różnice czasów wykonania w zależności od włączenia jakiejś opcji były dla niektórych opcji/testów bardzo niewielkie – rzędu kilku, kilkunastu procent, a dla innych bardzo duże – rzędu kilku, kilkunastu czy nawet kilkudziesięciu razy. Nieraz występowały zależności między włączeniem jednej (czy kilku) opcji, a wpływem na czas wykonania innej opcji – szczególnie w przypadku, gdy zestaw badanych opcji był liczny. Sytuacje, w których włączenie opcji wspomagającej w jakiś sposób wykonanie programu powodowało, że czas wykonania był dłuższy, były nieliczne – przykładem takiej sytuacji jest niekorzystny wpływ zezwolenia na korzystanie z jednostki zmiennopozycyjnej pojedynczej precyzji na czas wykonywania obliczeń zmiennopozycyjnych podwójnej precyzji (gdzie teoretycznie można by oczekiwać, że FPU pojedynczej precyzji nie będzie miało znaczenia). Również wzrost wydajności czy szybkości wykonania programu pomiędzy mikrokontrolerami różnił się w zależności od testu.

Katarzyna Kosowska