30

./28 : oui oui, mais je ne parlais pas nécessairement de différence de niveaux de complexité (c'est effectivement pas ce qu'il y a de plus pertinent ici), à complexité "mathématique" égales il y a souvent une grosse marge à travailler avant que s'intéresser au cycles ne commence à être la meilleure solution.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

31

iwannabeamaki (./25) :
./23 : justement, sur Ti il y a eu des fanatiques de l' "optimisation" à grand coups de remplacements d'instruction pour gagner 2 cycles, voire déroulage de boucle, et finalement ça n'a souvent pas le même ordre de grandeur d'efficacité que de repenser le problème autrement

iwannabeamaki (./25) :
./28 : oui oui, mais je ne parlais pas nécessairement de différence de niveaux de complexité (c'est effectivement pas ce qu'il y a de plus pertinent ici), à complexité "mathématique" égales il y a souvent une grosse marge à travailler avant que s'intéresser au cycles ne commence à être la meilleure solution.


.. et une bonne connaissance de l'architecture cible peut etre primordial pour le design d'un algo haut niveau... certains "details" extremement bas niveau peuvent faire choisir des algos haut niveau radicalement differents.
optimisations bas niveau != comptage de cycles.

et j'irais meme jusqu'a dire que dans pas mal de cas, c'est quelquechose qui est trop souvent ignore. justement parcequ'on rabat les oreilles de tout le monde avec "optimize algorithms before code", et que ca se fait traduire par "you don't need to care about architecture details during early algorithm-design".

rien qu'avant-hier j'ai encore eu un exemple d'une amelioration x60 en perfs, juste en prenant en compte les details de l'archi, et en produisant un algo qui, sur le papier, est sous-optimal au possible, compare a celui qui etait utilise avant...
avatar
HURRRR !

32

Oui mais dans quel contexte ? Si les traitements que tu fais sont eux-même bas niveau, forcément qu'une optimisation bas niveau aura pas mal d'impact. Dans le cadre d'un "traitement de données massif" comme ce qu'évoquait 0² au début de la discussion, on s'en fout pas mal de savoir quelle instruction ou même quel langage est utilisé, tant que l'algo ne limite pas au maximum la complexité.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

33

en l'occurence, c'est un "traitement de donnees massif". et le probleme en lui meme n'est pas particulierement bas-niveau, non...

pour un grand nombre 'n' d'elements, on doit sampler une spline qui comporte 'k' control-points.
n est entre le millier et la centaine de millier, mais pourrait etre plus grand.
k est >= 2, la plupart du temps, tourne autour de 3 ou 4, mais peut monter dans quelques rares cas a 10, 20, etc..

pour sampler cette spline, chaque element a un parametre 't' compris dans l'intervalle de temps des control-points de la spline.
en gros, pour chaque element, on doit trouver les deux control-points consecutifs de la spline dont l'intervalle contient 't'

