Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Optimiser des multiplications sur PIC16
Superphénix
Débutant
Débutant
Messages : 34
Enregistré en : mars 2020

#1 Message par Superphénix » dim. 3 mai 2020 18:41

Bonjour

Je suis en train d’optimiser un gros programme avec pleins d'interruptions de partout fait pour un PIC16F1779.

Dans mon long programme j'ai tout fait pour ne pas utiliser des float pour éviter au pic 8bit de devoir faire des calculs trop longs et compliqués.

Par exemple au lieux de faire : (5/3)*300 = 5,000000.10^2 (le tout en float)
Et au lieux de faire : (5/3)*300 = 300 (le tout en int)
Je fait ((5*1000/3)*300)/1000=499 (le tout en int).
Je précise aussi que pour des raisons que je ne vais pas expliquer ici je ne peut pas inverser les variables en faisant 300*5/3=500.

Le soucis c'est que je rajoute 2 opérations qui sont une multiplication et une division (*/1000), et si j'ai bien compris les multiplications et divisions ne se font pas d'un seul coup par le PIC, mais c'est tout un algorithme qui est utilisé à la place, et donc ça ralenti beaucoup le programme. Surtout qu'on n'est pas sur des char mais des variables de type unsigned long.

J'ai alors eu l'idée de remplacer les *1000 par des <<10 et >>10.
Exemple : (((5<<10)/3)*300)>>10=499 (le tout en int). C'est moins précis mais ça me va.

Mais du coup je me demande si les décalages sont vraiment avantageux ? Par exemple est ce que le PIC exécute <<10 comme ça :
<<1, <<1, <<1, <<1, <<1, <<1, <<1, <<1, <<1, <<1
ou est ce qu'il l’exécute plutôt comme ça : <<8 , <<2 ? (car PIC 8bit)

Optimiser des multiplications sur PIC16
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 231
Âge : 65
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#2 Message par Claudius » dim. 3 mai 2020 20:26

Bonsoir,

Sauf erreur de ma part, le décalage à gauche << 10 sera interprété comme 10 décalages à gauche << 1 car le jeu d'instruction ne permet d'exécuter des décalages que de une position à la fois

Cf. la datasheet du PIC16(L)F1777/8/9 (page 526 / 630 ;-)

Après, il est possible que le compilateur "s’aperçoive" qu'au lieu de faire 8 décalages à gauche << 1 + report dans la carry, il serait plus judicieux de passer par copie d'octet mais là, faut voir le code assembleur généré pour en être sûr...

Optimiser des multiplications sur PIC16
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1663
Âge : 69
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » dim. 3 mai 2020 20:52

bonsoir,


cette procedure de decalage à gauche de 10 , ne sera valable que pour un domaine restraint de variable
risque de tronquer les valeurs..

et une utilisation de long 32 bits pour eviter les floats ?

des qu'on utilise une multiplication ou division, on embarque dans le code toute la librairie Maths..
qui pese pas mal en taille.
Aides toi, le ciel ou Fantastpic t'aideras

Optimiser des multiplications sur PIC16
satinas
Confirmé
Confirmé
Messages : 516
Enregistré en : novembre 2015

#4 Message par satinas » dim. 3 mai 2020 21:23

Bonsoir

Fenêtre Window/Debuggging/Stopwatch pour compter les cycles en exécution debug.
Les résultats sur un 16F887, avec xc8 non optimisé :

Code : Tout sélectionner

x = 5
x <<= 10    81 cycles, boucle de 10 décalages
x /= 3    1915 cycles
x *= 300   439 cycles
x >>= 10    90 cycles

Optimisé o3 en vitesse , je savais pas que c'était possible sans payer.

Code : Tout sélectionner

x = 5
x <<= 10    81 cycles, boucle de 10 décalages, il a toujours pas envie de déplacer des octets, le fainéant
x /= 3    1690 cycles
x *= 300   377 cycles
x >>= 10    90 cycles

Fenêtre Window/Debuggging/Output/Disassembly_Listing_File pour le code asm
Sur picList.com il y a des tas de routines de calcul optimisées pour 16F.

Optimiser des multiplications sur PIC16
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1601
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » dim. 3 mai 2020 22:33

Bonsoir satinas, paulfjujo, Superphénix, et tout le forum,

