Pensez vous quil y ait possiblité de simplifier cette routine??? - Algo - Programmation
Marsh Posté le 12-03-2007 à 14:44:46
L'idée c'est pas de voir le code assembleur qui est généré à partir de ce code et de le réduire si c'est possible ?
Marsh Posté le 12-03-2007 à 15:14:11
L'idée c surtout deviter de tout coder en assembleur , se rendre compte que on peut optimiser des lignes en simplifiants les calculs et de tout recoder apres (car en asm tout est souvent tres lié).....
Marsh Posté le 15-03-2007 à 19:47:22
Tu peux déjà éviter de calculer 1/dx,1/dy,1/dz en divisant par l au lieu de multiplier par l:
Code :
|
Marsh Posté le 16-03-2007 à 12:01:03
Si tes nombres sont des entiers, tu peux utiliser certains algo particuliers pour calculer abs, min et max.
Jette un coup d'oeil là : http://graphics.stanford.edu/~seander/bithacks.html
Il y a des algo amusants et peu évident pour faire tout ça.
Avec un peu de chance, ca te permettra de faire un code plus concis.
Marsh Posté le 16-03-2007 à 12:10:43
dividee a écrit : Tu peux déjà éviter de calculer 1/dx,1/dy,1/dz en divisant par l au lieu de multiplier par l: |
Bonne idée, mais dans ce cas là il faut faire attention aux min/max : les valeurs directes dx, dy et dz ne sont pas rangées dans le même ordre que leurs inverses...
Marsh Posté le 16-03-2007 à 12:53:00
bon pour info
on a effectivement viré les 1/dx 1/dy et pour le moment ca pose pas trop de problemes au minmax
pour linstant on est a 300bytes a peu pres tout compris (routine de base , vsync and co)
Marsh Posté le 16-03-2007 à 13:16:37
franceso a écrit : Bonne idée, mais dans ce cas là il faut faire attention aux min/max : les valeurs directes dx, dy et dz ne sont pas rangées dans le même ordre que leurs inverses... |
Effectivement, elles sont rangées dans l'ordre inverse, mais le calcul avec min/max est en fait le calcul de la valeur médiane, et l'inverse de la médiane est égale à la médiane des inverses...
[edit:] Si le nombre de valeur est impair (pour que la médiane soit bien définie).
Marsh Posté le 16-03-2007 à 13:33:51
dividee a écrit : Effectivement, elles sont rangées dans l'ordre inverse, mais le calcul avec min/max est en fait le calcul de la valeur médiane, et l'inverse de la médiane est égale à la médiane des inverses... |
effectivement, j'avais pas prêté attention à ce détail...
Marsh Posté le 16-03-2007 à 13:50:29
Solution tangente, vectorisons.
Disons que l'on a a { l1,l2,l3 }, et par rotation b { l2,l3,l1 }, c { l3,l1,l2 }.
Prenons le masque de mask_ab = a > b et mask_ac = a > c, alors le masque mask = mask_ab ^ mask_ac désigne la valeur médiane.
Extraction du masque etc...
SSE ftw.
Marsh Posté le 16-03-2007 à 18:07:31
tbp a écrit : Solution tangente, vectorisons. |
tu peut detailller un peu sil te plait??
sinon on a aussi une autre routine qui prend de la place :
Code :
|
pour le moment on la simplifié par :
Code :
|
bon ca fait pas tout fait la meme chose (calcul de c et s) mais bon
Marsh Posté le 16-03-2007 à 19:54:53
red faction a écrit : tu peut detailller un peu sil te plait?? |
Feignasse.
En plus les types sont mal définis, mais je vais supposer que a) ya que des flottants b) SSE2 n'est pas verbotten.
Avec les 3 flottants alignés (à 16 octets) sur la pile
Code :
|
... ce qui nous fait en gros 32 octets pour trouver une valeur absolue + mediane.
Reste 2 points à élucider.
Premierement d'ou vient le masque (dans xmm0 au début) pour virer les bits de signe: 2 solutions, soit le génerer avec
Code :
|
ou un truc plus lent dans le genre, soit le charger.
Ensuite, on a un masque dans un GPR mais il faut triturer les doublons.
En gros
Code :
|
mais rien de bien fringuant me vient à l'esprit, alors une bonne vielle LUT fera l'affaire.
Voilà.
Marsh Posté le 16-03-2007 à 22:01:13
et gcc 4.0 inventa les intrinsics SSE2
Ca fait qquelques temps qu'on a plus besoin de descendre au niveau ASM pour vectoriser quoique ce soit
Marsh Posté le 16-03-2007 à 22:17:10
Joel F a écrit : et gcc 4.0 inventa les intrinsics SSE2 |
Quelle intéressante notion!
Soit dit en passant
a) j'ai posté un désassemblage parce que le critère était la taille du code généré et incidemment mis à contribution g++ & intrinsics en amont.
b) les intrinsics viennent en droite ligne de chez Intel, historiquement gcc/g++ exposaient le tout via builtins.
Marsh Posté le 17-03-2007 à 02:10:21
Joel F a écrit : et gcc 4.0 inventa les intrinsics SSE2 |
sauf que la c un com qui doit tenir en 256b donc pas question de compiler quoi que se soit de haut niveau....
Marsh Posté le 12-03-2007 à 14:14:50
pour un intro vraiment tres petite (256b), j'ai besoin que cette routine prenne le moins de place possible et j'aimerai savoir s'il y a possiblilité d'optimiser (en taille) ce calcul: