Voici 3 réflexions:
1) La première est que l’utilisation de 64 bits (ARMv8) induit automatiquement l’utilisation de plus de mémoire aussi bien pour le code que les données. Le classique index de boucle
for (int i=0 ; i<1000 ; i++) { … }
for (int i=0 ; i<1000 ; i++) { … }
prenait 32 bits (alors que 16 suffisaient largement) maintenant il en faudra 64 sans aucun gain. Sur un serveur avec 16 Go de RAM on ne s’inquiète pas de ce genre de détail, mais sur une RPi avec seulement 1 Go (dont une partie est prise par la vidéo) on fait beaucoup plus attention.
Notez que :
- Avec des pointeurs sur 32 bits on peut adresser 4 Go. Donc 32 bits sont largement suffisant pour un RPi.
- Si on écrit "for ( int16 i=0 …)" c’est le code qui est plus lent.
- Cette inflation des besoins en mémoire induite par le passage de 16 à 32 puis à 64 bits coûte tellement cher pour les applications embarquées qu’ARM a développé un jeu d’instructions 16 bits (Thumb et Thumb-2).
2) Le deuxième réflexion est que, pour le moment, on n’a pas de distributions Linux 64 bits (aarch64) utilisant le nouveau jeu d’instruction de ARMv8. Or ce qui fait l’intérêt de l’architecture ARMv8 c’est que son jeu d’instructions a été conçu sans la contrainte de compatibilité avec le jeu d’instructions 32 bits. La performance ne vient pas des 64 bits mais de ce design moderne et sans compromis. (Le travail est en cours avec CentOS-7)
3) Comparaison des vitesses de calcul:
Note: Chaque RPi2 de notre cluster est légèrement over-clocké (1GHz) sans jamais avoir de plantages (mais alimenté en 5.2V) . Dans le fichier /boot/config.txt on a :
arm_freq=1000
core_freq=600
sdram_freq=500
over_voltage=2
over_voltage_sdram_p=4
over_voltage_sdram_i=0
over_voltage_sdram_c=0
Pour faire cette comparaison entre RPi2 à 1GHz et RPi3 à 1.2GHz (et avec un Intel i7) on va utiliser la commande “openssl speed rsa -multi x” où x est le nombre de threads à utiliser.
On devrait avoir un gain de 20% en faveur du RPi3.
Voici les résultats obtenue avec openssl 1.0.1
**** Résultats sur un RPi3 ****
[rpi3 ~]# openssl speed rsa -multi 1
[rpi3 ~]# openssl speed rsa -multi 1
sign verify sign/s verify/s
rsa 512 bits 0.000775s 0.000067s 1290.0 15000.4
rsa 1024 bits 0.003928s 0.000198s 254.6 5038.5
rsa 2048 bits 0.024988s 0.000704s 40.0 1419.6
rsa 4096 bits 0.172203s 0.002684s 5.8 372.6
[rpi3 ~]# openssl speed rsa -multi 4
================= RPi3 4x1.2Ghz ====================
sign verify sign/s verify/s
rsa 512 bits 0.000195s 0.000019s 5115.2 53333.3
rsa 1024 bits 0.001344s 0.000073s 744.3 13746.1
rsa 2048 bits 0.009693s 0.000283s 103.2 3535.3
rsa 4096 bits 0.071341s 0.001157s 14.0 864.3
**** Résultats sur un des RPi2 du cluster ****
[rpi2 ~]# openssl speed rsa -multi 1
[rpi2 ~]# openssl speed rsa -multi 1
sign verify sign/s verify/s
rsa 512 bits 0.001373s 0.000109s 741.4 9259.0
rsa 1024 bits 0.006555s 0.000340s 152.5 2940.4
rsa 2048 bits 0.043712s 0.001256s 22.9 797.4
rsa 4096 bits 0.312812s 0.004840s 3.2 206.6
[rpi2 ~]# openssl speed rsa -multi 4
================= RPi2 4x1Ghz ======================
sign verify sign/s verify/s
rsa 512 bits 0.000342s 0.000027s 2923.9 36613.4
rsa 1024 bits 0.001644s 0.000085s 608.1 11721.2
rsa 2048 bits 0.010966s 0.000315s 91.2 3179.8
rsa 4096 bits 0.078496s 0.001213s 12.7 824.4
On constate que le RPi3 apporte bien un gain de vitesse souvent de plus de 20% sur le calcul pur. Donc avec un Linux 32 bits (ARMv7) on a l'avantage de la vitesse sans avoir besoin de plus de mémoire. Il n'est donc pas sur qu'un linux 64 bits (ARMv8) soir vraiment utile.
Le gain en calcul pur est malheureusement noyé dans le fait que tout le reste est à la même vitesse sur un RPi2 et RPi3. On aurait plus besoin de 2 Go de RAM et d'un port Giga Ethernet. (Comme sur le ODROID-C2).
Donc, si on devait faire un upgrade ce serait plus pour un odroid-c2 qu'un RPi3 !
**** Résultats sur un intel i7 3.1Ghz ****
[i7 ~]# openssl speed rsa -multi 1
================= i7-4770S 1x3.1Ghz ================
sign verify sign/s verify/s
rsa 512 bits 0.000041s 0.000003s 24187.4 297005.8
rsa 1024 bits 0.000162s 0.000009s 6158.7 114694.3
rsa 2048 bits 0.000980s 0.000029s 1020.9 34625.3
rsa 4096 bits 0.007335s 0.000108s 136.3 9241.4
[i7 ~]# openssl speed rsa -multi 4
================= i7-4770S 4x3.1Ghz ================
sign verify sign/s verify/s
rsa 512 bits 0.000012s 0.000001s 86956.5 1000000.0
rsa 1024 bits 0.000046s 0.000003s 21831.1 400000.0
rsa 2048 bits 0.000273s 0.000008s 3659.7 120320.9
rsa 4096 bits 0.002098s 0.000032s 476.6 31564.4
[i7 ~]# openssl speed rsa -multi 8
================= i7-4770S 8x3.1Ghz ================
sign verify sign/s verify/s
rsa 512 bits 0.000011s 0.000001s 93570.5 1089285.7
rsa 1024 bits 0.000047s 0.000003s 21498.2 400000.0
rsa 2048 bits 0.000276s 0.000008s 3617.7 125000.0
rsa 4096 bits 0.002074s 0.000030s 482.1 33773.2
Pour voir la fréquence d'horloge en temps réel:
cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq
Benchmarks officiels: https://www.raspberrypi.org/magpi/raspberry-pi-3-specs-benchmarks/
rsa 512 bits 0.000012s 0.000001s 86956.5 1000000.0
rsa 1024 bits 0.000046s 0.000003s 21831.1 400000.0
rsa 2048 bits 0.000273s 0.000008s 3659.7 120320.9
rsa 4096 bits 0.002098s 0.000032s 476.6 31564.4
[i7 ~]# openssl speed rsa -multi 8
================= i7-4770S 8x3.1Ghz ================
sign verify sign/s verify/s
rsa 512 bits 0.000011s 0.000001s 93570.5 1089285.7
rsa 1024 bits 0.000047s 0.000003s 21498.2 400000.0
rsa 2048 bits 0.000276s 0.000008s 3617.7 125000.0
rsa 4096 bits 0.002074s 0.000030s 482.1 33773.2
Pour voir la fréquence d'horloge en temps réel:
cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq
Benchmarks officiels: https://www.raspberrypi.org/magpi/raspberry-pi-3-specs-benchmarks/