Le 06-02-2012, Lucas Levrel <
lucas....@u-pec.fr> a écrit :
> Je dois initialiser à zéro un tableau de doubles, dans un programme
> compilé avec le compilateur Intel en -O3 et exécuté sur un Xeon.
>
> Qu'est-ce qui sera le plus rapide à l'exécution : memset, une boucle for,
> ou ex-æquo ?
Disons que ta question n'a pas beaucoup de sens.
Déjà, j'imagine que tu vas faire un memset en mettant tous les
bits à 0, en faisant l'hypothèse qu'un float dont tous les bits
sont nuls vaut 0.0.
C'est sûrement le cas sur ton Xeon, mais je ne pense pas
que ce soit garanti par la norme. L'avantage de la boucle
for est d'ếtre portable.
Côté lisibilité, je miserais aussi sur la boucle for.
Côté perf pures, j'ai du mal à imaginer un contexte
où la mise à 0 d'un tableau de flottant soit une partie
critique en temps de calcul. Ca faut quand même phase
d'initialisation, pas le coeur du souci.
Tout ceci étant dit, ça peut dépendre de pleins de choses.
Supposons que le compilo n'ait pas de traitement spécifique
pour la fonction memset: on compare la qualité de l'implantation
de memset à la qualité de l'optimiseur d'icc. Donc, faudrait
préciser quel memset, de quelle libc.
Quand memset reçoit ton tableau, il ne sait pas s'il est
bien aligné ou pas, et il doit calculer s'il a le droit de faire
des grandes écritures de 64 bits, ou pleins de petites de 8 bits.
Alors que le compilo le sait lui.
Si memset est une fonction "comme une autre", il y a un appel
de fonction, peut-être un défaut de cache.
Mais il est aussi possible que le compilo fasse de l'appel à
memset un cas particulier (il "reconnait" cette fonction).
Tout ça pour dire que le plus simple, une fois que tu t'es
assuré que tu avais vraiment besoin de savoir ça, que la
performance primait sur la lisibilité, il te reste à faire les
tests, sur différentes tailles de tableau (les résultats
pourraient varier), éventuellement à regarder l'assembleur
généré.
Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet