Vai al contenuto

Benchmark

Questo documento descrive i benchmark di Klipper.

Benchmark del microcontrollore

Questa sezione descrive il meccanismo utilizzato per generare i benchmark della velocità di passaggio del microcontrollore Klipper.

L'obiettivo principale dei benchmark è fornire un meccanismo coerente per misurare l'impatto delle modifiche alla codifica all'interno del software. Un obiettivo secondario è fornire metriche di alto livello per confrontare le prestazioni tra i chip e tra le piattaforme software.

Il benchmark dello step rate è progettato per trovare la velocità di stepping massima che l'hardware e il software possono raggiungere. Questa velocità di stepping del benchmark non è raggiungibile nell'uso quotidiano poiché Klipper ha bisogno di eseguire altre attività (ad esempio, comunicazione mcu/host, lettura della temperatura, controllo endstop) in qualsiasi utilizzo nel mondo reale.

In generale, i pin per i test di benchmark sono scelti per far lampeggiare LED o altri pin innocui. Verifica sempre che sia sicuro guidare i pin configurati prima di eseguire un benchmark. Non è consigliabile pilotare uno stepper reale durante un benchmark.

Test di riferimento della frequenza di passi

Il test viene eseguito utilizzando lo strumento console.py (descritto in ). Il microcontrollore è configurato per la particolare piattaforma hardware (vedi sotto) e quindi quanto segue viene tagliato e incollato nella finestra del terminale console.py:

SET start_clock {clock+freq}
SET ticks 1000

reset_step_clock oid=0 clock={start_clock}
set_next_step_dir oid=0 dir=0
queue_step oid=0 interval={ticks} count=60000 add=0
set_next_step_dir oid=0 dir=1
queue_step oid=0 interval=3000 count=1 add=0

reset_step_clock oid=1 clock={start_clock}
set_next_step_dir oid=1 dir=0
queue_step oid=1 interval={ticks} count=60000 add=0
set_next_step_dir oid=1 dir=1
queue_step oid=1 interval=3000 count=1 add=0

reset_step_clock oid=2 clock={start_clock}
set_next_step_dir oid=2 dir=0
queue_step oid=2 interval={ticks} count=60000 add=0
set_next_step_dir oid=2 dir=1
queue_step oid=2 interval=3000 count=1 add=0

Quanto sopra testa tre stepper che fanno un passo simultaneo. Se l'esecuzione di quanto sopra comporta un errore "Rescheduled timer in the past" o "Stepper too far in past", indica che il parametro ticks è troppo basso (risulta in una velocità di incremento troppo veloce). L'obiettivo è trovare l'impostazione più bassa del parametro tick che si traduca in modo affidabile in un completamento positivo del test. Dovrebbe essere possibile dividere in due il parametro tick fino a trovare un valore stabile.

In caso di errore, è possibile copiare e incollare quanto segue per cancellare l'errore in preparazione per il test successivo:

clear_shutdown

Per ottenere i benchmark del singolo stepper, viene utilizzata la stessa sequenza di configurazione, ma solo il primo blocco del test precedente viene tagliato e incollato nella finestra di console.py.

Per produrre i benchmark trovati nel documento Features, il numero totale di passi al secondo viene calcolato moltiplicando il numero di stepper attivi per la frequenza nominale mcu e dividendo per il parametro tick finale. I risultati vengono arrotondati alla K più vicina. Ad esempio, con tre stepper attivi:

ECHO Test result is: {"%.0fK" % (3. * freq / ticks / 1000.)}

I benchmark vengono eseguiti con parametri adatti ai driver TMC. Per i microcontrollori che supportano STEPPER_BOTH_EDGE=1 (come riportato nella riga MCU config al primo avvio di console.py) usa step_pulse_duration=0 e invert_step=-1 per abilitare lo stepping ottimizzato su entrambi i bordi del impulso di passo. Per altri microcontrollori usa un step_pulse_duration corrispondente a 100ns.

Benchmark rateo passi AVR

