Pour tous le message suivant, je prend comme exemple un processeur intel core i7. Sur ce processeur, une multiplication flotante prend 5 cycles mais il est possible de démarrer une nouvelle multiplication à chaque cycles avec un maximum de 3 multiplication en même temps. Pour les additions et soustraction c'est la même chose mais en 3 cycles.
Pour prendre un exemple que je connais bien : la fonction exponentielle. L'exemple est un peu biaisé mais j'y reviendrais à la fin. Son calcul avec les fonctions interne repose sur l'instruction f2xm1 qui prend 58 cycles.
Sont calcul en soft ce fait par une réduction de e^x vers 2^k * e^f avec f dans l'intervalle [-0.5,0.5] :
La réduction nécessite 3 multiplications, une addition et deux soustractions. Mais, les trois multiplication peuvent être faites en parallèle. Au final la réduction ce fais en 13 cycles.
Le calcul de l'exponentielle sur l'intervalle réduit ce fait par une approximation polynomiale. La méthode basique demande un polynôme de degré 6 pour avoir la bonne précision, en pratique 9 multiplication qui ne peuvent être faites en parallèle. Mais si on passe par un polynôme en forme de Pade, on passe a 11 multiplication mais qui peuvent être faites en parallèle deux par deux. Si on rajoute les additions, on arrive à 24 cycles.
Le calcul final ce fait avec une opération logique qui peut être faite en parallèle de l'étape précédente, et une multiplication et une addition pour un coût de 6 cycles.
Si on rajoute la gestions des NaN et autres Inf, on arrive à un 47 cycles une fois bien tassé. Si on a besoin de la gestion des nombres dénormalisés, on rajoute 4 cycles au cas standard. (le cas dénormalisé prenant lui beaucoup plus de temps...)
On peut ce dire que l'économie est faible, mais ce qu'il faut voir c'est que l'instruction f2xm1 seule ne suffie pas à calculer l'exponentielle. L'exponentielle est calculée avec la formule e^x = 2^(x * log2(e)), il faut rajouter au final une audition, une soustraction et une multiplication ainsi que quelque petits détails et prendre en compte que f2xm1 bloque les port 0 1 et 5 de l'unitée de calcul et que donc on ne peut rien faire d'autre pendant 58 cycles. On arrive à 73 cycles auxquels il faut rajouter 3 cycles pour être sûr que tout ce passe bien avec les dénormalisés.
Au final la version soft est nettement gagnante. Principalement car la multiplication est très rapide et à un reciprocal throughput d'un seul cycle.
Par contre, cet exemple est biaisé : les deux fonction sin et cos sont globalement aussi rapide en hard qu'en soft mais ce sont les seules avec la fonction sincos qui calcule les deux en même temps car ce sont les seule ou la version hardware est vraiment très proche de la version software. Pour toutes les autre fonctions du même genre, il y a souvent une réduction à faire à l'aide de quelques instructions avant. Et cette réduction est nécessaire aussi bien en hard qu'en soft.
Mais la version soft conserve l'avantage de ne pas occuper tout les ports et donc de permettre de dispatcher quelques autres instruction en même temps si possible ainsi que d'être beaucoup plus portable que de l'assembleur.
Et juste pour terminer, l'instruction fsin ne prend un peu moins que 50 cycles que dans le cas ou tu veux une précision sur 32 bits. Pour une précision complète elle demande 100 cycles, il y a moyen de faire énormément de choses pendant ce temps la notament environs 30 multiplication s'il n'y a pas de dépendances trop fortes.
[^] # Re: À propos de SSE et AVX
Posté par beagf . En réponse à la dépêche Intel Sandy Bridge et Linux : état des lieux. Évalué à 10.
Pour tous le message suivant, je prend comme exemple un processeur intel core i7. Sur ce processeur, une multiplication flotante prend 5 cycles mais il est possible de démarrer une nouvelle multiplication à chaque cycles avec un maximum de 3 multiplication en même temps. Pour les additions et soustraction c'est la même chose mais en 3 cycles.
Pour prendre un exemple que je connais bien : la fonction exponentielle. L'exemple est un peu biaisé mais j'y reviendrais à la fin. Son calcul avec les fonctions interne repose sur l'instruction f2xm1 qui prend 58 cycles.
Sont calcul en soft ce fait par une réduction de e^x vers 2^k * e^f avec f dans l'intervalle [-0.5,0.5] :
Si on rajoute la gestions des NaN et autres Inf, on arrive à un 47 cycles une fois bien tassé. Si on a besoin de la gestion des nombres dénormalisés, on rajoute 4 cycles au cas standard. (le cas dénormalisé prenant lui beaucoup plus de temps...)
On peut ce dire que l'économie est faible, mais ce qu'il faut voir c'est que l'instruction f2xm1 seule ne suffie pas à calculer l'exponentielle. L'exponentielle est calculée avec la formule e^x = 2^(x * log2(e)), il faut rajouter au final une audition, une soustraction et une multiplication ainsi que quelque petits détails et prendre en compte que f2xm1 bloque les port 0 1 et 5 de l'unitée de calcul et que donc on ne peut rien faire d'autre pendant 58 cycles. On arrive à 73 cycles auxquels il faut rajouter 3 cycles pour être sûr que tout ce passe bien avec les dénormalisés.
Au final la version soft est nettement gagnante. Principalement car la multiplication est très rapide et à un reciprocal throughput d'un seul cycle.
Par contre, cet exemple est biaisé : les deux fonction sin et cos sont globalement aussi rapide en hard qu'en soft mais ce sont les seules avec la fonction sincos qui calcule les deux en même temps car ce sont les seule ou la version hardware est vraiment très proche de la version software. Pour toutes les autre fonctions du même genre, il y a souvent une réduction à faire à l'aide de quelques instructions avant. Et cette réduction est nécessaire aussi bien en hard qu'en soft.
Mais la version soft conserve l'avantage de ne pas occuper tout les ports et donc de permettre de dispatcher quelques autres instruction en même temps si possible ainsi que d'être beaucoup plus portable que de l'assembleur.
Et juste pour terminer, l'instruction fsin ne prend un peu moins que 50 cycles que dans le cas ou tu veux une précision sur 32 bits. Pour une précision complète elle demande 100 cycles, il y a moyen de faire énormément de choses pendant ce temps la notament environs 30 multiplication s'il n'y a pas de dépendances trop fortes.