chaque control-point a un parametre de temps 't' propre, une valeur associee, (et deux tangentes, mais c'est un detail).

en gros, on peut decomposer le probleme en deux parties, pour chaque element:

1- trouver les deux control-points
2- interpoler la spline entre ces deux control-points au niveau du parametre 't' de l'element, pour recuperer la bonne valeur.

sachant que les control-points de la spline ne sont pas espaces regulierement (leurs 't' consecutifs sont strictement croissants, mais d'intervalles differents.. genre { 0.0, 0.1, 0.8, 1.5, 1.51, 2.0 }
la solution algorithmiquement seduisante serait de faire un lower_bound sur le tableau de 't' des control-points (bon une recherche dichotomique quoi), qui donne O(log2(n)) en complexite.

tiens d'ailleurs, parenthese: pour les notations O(), on ignore les constantes, ok. est-ce que pour les log on ignore aussi la base? genre O(log2(n)) == O(log(n)) ?

bref or donc..

1- recherche rapide dans le tableau de 't' qui est trie, via un lower_bound -> recuperation des deux control-points, 'cp0' et 'cp1'
2- element.value = interpolate(cp0, cp1, (element.t - cp0.t) / (cp1.t - cp0.t));

ok. en connaissant mieux les donnees du probleme (notamment la distribution de 'k', le nombre de control-points), on peut supposer que pour de faibles valeurs (3 ou 4), ca sera plus performant d'utiliser une recherche lineaire simple. mais bon, c'est flou. et si on implemente a la main le lower_bound pour ce cas specifique, directement dans la boucle principale de traitement, on peut arriver a de meilleures perfs que la recherche lineaire a partir de k=4.. bref

sur x86, c'etait deja pas mal rapide. passage a une optim "bas niveau" sans changer d'algo: utiliser les intrinsics SSE pour faire un lower_bound qui cherche 4 elements a la fois -> de memoire (c'est ptet pas exactement ca, ca date d'il y a genre un an quand meme...) x3 en perfs pour la recherche seule (noye dans l'algo global, ca devait faire un poil moins de x2, genre x1.8, qqch comme ca.
bref. c'etait cool.

sauf que.. recemment, portage sur cell (PS3 / archi PPC) de la dite chose. architecture radicalement differente. tres mauvaise prediction de branchement. trash dramatique du pipeline fp et int, branches tres couteuses comparees a x86, dependances d'instructions a la pelle du au faible nombre de pipelines compare aux core2 et autres archis plus recentes.

la recherche des deux control-points seule prend PLUS DE 90% du temps, alors que sur x86 c'est l'inverse.
repasser a une recherche lineaire ameliore deja pas mal les perfs. mais c'est toujours assez lamentable.

	u32	id = k - 2;
	for (u32 i = 0; i < k - 1; i++)
	{
		if (cptimes[i + 1] > t)
			break;
	}

(bon le for d'au dessus, aussi anodin soit-il est a peu pres 2 fois plus lent sur l'archi cible qu'un autre for fait differemment avec un goto et sans l'init de 'id', mais, on va oublier ca, c'est du detail)

tu sais ce qui a bien fonctionne?
en epargnant les details et cas particuliers bas niveau, les PPC ont notamment une instruction fsel, qui fonctionne comme ca:

fsel(float x, float a, float b)
{
	return (x >= 0) ? a : b;
}


et qui fait que ce genre d'expressions:

float y = (x >= 0) ? a : b;

se fait compiler (sous GCC en tout cas), en une seule instruction fsel.
si jamais a et b sont des int, ca casse tout, vu que ca genere des branches.

comment avoir un x60 sur les perfs de l'algo au dessus dans les cas les plus utilises ?
reponse:

4 versions du code, qui specialise 2, 3, 4, et n control-points. (rien n'empeche de specialiser pour 5 ou 6, evidemment, a part que dans ce cas precis, c'est des valeurs de 'k' assez rares, et la plateforme cible a pas non plus trop de memoire a perdre).
et ne pas faire de recherche, mais tester absolument _tous_ les control-points. meme ceux qui sont superieurs a t. pas d'early-out, rien:

exemple de ce que donnerait une version a 5 control points de l'algo:

	float k0 = (t - cptimes[1]) >= 0 ? 1.0f : 0.0f;
	float k1 = (t - cptimes[2]) >= 0 ? 1.0f : 0.0f;
	float k2 = (t - cptimes[3]) >= 0 ? 1.0f : 0.0f;
	u32 id = u32(k0 + k1 + k2);

	const ControlPoint &cp0 = cp[id];
	const ControlPoint &cp1 = cp[id + 1];


(bon en fait j'avoue avoir triche dans les chiffres... cheeky le x60 en perfs, c'est pour la version a 2 control-points, ou il n'y a pas besoin de faire de recherche du tout tongue, le "vrai" gain pour la version a 4 control-points (la plus frequemment rencontree), n'est "que" de x18 smile)
avatar
HURRRR !

34

autre exemple dans un genre un peu different: savoir qu'il existe tout un panel d'instructions madd/nmsub sur ton archi cible, qui ont une latence equivalente aux multiplications simples (madd(a, b, c) { return a * b + c; } et nmsub(a, b, c) { return c - a * b; }) va peut-etre aussi changer radicalement la facon dont tu vas factoriser certaines formules que tu dois calculer. et ca pourra donner des resultats tres differents en terme de code. mais ok, cet exemple la est deja plus "bas-niveau" que l'autre.

exemple debile: si jamais t'as une instruction hardware sur ton archi cible qui peut comparer des strings de 16 octets max en 4 cycles, et que t'as un dictionnaire de mots qui ne peuvent pas etre plus grands que, genre 12 caracteres, et que t'as pas plus de, par exemple, 10000 mots, est-ce qu'une hashmap est forcement le meilleur choix algorithmique ?
avatar
HURRRR !

35

iwannabear (./33) :
est-ce que pour les log on ignore aussi la base? genre O(log2(n)) == O(log(n)) ?
Ça me semblerait logique, vu que log2(n) c'est (1 / log(2)) * log(n) , et qu'on ne tient pas compte des constantes multiplicatives.

Et sinon je crayonne iwannaours, le traitement de données massif pour moi c'est des trucs comme ceux cités au-dessus, pas gérer du XML par exemple. Je crois que tu es trop influencé par le PHP & co. hehe
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

36

ok, c'est bien ce que je me disais grin les courbes de log evoluent pareil de toutes facons
avatar
HURRRR !

37

Ah oui quand je dis traitement de données massif, déjà c'est pas 1000 ou 10000 éléments mais plutôt quelques millions, avec des opérations plus conséquentes que 3 multiplications. C'est peut-être pour ça qu'on se comprend pas, parceque si tu as 10000 entrées et que le traitement à effectuer change du simple au centuple en fonction de critères bas-niveau, le problème n'est plus le même... Mais chez moi c'est pas franchement le cas le plus fréquent, si j'ai pour compter large un facteur 10 en changeant telle ou telle instruction, dès que je vais travailler sur un volume conséquent je m'en tape complètement par rapport à ce que je risque de gagner ou perdre en retravaillant mon algo.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

38

bah, accessoirement, le truc que j'ai decrit au dessus s'execute quelques milliers de fois par seconde, sur potentiellement des 100aines de milliers d'elements donc bon, on doit etre dans les memes ordres de grandeur au final, voire pire smile (meme si la dependance de complexite n'est pas sur ce 'n' la)

ok, apres j'ai jamais dit qu'il fallait pas chercher a ameliorer l'algo en haut niveau hein, juste que si tu ignore totalement les details bas niveau, tu peux avoir de grosses surprises trioui et meme pas te rendre compte que ca pourrait etre largement mieux, juste parceque tu t'arrettes a "je vois pas comment ameliorer cet algo, c'est le mieux que je puisse trouver d'un point de vue haut niveau, sur le papier, il a la meilleure complexite". (le "tu" de la phrase precedente n'est pas a prendre comme "toi, bob", c'est un "tu" general grin)
apres ca change probablement beaucoup suivant le domaine dans lequel tu travailles, c'est sur... en tout cas dans le mien, c'est tres frequent. et bien evidemment ya des familles d'algos qui seront pas du tout affectees par ces considerations la, on est d'accord...

et surtout a propos de ca:
à complexité "mathématique" égales il y a souvent une grosse marge à travailler avant que s'intéresser au cycles ne commence à être la meilleure solution.

c'est pire que ca. si je comprends bien ce que tu veux dire par complexite "mathematique", un algo a complexite mathematique superieure peut etre nettement plus efficace... cf les exemples d'instructions specialisees genre un truc aussi con qu'un madd dispo en hardware.
avatar
HURRRR !

39

D'où le "souvent" : de ma propre expérience (donc bon, ça vaut ce que ça vaut), il est beaucoup plus fréquent de rencontrer des cas où le gain potentiel "bas-niveau" est de l'ordre d'un facteur 10 au mieux, et où donc baisser d'un ordre de complexité représente une optimisation bien plus intéressante.

Après, ça reste un "souvent", et oui bien sûr on peut trouver des cas où c'est faux... mais bon c'est pas compliqué de s'en rendre compte à la main, sur une collection de seulement 10000 éléments, pour gagner autant qu'en passant d'un O(n) à O(log(n)) faudrait quand même diminuer le temps d'exécution d'une itération par 752... il doit pas y avoir beaucoup de cas où ce soit réalisable (même si, je sais, il y a un overhead à cause du changement même de l'algo)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

40

Vous vous battez pour rien embarrassed
Faut optimiser sur les deux tableaux s'il y a besoin d'optimisation, sinon, on s'en fiche tongue
Et surtout, il y a d'autres points importants à prendre en compte, comme la mémoire... Tu peux faire ta super optimisation qui fait tout en 3 cycles, mais si ça ne rentre pas dans la mémoire, c'est ballot grin

Il y a des fois, il faut se battre sur tous les fronts. Par exemple, en ce moment je travaille sur un algorithme de Viterbi un peu spécial qui utilise un treillis avec environ 8 millions d'états et 75 millions de transitions. Il faut tout explorer pour chaque bit reçu, et il y en a beaucoup par seconde sad
Je n'arriverai jamais au temps réel, heureusement que c'est juste pour une simulation grin
avatar

41

On peut savoir ce qui nécessite de faire du Viterbi de manière aussi brutale ? tongue
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

42

http://fr.wikipedia.org/wiki/Algorithme_de_Viterbi
C'est 100% fiable pour corriger les erreurs cet algo ?!?

43

Y'a aucun algo qui corrige 100% des erreurs possibles, c'est impossible mathématiquement parlant. Mais l'algo de Viterbi a quand même été une avancée significative dans le domaine des télécoms (le mec qui est à l'origine de ça a créé une des plus grosses boîtes de modems hehe)

EDIT : ah oui, je viens de lire l'article WP, leur exemple est sacrément mal choisi... en pratique ça ne s'utilise pas comme ça.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

44

./41 Bah, ça sert à faire de la correction d'erreur là où rien n'a été prévu pour (bien au contraire).
En fait, c'est une adaptation d'un algorithme beaucoup plus simple (~260 000 états et presque un million de transitions cheeky) pour faire un récepteur non cohérent... En fait, rien que celui de base explose la mémoire si tu ne fais pas attention.

./42 L'algorithme de Viterbi donne le résultat optimal lorsque les données ont été codées en treillis (simple). Il permet d'obtenir les mêmes performances que si tu comparais tous les messages possibles à ce que tu as reçu et que tu gardais le plus proche.
avatar

45

'tin main vous bossez ou pour avoir besoin de faire des taf de ce genre confus
i want too ! plein le cul de faire des sites :'( au moins deux ans que j'ai pas fait de C :/
et la le mec il le pécho par le bras et il lui dit '

46

Ben tu bosses dans les télécoms, le traitement de signal ou l'élec... mais y'a pas que des côtés funs, c'est comme partout.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

47

Et d'autres beaucoup moins fun wink
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

48

./45 J'ai besoin de ce genre de chose pour ma thèse. Et le travail ne se limite pas à implémenter les algorithmes, il faut aussi les concevoir wink

Pour les mauvais côtés, je ne les ai pas encore trouvés embarrassed Je voudrais que la thèse dure toute la vie grin
Peut-être que ça viendra au moment de la rédaction du mémoire, on verra...
avatar

49

Certains te diraient de lire PHD comics pour voir les mauvais côtés de la thèse tongue
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

50

Mouais, ça dépend des gens tongue

En fait, j'ai trouvé un point négatif (mais je pourrais l'éliminer si je le voulais vraiment), c'est les cours à 8 heures. C'est difficile des fois sad
avatar

51

(mais si tu n'y vas pas, personne n'est là pour vérifier ni pour se plaindre trilove)

52

Bah si tsss
Les élèves vont se plaindre quand ils auront obtenu des mauvaises notes (même si certains ne seraient pas venus de toute façon)...
Et puis si un prof s'en rendait compte, on ne me demanderait plus jamais d'en faire... Alors que j'aime bien (sauf à 8 heures).
avatar

53

(Je plaisantais, hein tongue (et je compatis pour l'horaire))

54

RHJPP (./52) :
Les élèves vont se plaindre quand ils auront obtenu des mauvaises notes (même si certains ne seraient pas venus de toute façon)...
L'astuce, c'est d'acheter leur silence en leur mettant des bonnes notes oui
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

55

Je ne sais pas où vous avez donné des cours, mais là où je suis on ne peut pas faire ça grin
C'est le professeur (celui avec le vrai titre) qui fait le programme et aussi les examens, donc on ne peut pas faire ce qu'on veut. On pourrait donner des réponses pendant les contrôles, mais ce ne serait pas vraiment sérieux...
Je fais des vacations dans une école d'ingénieur, donc c'est peut-être différent des facs et autres.
avatar

56

Pen^2 (./53) :
(Je plaisantais, hein tongue (et je compatis pour l'horaire))

57

(pencil hehe)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

58

C'est bon, j'avais compris wink
Mais je préfère rappeler que ce n'est pas possible (certains ont essayé cheeky)
Ha sinon, ce que je fais pour éviter d'en avoir à 8 heures, c'est d'échanger les groupes avec d'autres smile Mais peu sont ceux qui acceptent sad
avatar

59

(ce qui est malheureusement possible, au moins dans certaines écoles, c'est d'être prof alors qu'on a un niveau plus que douteux dans la discipline qu'on est censé enseigner... voire pire, être dans ce cas alors qu'on a un doctorat dans la discipline en question... tsss)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

60

(Ha mais ça...
Tout le monde fini bien par l'avoir sa thèse, faut juste tenir le temps... Si t'es trop nul pour te faire publier, bah soit un de tes encadrants va te proposer (par charité) de te mettre en premier auteur sur un de ses articles, soit tu te trouves une conférence qui ne vaut rien et qui voudra bien de toi...
On trouve de ces trucs dans des articles publiés des fois, ça fait très peur sick
Enfin, ça doit dépendre des écoles et du nombre de candidats par sujet.)
avatar