La seguente sequenza di configurazione viene utilizzata sui chip AVR:

allocate_oids count=3
config_stepper oid=0 step_pin=PA5 dir_pin=PA4 invert_step=0 step_pulse_ticks=32
config_stepper oid=1 step_pin=PA3 dir_pin=PA2 invert_step=0 step_pulse_ticks=32
config_stepper oid=2 step_pin=PC7 dir_pin=PC6 invert_step=0 step_pulse_ticks=32
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc avr-gcc (GCC) 5.4.0. Entrambi i test a 16Mhz e 20Mhz sono stati eseguiti utilizzando simulavr configurato per un atmega644p (i test precedenti hanno confermato i risultati del simulavr match test su entrambi un 16Mhz at90usb e un 16Mhz atmega2560).

avr ticks
1 stepper 102
3 stepper 486

Benchmark rateo passi Arduino Due

Sul Due viene utilizzata la seguente sequenza di configurazione:

allocate_oids count=3
config_stepper oid=0 step_pin=PB27 dir_pin=PA21 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PB26 dir_pin=PC30 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PA21 dir_pin=PC30 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0.

sam3x8e ticks
1 stepper 66
3 stepper 257

Benchmark step rate Duet Maestro

La seguente sequenza di configurazione viene utilizzata su Duet Maestro:

allocate_oids count=3
config_stepper oid=0 step_pin=PC26 dir_pin=PC18 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PC26 dir_pin=PA8 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PC26 dir_pin=PB4 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0.

sam4s8c ticks
1 stepper 71
3 stepper 260

Benchmark step rate Duet Wifi

La seguente sequenza di configurazione viene utilizzata su Duet Wifi:

allocate_oids count=3
config_stepper oid=0 step_pin=PD6 dir_pin=PD11 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PD7 dir_pin=PD12 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PD8 dir_pin=PD13 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con gcc versione gcc versione 10.3.1 20210621 (rilascio) (GNU Arm Embedded Toolchain 10.3-2021.07).

sam4e8e ticks
1 stepper 48
3 stepper 215

Benchmark step rate Beaglebone PRU

Sulla PRU viene utilizzata la seguente sequenza di configurazione:

allocate_oids count=3
config_stepper oid=0 step_pin=gpio0_23 dir_pin=gpio1_12 invert_step=0 step_pulse_ticks=20
config_stepper oid=1 step_pin=gpio1_15 dir_pin=gpio0_26 invert_step=0 step_pulse_ticks=20
config_stepper oid=2 step_pin=gpio0_22 dir_pin=gpio2_1 invert_step=0 step_pulse_ticks=20
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc pru-gcc (GCC) 8.0.0 20170530 (sperimentale).

pru ticks
1 stepper 231
3 stepper 847

Benchmark step rate STM32F042

La seguente sequenza di configurazione viene utilizzata sull'STM32F042:

allocate_oids count=3
config_stepper oid=0 step_pin=PA1 dir_pin=PA2 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PA3 dir_pin=PA2 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PB8 dir_pin=PA2 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0.

stm32f042 ticks
1 stepper 59
3 stepper 249

Benchmark step rate STM32F103

Sull'STM32F103 viene utilizzata la seguente sequenza di configurazione:

allocate_oids count=3
config_stepper oid=0 step_pin=PC13 dir_pin=PB5 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PB3 dir_pin=PB6 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PA4 dir_pin=PB7 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0.

stm32f103 ticks
1 stepper 61
3 stepper 264

Benchmark step rate STM32F4

Sull'STM32F4 viene utilizzata la seguente sequenza di configurazione:

allocate_oids count=3
config_stepper oid=0 step_pin=PA5 dir_pin=PB5 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PB2 dir_pin=PB6 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PB3 dir_pin=PB7 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0. I risultati dell'STM32F407 sono stati ottenuti eseguendo un binario STM32F407 su un STM32F446 (e quindi utilizzando un clock a 168 Mhz).

stm32f446 ticks
1 stepper 46
3 stepper 205
stm32f407 ticks
1 stepper 46
3 stepper 205

