OVH Cloud OVH Cloud

[valarray] Efiicacite ?

20 réponses
Avatar
delta
Bonjour,

Le conteneur valarray a recemment ete aborde relativement a une classe
Vecteur.
J avais l intention d ecrire un petit algorithme de resolution d edo a 1 pas
(neanmoins, a pas et ordre variables), c est pourquoi l arithmetique du
valarray
m a seduit ...
Cependant, les resultats, en terme de performance, sont catastrophiques : le
temps
de calcul est environ 10 fois plus important lorsque j utilise les
operateurs du
valarray que lorsque j ai recours a une boucle for. J avoue que Stroustrup m
avait
pourtant suffisament alleche, de sorte que je reste sur ma faim (c est le
moins que
je puisse dire).
Par ailleurs, il evoque un principe de "lazy evaluation" mais je n arrive
pas a
combler le code entre les lignes. Ainsi, peut-etre que son sentiment s
appuie sur
une optimisation qui atomise tout ...

En vous remerciant.

PS : au risque que l on m envoie voir ailleurs, j ajoute que je programme a
l aide
de vs .net 7.1 (qui possede une stl raisonnable, d apres la rumeur).

10 réponses

1 2
Avatar
Benoit Rousseau
delta wrote:
"Philippe Guglielmetti" a écrit dans le message de
Si j'ai bien compris cette option, elle n'est utile que si tu compares
(intensivement) des nombres, ce qui ne semble pas être ton cas.
Et de toute manière fabs(a-b)<epsilon est toujours préférable à a==b...



J evite de tester l egalite de 2 reels, effectivement ... :-)


En parlant de réels, est ce que f/2.0 est aussi efficace que f*0.5 ?
Ou vaut t il mieux utiliser la multiplication ?

--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Luc Hermitte
Laurent Deniau wrote in
news::

Ca peut etre plus rapide mais pas de beaucoup (max 5-10%) ce que je
considere comme negligeable. Ca peut aussi etre plus lent du meme
ordre de grandeur. Pour les valarray de GCC 3.0+, Gaby te donnera
surement plus d'info, c'est lui qui les a ecrit et si je me souviens
bien il s'est bien casse la tete sur les benchs pour que soit au moins
aussi rapide :-)


J'en déduis que les benchs des valarrays que l'on voit sur le site de Blitz
++ ne concerne pas les derniers valarray...

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

Avatar
delta
"Laurent Deniau" a écrit dans le message de
news:

Ca peut etre plus rapide mais pas de beaucoup (max 5-10%) ce que je
considere

comme negligeable. Ca peut aussi etre plus lent du meme ordre de grandeur.
Pour

les valarray de GCC 3.0+, Gaby te donnera surement plus d'info, c'est lui
qui

les a ecrit et si je me souviens bien il s'est bien casse la tete sur les
benchs

pour que soit au moins aussi rapide :-)


Oui j aimerais bien que Gaby nous donne son point de vue :-) Par ailleurs,
si
l un d entre vous possede VS2003 et qu il utilise les valarrays, je serais
interesse par son impression sur l efficacite du conteneur, sur cette
plateforme.
Parce que la, je desespere ...

PS : quitte a utiliser des indices, autant changer les valarrays en vector.
Et la
je tombe sur un article recommandant d utiliser des iterateurs en lieu et
place
des indices "entiers" ... pour raisons d efficacite (je pense a une bete
boucle).
Info ou intox ?

Merci.

Avatar
Philippe Guglielmetti
"delta" a écrit dans le message de
news:
PS : quitte a utiliser des indices, autant changer les valarrays en
vector.


les valarrays sont implémentés de façon très similaire aux vector. La doc
dit:
The sequence is stored as an array of T.

Et la je tombe sur un article recommandant d utiliser des iterateurs en
lieu et

place des indices "entiers" ... pour raisons d efficacite (je pense a une
bete

boucle).
Info ou intox ?


l'indiçage avec des entiers requiert une multiplication par la taille d'un
élément (comme pour un bête tableau C) alors que les itérateurs (implémentés
comme des pointeurs) peuvent être incrémentés/décrémentés par
addition/soustraction. Ca devrait permettre de grapiller des microsecondes,
et c'est en principe ce que devraient faire les fameux opérateurs inclus
dans valarray...
A mon avis ton problème est ailleurs. J'utilise les valarray en VC6, mais
pas trop intensivement donc je n'ai pas vraiment fait attention à la
performance.

En cherchant, j'ai trouvé un (vieil) article un peu inquiétant :
http://osl.iu.edu/~tveldhui/papers/DrDobbs2/drdobbs2.html
et des avis intéressants sur
http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_20703035.html
Apparemment http://www.oonumerics.org/blitz/ offre de meilleures
performances que valarray.
--
Philippe Guglielmetti - www.dynabits.com

Avatar
Laurent Deniau
Luc Hermitte wrote:
Laurent Deniau wrote in
news::


Ca peut etre plus rapide mais pas de beaucoup (max 5-10%) ce que je
considere comme negligeable. Ca peut aussi etre plus lent du meme
ordre de grandeur. Pour les valarray de GCC 3.0+, Gaby te donnera
surement plus d'info, c'est lui qui les a ecrit et si je me souviens
bien il s'est bien casse la tete sur les benchs pour que soit au moins
aussi rapide :-)



J'en déduis que les benchs des valarrays que l'on voit sur le site de Blitz
++ ne concerne pas les derniers valarray...


Je pense. Car il n'y a aucune raison pour que les valarray soient plus lent que
Blitz++. Le papier cite date de 1997 alors que les techniques utilisees par
Blitz++ se sont repandues la meme annee (96-97). Il y a de forte chance que les
valarray utilises dans le bench aient ete implementes de facon naive.

a+, ld.

--
[ Laurent Deniau -- Scientific Computing & Data Analysis ]
[ CERN -- European Center for Nuclear Research ]
[ - http://cern.ch/Laurent.Deniau ]
[ -- One becomes old when dreams become regrets -- ]


Avatar
delta
"Philippe Guglielmetti" a écrit dans le message de
news:3fa8c134$0$3675$
les valarrays sont implémentés de façon très similaire aux vector. La doc
dit:
The sequence is stored as an array of T.


Bien, je vais peut-etre m en tenir aux vectors en definitive.


l'indiçage avec des entiers requiert une multiplication par la taille d'un
élément (comme pour un bête tableau C) alors que les itérateurs
(implémentés

comme des pointeurs) peuvent être incrémentés/décrémentés par
addition/soustraction. Ca devrait permettre de grapiller des
microsecondes,

et c'est en principe ce que devraient faire les fameux opérateurs inclus
dans valarray...


ok, merci :)


A mon avis ton problème est ailleurs.


Oui mais ou ? je confirme que lorsque je remplace par une boucle
... je gagne un facteur 10 :-(


J'utilise les valarray en VC6, mais
pas trop intensivement donc je n'ai pas vraiment fait attention à la
performance.


A vrai dire, je ne l aurais peut-etre pas remarque non plus,
de suite au moins. Mais, j ai voulu comparer avec une ancienne
methode un peu moins robuste et donc potentiellement plus
rapide, implementee a l aide de vectors (j ai mm imagine que
les valrrays pourraient compenser le cout d une robustesse
accrue ; sur le long terme, en presque raide, ca pouvait etre
tres interessant). Des lors, le test ne fait que ca, calculer une
solution d edo, et je n ai vraiment pas presume que le type
de base en etait l origine. Une fois que j avais epuise le cout
(du nombre d appels) des evaluations du champ, cout de
l integration et cout du controle ... il ne restait plus que la
structure de donnees, elle mm. Bref :-(


En cherchant, j'ai trouvé un (vieil) article un peu inquiétant :
http://osl.iu.edu/~tveldhui/papers/DrDobbs2/drdobbs2.html
et des avis intéressants sur

http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_20703035.html

Apparemment http://www.oonumerics.org/blitz/ offre de meilleures
performances que valarray.


Merci, merci et merci :-)

Avatar
Gabriel Dos Reis
"delta" writes:

| Oui j aimerais bien que Gaby nous donne son point de vue :-) Par ailleurs,

