1

Je suis sur gba normallement mais comme il n'y a pas grand monde je viens poser une ptite question ici.

J'aimerais savoir dans quelle bibliothèque de gcc se trouve memmset. J'ai regardé stdlib.h mais j'ai pas trouvé.
Autrement comment cette instruction est elle codé et comment ce fait il qu'elle soit plus rapide qu'une boucle for() .
Vive le coding gba.
www.codegba.fr.st

2

string.h

3

Elle est plus rapide car elle est programmée en assembleur optimisé et initialise par paquets de 4 (ou 8 suivant la plateforme) octets.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

4

déjà, elle doit bosser sur des long...
=> copie les octets 4 par 4.
ensuite, (du moins sur TI), il me semble que la boucle est partiellement déroulée (pas sûr, mais il me semble avoir lu qqc à ce sujet)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

5

c koi la différence avec ce qu'a dis Thibaut ? confus

6

mat
a écrit : J'aimerais savoir dans quelle bibliothèque de gcc se trouve memmset. J'ai regardé stdlib.h mais j'ai pas trouvé.

Ce n'est pas GCC qui décide ça, c'est la librairie C.
Mais si la librairie C respecte le standard ANSI (ou du moins le respecte en partie comme TIGCCLIB), c'est dans string.h.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

squale92 a écrit :
déjà, elle doit bosser sur des long... => copie les octets 4 par 4.

Oui, quand c'est possible (sur TI-89/92+/V200: chaîne de 4 octets en une adresse paire ou chaîne de plus de 4 octets).
ensuite, (du moins sur TI), il me semble que la boucle est partiellement déroulée (pas sûr, mais il me semble avoir lu qqc à ce sujet)

En effet. Mais ça dépend de la librairie C utilisée (sur TI-89/92+/V200, c'est AMS+tigcc.a, et memset est dans AMS).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

nEUrOne> rien, si ce n'est que ce sont des post croisés
(qd j'ai commencé à écrire, Thibaut n'avait pas encore posté, et je n'avais donc pas pu voir son post)


Kevin> merci pr les précisions smile
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

9

oki, merci je pensais que j'avais un défaut de compréhension ... mais je pense que non maintenant wink

10

J'ai trouvé aucun définition de memset dans string.h tsss

Par contre c'est quoi un boucle partiellement déroulée?
Vive le coding gba.
www.codegba.fr.st

11

voilà une définition d'un memset:

void *memset(void *s,int c,int n)
{
        char *cp = s;
        while (n--)
                *cp++ = c;
        return s;
}


je pense qu'une boucle déroulée, c'est au lieux de faire :
        while (n--)
                *cp++ = c;


tu fais ca:

        while (n-=4)
                {
                *cp++ = c;
                *cp++ = c;
                *cp++ = c;
                *cp++ = c;
                }


enfin, je pense .... grin tu déroules ta boucle koi ... pour que ca prenne moins de tps (boucle plus petite)

12

ok pour la boucle déroulée j'ai compris..
par contre pour la définition de memset c'est quasiment ce que j'avais fait (c'était pour un remplissage d'écran).
alors si c'est ça qu'il y a dans la bibliothèque standart je comprends pas comment ça peut aller plus vite.
Est il possible que cette définition codée en assembleur aille trois plus vite qu'en c?
Vive le coding gba.
www.codegba.fr.st

13

il me semble que dans tigcc, c pas dans string.h...
mais au niveau ANSI, il me semble que c défini dans string.h, non ?
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

14

nEUrOne> oué, dérouler une boucle, ça rvient à ça smile
Pour que le memset du TIOS soit 3x plus rapide que le tien, il suffit que celui du TIOS soit plus déroulé que le tien...

enfin, Kevin précisera surement plus, à son habitude smile
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

15

mais moi je suis pas sur ti, je suis sur gba...

En fait plus le déroulement est grand plus c'est rapide? Interessant...
Vive le coding gba.
www.codegba.fr.st

16

il est surement codé en ASM (ce qui n'est pas des plus rare)

dans TiGCC, il me semble que c aussi dans mem.h et c'est codé en ASM

17

mat : une fonction codée en ASM par un humain expert sera toujours plus rapide, ou du moins égale en vitesse, que la même fonction issue d'un code C, même sur de très bons compilateurs.

Ce n'est pas en déroulant plus la boucle que l'on réalise la meilleur façon de gagner des cycles processeur. Le memset de la GBA doit exploiter des spécificités du système de la GBA, peut-être copie-t-elle par paquets de 64 bits, ou incrémente le pointeur d'une façon plus efficace que ne le fait ton compilateur, etc...
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

18

-

19

Arf si sa fonction est exactement celle-là, alors le gain de vitesse n'est pas du tout étonnant grin
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

20

erf smile
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

21

héhé wink

22

mat a écrit :
J'ai trouvé aucun définition de memset dans string.h tsss

C'est peut-être dans mem.h alors.
squale92
a écrit : il me semble que dans tigcc, c pas dans string.h...

Si.
mais au niveau ANSI, il me semble que c défini dans string.h, non ?

Je ne sais pas. J'ai regardé les headers de MinGW32, et chez eux, c'est dans string.h, et il y a un mem.h qui se contente d'inclure string.h.
squale92 a écrit :
nEUrOne> oué, dérouler une boucle, ça rvient à ça smile
Pour que le memset du TIOS soit 3x plus rapide que le tien, il suffit que celui du TIOS soit plus déroulé que le tien...

enfin, Kevin précisera surement plus, à son habitude smile

Ce que tu dis est à peu près correct, mais attention le temps d'exécution d'un memset se décompose en 2 temps:
- le temps de remplissage, qui ne change pas si on déroule la boucle
- l'overhead de la boucle, qui lui diminue effectivement d'un facteur de 3 si la boucle est 3 fois plus déroulée. Et si la boucle est totalement déroulée, l'overhead est nul.
Ceci fait que le temps total ne diminue pas d'un facteur de 3 si on déroule la boucle 3 fois plus! Et en fait, plus la boucle est déjà déroulée, moins on gagne de temps en déroulant encore plus, et plus on perd de la place en continuant à dérouler, donc la rentabilité diminue nettement au fur et à mesure du déroulement.
D'ailleurs, ça ne sert à rien de dérouler une boucle à la main en C, il suffit de passer -funroll-loops à GCC. Et GCC fait aussi en sorte que la boucle soit déroulée correctement. Le déroulement proposé par nEUrOne ne marche correctement que si n est multiple de 4. Et d'ailleurs, il faudrait d'abord convertir le tout en écriture long par long avant de commencer à dérouler la boucle.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

23

Kevin Kofler a écrit :
Le déroulement proposé par nEUrOne ne marche correctement que si n est multiple de 4.


ça coulait de source ... roll