STM32H7 benchmark della velocità di step

La seguente sequenza di configurazione viene utilizzata su un STM32H743VIT6:

allocate_oids count=3
config_stepper oid=0 step_pin=PD4 dir_pin=PD3 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PA15 dir_pin=PA8 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PE2 dir_pin=PE3 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 00191b5c con versione gcc arm-none-eabi-gcc (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revisione 273027].

stm32h7 ticks
1 stepper 44
3 stepper 198

Benchmark step rate STM32G0B1

Sull'STM32G0B1 viene utilizzata la seguente sequenza di configurazione:

allocate_oids count=3
config_stepper oid=0 step_pin=PB13 dir_pin=PB12 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PB10 dir_pin=PB2 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PB0 dir_pin=PC5 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 247cd753 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0.

stm32g0b1 ticks
1 stepper 58
3 stepper 243

Benchmark step rate LPC176x

La seguente sequenza di configurazione viene utilizzata sull'LPC176x:

allocate_oids count=3
config_stepper oid=0 step_pin=P1.20 dir_pin=P1.18 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=P1.21 dir_pin=P1.18 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=P1.23 dir_pin=P1.18 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0. I risultati a 120 Mhz LPC1769 sono stati ottenuti overclockando un LPC1768 a 120 Mhz.

lpc1768 ticks
1 stepper 52
3 stepper 222
lpc1769 ticks
1 stepper 51
3 stepper 222

Benchmark step rate SAMD21

La seguente sequenza di configurazione viene utilizzata sul SAMD21:

allocate_oids count=3
config_stepper oid=0 step_pin=PA27 dir_pin=PA20 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PB3 dir_pin=PA21 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PA17 dir_pin=PA21 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0 su un microcontrollore SAMD21G18.

samd21 ticks
1 stepper 70
3 stepper 306

Benchmark step rate SAMD51

La seguente sequenza di configurazione viene utilizzata sul SAMD51:

allocate_oids count=3
config_stepper oid=0 step_pin=PA22 dir_pin=PA20 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PA22 dir_pin=PA21 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PA22 dir_pin=PA19 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0 su un microcontrollore SAMD51J19A.

samd51 ticks
1 stepper 39
3 stepper 191
1 stepper (200Mhz) 39
3 stepper (200Mhz) 181

Benchmark della velocità di passo AR100

La seguente sequenza di configurazione viene utilizzata sulla CPU AR100 (Allwinner A64):

allocate_oids count=3
config_stepper oid=0 step_pin=PL10 dir_pin=PE14 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=PL11 dir_pin=PE15 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=PL12 dir_pin=PE16 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta sul commit 08d037c6 con la versione gcc or1k-linux-musl-gcc (GCC) 9.2.0 su un microcontrollore Allwinner A64-H.

AR100 R_PIO ticks
1 stepper 85
3 stepper 359

Benchmark step rate RP2040

Sull'RP2040 viene utilizzata la seguente sequenza di configurazione:

allocate_oids count=3
config_stepper oid=0 step_pin=gpio25 dir_pin=gpio3 invert_step=-1 step_pulse_ticks=0
config_stepper oid=1 step_pin=gpio26 dir_pin=gpio4 invert_step=-1 step_pulse_ticks=0
config_stepper oid=2 step_pin=gpio27 dir_pin=gpio5 invert_step=-1 step_pulse_ticks=0
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0 su una scheda Raspberry Pi Pico.

rp2040 ticks
1 stepper 5
3 stepper 22

Benchmark step rate MCU Linux

La seguente sequenza di configurazione viene utilizzata su un Raspberry Pi:

allocate_oids count=3
config_stepper oid=0 step_pin=gpio2 dir_pin=gpio3 invert_step=0 step_pulse_ticks=5
config_stepper oid=1 step_pin=gpio4 dir_pin=gpio5 invert_step=0 step_pulse_ticks=5
config_stepper oid=2 step_pin=gpio6 dir_pin=gpio17 invert_step=0 step_pulse_ticks=5
finalize_config crc=0

Il test è stato eseguito l'ultima volta su commit 59314d99 con versione gcc gcc (Raspbian 8.3.0-6+rpi1) 8.3.0 su un Raspberry Pi 3 (revisione a02082). È stato difficile ottenere risultati stabili in questo benchmark.

Linux (RPi3) ticks
1 stepper 160
3 stepper 380

Benchmark dispacciamento comandi

Il benchmark di invio dei comandi verifica quanti comandi "fittizi" possono elaborare il microcontrollore. È principalmente un test del meccanismo di comunicazione hardware. Il test viene eseguito utilizzando lo strumento console.py (descritto in ). Quanto segue è taglia e incolla nella finestra del terminale console.py:

DELAY {clock + 2*freq} get_uptime
FLOOD 100000 0.0 debug_nop
get_uptime

Al termine del test, determinare la differenza tra gli orologi riportati nei due messaggi di risposta "uptime". Il numero totale di comandi al secondo è quindi 100000 * mcu_frequency / clock_diff.

Nota che questo test potrebbe saturare la capacità USB/CPU di un Raspberry Pi. Se è in esecuzione su un computer host Raspberry Pi, Beaglebone o simile, aumenta il ritardo (ad esempio, DELAY {clock + 20*freq} get_uptime). Ove applicabile, i benchmark seguenti riguardano console.py in esecuzione su una macchina di classe desktop con il dispositivo connesso tramite un hub ad alta velocità.

MCU Rateo Build Build compiler
stm32f042 (CAN) 18K c105adc8 arm-none-eabi-gcc (GNU Tools 7-2018-q3-update) 7.3.1
atmega2560 (serial) 23K b161a69e avr-gcc (GCC) 4.8.1
sam3x8e (serial) 23K b161a69e arm-none-eabi-gcc (Fedora 7.1.0-5.fc27) 7.1.0
at90usb1286 (USB) 75K 01d2183f avr-gcc (GCC) 5.4.0
ar100 (seriale) 138K 08d037c6 or1k-linux-musl-gcc 9.3.0
samd21 (USB) 223K 01d2183f arm-none-eabi-gcc (Fedora 7.4.0-1.fc30) 7.4.0
pru (shared memory) 260K c5968a08 pru-gcc (GCC) 8.0.0 20170530 (experimental)
stm32f103 (USB) 355K 01d2183f arm-none-eabi-gcc (Fedora 7.4.0-1.fc30) 7.4.0
sam3x8e (USB) 418K 01d2183f arm-none-eabi-gcc (Fedora 7.4.0-1.fc30) 7.4.0
lpc1768 (USB) 534K 01d2183f arm-none-eabi-gcc (Fedora 7.4.0-1.fc30) 7.4.0
lpc1769 (USB) 628K 01d2183f arm-none-eabi-gcc (Fedora 7.4.0-1.fc30) 7.4.0
sam4s8c (USB) 650K 8d4a5c16 arm-none-eabi-gcc (Fedora 7.4.0-1.fc30) 7.4.0
samd51 (USB) 864K 01d2183f arm-none-eabi-gcc (Fedora 7.4.0-1.fc30) 7.4.0
stm32f446 (USB) 870K 01d2183f arm-none-eabi-gcc (Fedora 7.4.0-1.fc30) 7.4.0
rp2040 (USB) 873K c5667193 arm-none-eabi-gcc (Fedora 10.2.0-4.fc34) 10.2.0

Benchmark Host

È possibile eseguire test di temporizzazione sul software host utilizzando il meccanismo di elaborazione "batch mode" (descritto in ). Questo viene in genere fatto scegliendo un file G-Code grande e complesso e calcolando il tempo impiegato dal software host per elaborarlo. Per esempio:

time ~/klippy-env/bin/python ./klippy/klippy.py config/example-cartesian.cfg -i something_complex.gcode -o /dev/null -d out/klipper.dict
Torna su