il le fera bientôt.

[c'est fou ce que ce groupe peut produire en moins de deux semaines :-)]

-- Gaby
Avatar
Gabriel Dos Reis
Luc Hermitte writes:

| Laurent Deniau wrote in
| news::
|
| > Ca peut etre plus rapide mais pas de beaucoup (max 5-10%) ce que je
| > considere comme negligeable. Ca peut aussi etre plus lent du meme
| > ordre de grandeur. Pour les valarray de GCC 3.0+, Gaby te donnera
| > surement plus d'info, c'est lui qui les a ecrit et si je me souviens
| > bien il s'est bien casse la tete sur les benchs pour que soit au moins
| > aussi rapide :-)
|
| J'en déduis que les benchs des valarrays que l'on voit sur le site de Blitz
| ++ ne concerne pas les derniers valarray...

Ces benchs sont d'un temps très ancien et ne concernent pas
forcément les produits appropriés.
Par exemple, je crois que la bibliothèque de VC n'utilisent pas les
expressions templates ; certaines implémentations se contentent juste
d'implémenter valarray comme un autre moyen d'écrire vector.
Ces implémentations sont conformes mais peu utiles.

-- Gaby
Avatar
Gabriel Dos Reis
Laurent Deniau writes:

| Luc Hermitte wrote:
| > Laurent Deniau wrote in
| > news::
| >
| >
| >>Ca peut etre plus rapide mais pas de beaucoup (max 5-10%) ce que je
| >>considere comme negligeable. Ca peut aussi etre plus lent du meme
| >>ordre de grandeur. Pour les valarray de GCC 3.0+, Gaby te donnera
| >>surement plus d'info, c'est lui qui les a ecrit et si je me souviens
| >>bien il s'est bien casse la tete sur les benchs pour que soit au moins
| >>aussi rapide :-)
| >
| >
| > J'en déduis que les benchs des valarrays que l'on voit sur le site de Blitz
| > ++ ne concerne pas les derniers valarray...
|
| Je pense. Car il n'y a aucune raison pour que les valarray soient plus lent que
| Blitz++. Le papier cite date de 1997 alors que les techniques utilisees par
| Blitz++ se sont repandues la meme annee (96-97). Il y a de forte chance que les
| valarray utilises dans le bench aient ete implementes de facon naive.

en réalité, GCC par exemple ne contenait pas de valarray quand ce
papier a été écrit. J'ai écrit valarray trois fois. La première
mouture était finie en Sept 1997 et n'a été officiellement dans EGCS
que vers fin Dec 1997. La seconde fois, c'était vers la fin 1998. La
troisième fois deviat être vers fin 1999 (je n'ai plus la date exacte
en tête).

Les implémentations de 1997 étaient « naives » et n'utilisaient pas la
technique décrite dans le papier de Todd -- même si David Vandevoorde
s'était battu pour que cette technique soit autorisée. Alors la
comparaison est facile :-)

-- Gaby
Avatar
delta
"Benoit Rousseau" a écrit dans le message de
news:3fa7f0bb$0$29045$
En parlant de réels, est ce que f/2.0 est aussi efficace que f*0.5 ?
Ou vaut t il mieux utiliser la multiplication ?


J ai ca si ca t interesse, mm si cette page date un peu :

http://www.tantalon.com/pete/cppopt/appendix.htm#AppendixB_RelativeCosts

Cependant, ds ce cas particulier, certaines implementations ont peut-etre
une
preference.

1 2