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 ---
- 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 ---
Modérateur : Jérémy
Optimiser des multiplications sur PIC16
-
Superphénix
Débutant- Messages : 54
- Enregistré en : mars 2020
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)
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
Passionné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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...
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...
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Optimiser des multiplications sur PIC16
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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.
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.
Optimiser des multiplications sur PIC16
Bonsoir
Fenêtre Window/Debuggging/Stopwatch pour compter les cycles en exécution debug.
Les résultats sur un 16F887, avec xc8 non optimisé :
Optimisé o3 en vitesse , je savais pas que c'était possible sans payer.
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.
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
Bonsoir satinas, paulfjujo, Superphénix, et tout le forum,
Je lui propose pas, il risque d'être là après le confinement
A+
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
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+
Optimiser des multiplications sur PIC16
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.
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
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
Optimiser des multiplications sur PIC16
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.
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
Passionné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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:
Car il est possible que le compilateur optimise les traitements sur les manipulations des constantes, chose importante à savoir si le cas
Merci par avance
... 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
Merci par avance
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Optimiser des multiplications sur PIC16
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
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
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 109 invités