UTILISER DES CLASS C++ AVEC MASM DIRECTX XAUDIO2BASICSOUND

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 5 janv. 2011 à 01:56
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 - 11 janv. 2011 à 17:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52658-utiliser-des-class-c-avec-masm-directx-xaudio2basicsound

ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
11 janv. 2011 à 17:21
l'instruction peut servir à cela:
http://www.masm32.com/board/index.php?topic=11061.0
tout y est ,code ,tests de rapidité ....
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
10 janv. 2011 à 22:58
Sur 64 bits:

.1
dec ecx
mov eax,[esi]
mov edx,[esi+4]
lea esi,[esi+8]
mov [edi],eax
mov [edi+4],edx
lea edi,[edi+8]
jne .1

ici, il n'y a aucun stall.

Une copie de 128 bits avec une seule instruction génèrera forcement un stall sur le jmp. Avec la prédiction de branchement, je ne suis pas sur que movdqa soit plus rapide. Là encore, la perte de mémoire est de 50%.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
10 janv. 2011 à 21:13
Tu ne me contredis pas car tu ne parles pas de l'utilisation.

Alloue 10000 fois 1 dword et compare 10000 movdqa puis 10000 mov reg32 (sans parler de la perte de mémoire induite). Ensuite alloue 1 fois 10000 dword et là d'accord.

Je n'ai pas trouvé le nombre de cycles utilisé par l'instruction movdqa et movdqu ni la page du forum masm qui en parle donc pas évident pour calculer quoi que ce soit.
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
10 janv. 2011 à 07:26
Desolé de te contredire , mais le gain à été verifié par des bancs d'essais (voir us masm forum) et c'est indiscutable.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 janv. 2011 à 21:36
en fait, le gain de vitesse n'est même pas certain car copier de la mémoire inutilisée n'est pas un gain de temps. Cela depends donc de l'utilisation.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 janv. 2011 à 21:22
oui, de même que la perte de mémoire est certaine aussi dans la plupart des cas.
l'instruction movdqu peut pallier au problème.
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
8 janv. 2011 à 14:52
avec movdqa , il n'y a pas 36 choix.
Ou l'adresse est un multiple de 16 ou on obtient un planté.
Le gain de rapidité est CERTAIN.L'astuce de programmation à utiliser est de traiter à part les data non alignés et d'utiliser movdqa pour celles qui le sont.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 janv. 2011 à 12:07
remarque qu'il serait aussi possible de faire l'alignement en commencant par un copy byte jusqu'a l'alignement 128 bits, puis copier par 128 bits pour finir par copy byte.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 janv. 2011 à 12:04
l'ennui est que cette instruction necessite un alignement obligatoire de 128 bits réel. les 4 bits de poids faible doivent être a zero sinon: exception.

Il est peut-etre plus simple dans le cas d'utilisation des instruction sse de tout aligner sur 128 bits.

Ton code n'as pas d'exemple a proprement parlé mais il est possible que Windows utilise des instructions 128 bits dans la gestion du heap.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 janv. 2011 à 11:47
C'est une optimisation que je ne trouves pas si interessante que cela car quand on copie, en général, on connait la taille de la copie.

je préfère un code du style:
size>>4
movdqa
size & 15
movsb

on perd moins de place tout en gardant l'optimisation fpu/sse,..
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
6 janv. 2011 à 19:42
ecx est utilisé comme pointeur sur wave pratiquement systématiquement dans le source traduit en asm par cl /Fa.
Je me suis contenté de le constater.
L'alignement 128 bits n'est pas utilisé dans ce source.
Pour le reste,un alignement (1,2,4..) est demandé explicitement par certaine structures et par certaines intructions (movdqa demande un alignement 16 bytes) .
Au dessus,je n'ai pas d'exemples.
L'intérêt est toujours le même,améliorer la vitesse d'execution en évitant de former des adresses byte par byte.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 janv. 2011 à 01:56
salut,

lea ecx,wave
call ??0CWaveFile@@QAE@XZ

il faut toujours prendre ecx ? On peut prendre n'importe quel registre ?

lea edx,wave
call ??0CWaveFile@@QAE@XZ

ça marche aussi ?


Qu'apporte l'alignement de 128 bits en terme d'optimisation par rapport à un alignement de 32 ou 64 bits ?

@++
Rejoignez-nous