satinas a écrit :Source du message le code asm Sur picList.com il y a des tas de routines de calcul optimisées pour 16F.


Je lui propose pas, il risque d'être là après le confinement :-D

Superphénix a écrit :Source du message Je sais, mais si je réapprends à utiliser l'ASM pour un programme aussi long j'y suis encore après le confinement


==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Optimiser des multiplications sur PIC16
satinas
Confirmé
Confirmé
Messages : 516
Enregistré en : novembre 2015

#6 Message par satinas » lun. 4 mai 2020 06:30

Bonjour à tous

Pour xc8, je n'avais pas vu ce message, optimisation très limitée.
advisory: (2051) The current licence does not permit the selected optimization level, using level -O1

La doc de xc8 parle d'un type int de 24 bits "unsigned short long" 'mais il passe pas à la compilation.

Bah on peut employer les routines asm sans les comprendre, c'est mon cas :-)
Il suffit de passer l'adresse des variables C. On peut même travailler sur 24 bits.

Les pic 16 bits font des opérations int 16*16->32 en 1 cycle et 32/16->16 en 18 cycles.
Avec les dsPic on passe à 6 cycles, et on a en plus le fractionnaire à virgule fixe 16 bits à la même vitesse.

Optimiser des multiplications sur PIC16
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1663
Âge : 69
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » lun. 4 mai 2020 08:51

satinas a écrit :Bonsoir

Fenêtre Window/Debuggging/Stopwatch pour compter les cycles en exécution debug.
Les résultats sur un 16F887, avec xc8 mode o3 :

Code : Tout sélectionner

x = 5
x <<= 10    81 cycles, boucle de 10 décalages, il a toujours pas envie de déplacer des octets, le fainéant
x /= 3    1690 cycles
x *= 300   377 cycles
x >>= 10    90 cycles

Fenêtre Window/Debuggging/Output/Disassembly_Listing_File pour le code asm
Sur picList.com il y a des tas de routines de calcul optimisées pour 16F.


le meme test avec mikroC
en Level 4 ( idem en Level 3 ou Level 5 !!)

Code : Tout sélectionner


  
//                MikroC     XC8
   x = 5 ;      //  4  
   x <<= 10;  //  94          81 cycles, boucle de 10 décalages
   x /= 3  ;   // 349          1915 cycles
   x *= 300 ; // 188         439 cycles
   x >>= 10 ;//  90           90 cycles
 


XC8 en version libre est bridé ! sinon il faut payer .. comme pour MikroC
Aides toi, le ciel ou Fantastpic t'aideras

Optimiser des multiplications sur PIC16
satinas
Confirmé
Confirmé
Messages : 516
Enregistré en : novembre 2015

#8 Message par satinas » lun. 4 mai 2020 10:03

Pour les entiers xc8 24 bits unsigned short long, il faut passer en C90 dans les options de compilation.
On améliore encore pas mal.

Code : Tout sélectionner

x = 5
x <<= 10    80 cycles
x /= 3    1121 cycles
x *= 300   302 cycles
x >>= 10    80 cycles

Optimiser des multiplications sur PIC16
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 231
Âge : 65
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#9 Message par Claudius » mar. 5 mai 2020 14:23

Bonjour satinas et tout le forum,

... et que donne le code précédent où les constantes sont des variables explicites initialisées à ces mêmes constantes; à savoir:

Code : Tout sélectionner

x = 5
y = 3
z = 300

x <<= 10    80 cycles
x /= y     ??? cycles
x *= z     ??? cycles
x >>= 10    80 cycles

Car il est possible que le compilateur optimise les traitements sur les manipulations des constantes, chose importante à savoir si le cas :geek:

Merci par avance

Optimiser des multiplications sur PIC16
satinas
Confirmé
Confirmé
Messages : 516
Enregistré en : novembre 2015

#10 Message par satinas » mar. 5 mai 2020 15:23

Bonjour Claudius,

voilà les résultats, ça rallonge pas mal.
Je n'ai pas la version optimisée, qui doit faire beaucoup mieux, à comparer avec MikroC, qui est moins bon dans les décalages.

entiers xc8 24 bits unsigned short long

Code : Tout sélectionner

x = 5
y = 3
z = 300

x <<= 10    80 cycles
x /= y    1181 cycles
x *= z     378 cycles
x >>= 10    80 cycles


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités