un proc rescent peut faire 5 instructions en parralèle le tout sur un long pipeline. Tu as typiquement 2 additionneur et 1 multiplieur. Ta version implique beaucoup de variables temporaires qui sont réutilisés, le calcul ne peut pas se faire en parrallèle.
En fait, je veux tester un layout particulier tirant parti des lignes de caches.
En gros, une ligne de cache fait 32 ou 64 octets selon le modèle de processeur. Donc, je pense que cela serait super interrescant d'avoir les voisins dans cette ligne de cache. Par exemple, si tu découpes ton images en cube de 4*4*4, tu as tous les voisins 4*4 dans la même ligne de cache ou presque. C'est du tailing, cela permet d'augmenter la localité d'acces aux donnés.
Je cherche pas à faire des animations mais du traitement temps réel :)
C'est pour ça que je parlais de gain théorique. Je ne crois pas qu'il existe des astuces en c++ qui permète d'induire un choix de layout mémoire selon l'utilisation qu'il en est fait. Si cela existait l'utilisateur n'aurait pas à s'en soucier.
J'ai continué à torturer la bète. J'ai utiliser ./nlmeans pour bencher rapidement la chose.
La fonction offset() est très utilisé forcément. En la modifiant par :
Le but est de réduire le nombre de dépendance read-after-write qui tue le parralèlisme.
J'obtient 10% de perf en plus sur le test sur processeur athlon. Par contre, cela ne change rien sur une machine pentium.
Les 3 tests qui sont dans CImg_demo qui rendent des fps sont en fait très dépendant de la vitesse d'affichage donc non représentatif pour les calculs.
J'ai essayé de modifier offset() pour que v sois la 1er dimension et non la dernière. Telle que c'est codé ici, on a 3 plans de couleur, un vert, un rouge, un bleu. Avec v en première dimension, on a R,V,B,R,V,B,R,V,B,... Cela dépend beaucoup des calculs mais je pense qu'en général, quand on utilise une couleur d'un pixel on a beaucoup de chance d'immédiatement utiliser les autres couleurs. Dans le "rangement" RVB, les 3 couleurs sont dans la même ligne de cache, donc en théorie, les acces devrait être plus rapide.
A prioris d'autre macro utilise le layout mémoire sous -entendu donc il faudrait modifier plus de chose que offset() pour faire le test.
Les standards de programmation s'apprennent rarement à l'école. Mais se trouve dans plein de papiers.
Il faut savoir sortir des sentiers battus de temps en temps, sinon on coderait encore tout en basic.
Cela n'a pas de rapport en l'occurence... Je ne considère pas le fait de tout mettre dans un seul fichier comme ayant un seul avantage sur celui d'avoir quelques fichiers. L'utilisation d'opérateur ternaire est une vrai avancé.
Avec un IDE qui retrouve les tags, cela peut se faire mais bon...
Sinon avec des header précompilé, je gagne plus de 60% du temps de compilation cela devient accèptable.
J'ai essayé l'option de compilation -ftree-vectorize, cela change très peu les temps d'execution, je suis un peu déçu.
C'est quand même plus simple et moins lourd d'avoir plusieurs fichiers. Regardes boost ou autre.
J'ai bricolé avec hier soir. Le plus chiant c'est vraiment les temps de compilations. Plusieurs minutes sur un pc pas trop vieux pour un seul fichier ! (gcc 4.0.1) C'est d'autant plus énervant sur un bi-cpu avec le 2ième cpu idle (car il n'y a qu'un fichier à compiler).
je séparerais aussi le code de traitement d'image proprement dit du code d'affichage. C'est plus propre si la lib est utilisé avec kde ou wxwidget par exemple.
La structuration classique est au minimum de séparer ce qui est portable de ce qui ne l'est pas. Donc, cela ferait un cimg.h et des unix.h et windows.h, l'interet de facilité la vie d'un mec qui ferais le portage pour une autre archi. Idem pour les fonctions bas niveau qui sont ressponsable des performances. Il peut y avoir 50 versions (en C++, en mmx, sse, sse2, sse3, avec de la génération de code en ligne, en utilisant les shaders d'une carte graphique, etc...). Typiquement aussi, c'est un objet par fichier, le fichier ayant le même nom que l'objet.
Pour la vitesse de compilation, si ton code est découpé, sous unix, le include <cimg_windows.h> ne sera pas executé, et les lignes correspondante non parsé, c'est peut-être negligable, j'en sais trop rien. Mais je trouve que le temps de compile des exemples est long.
Pour le nouveau entrant qui s'interesserait à la bibliothèque en elle-même, je pense même que c'est plus facile de faire un 'Search' du nom de la fonction dans un seul fichier plutot qu'un grep pour savoir deja dans quel fichier se trouve la fonction, puis un search.
Si ton code est correctement structuré, tu sais tout de suite quel fichier ouvrir pas besoin de grep.
Eviter l'effet masse, c'est aussi un moyen d'avoir plus de codeurs.
Découpé le code en différent .h permet de mieux séparer physiquement le code en module et permet de rentrer plus facilement dedans. Cela peut aussi permètre de gagner en temps de compilation en allegeant le preprocesseurs.
Cela permet au nouveau entrant de savoir tout de suite ou aller chercher les fonctions à modifier. Cela évite de connaitre tout le code avant de commencer une modif.
J'imagine que bouger un .h est plus simple qu'une arboressence, mais cela revient en fait au même.
J'ai franchement du mal à lire. Moi qui croyait que les templates évitaient d'utiliser les macro...
// Create two display window, one for the image, the other for the color profile.
CImgDisplay
main_disp(image,"Color image (Try to move mouse pointer over)",0),
draw_disp(500,400,"Color profile of the X-axis",0);
cimg_mapXYZV(dest,x,y,z,k) {
const double X = ((double)x/img1.dimx()-0.5)*ca + ((double)y/img1.dimy()-0.5)*sa;
if (X+0.5<pmin) alpha=0; else {
if (X+0.5>pmax) alpha=1; else alpha=(X+0.5-pmin)/(pmax-pmin);
}
dest(x,y,z,k) = (unsigned char)((1-alpha)*img1(x,y,z,k) + alpha*img2(x,y,z,k));
}
Le code précédent qui ressemble à une fonction est en fait dans le corps de main. Certe il y a peu de ligne de code, mais j'avoue avoir du mal à le comprendre ce code. A quoi sert de faire du c++, si c'est aussi facile à lire que du perl.
Violant. Surtout avec une rédéfinition de pi au milieu. math.h ne suffit pas ?
Sinon qu'en est-il des performances ? Si je recodes moi-mêmes, j'aurais 10x plus de perf ou bien le code utilise les astuces du genre de celle de blas ? (pour faire des traitements léger mais temps réel)
Un type avait offert 50k$ pour une version BSD de linux. Cela avait fait un flameware sur la LKML.
En utilisant la méthode COCOMO, l'évalution "basique" donnait plus de 100 millions, une évaluation plus poussé (parrallèlisme, gestion hardware, etc...) donnait plus de 500 millions (600 ?). Donc, le prix donné ici me parait bien bas...
"Le principal risque, c'est la perte de donnée plus que la modification silencieuse."
Cela revient au même non ?
J'ai déjà fait l'exercice d'une copie complète de CD/DVD en regardant le /var/log/messages et les erreurs CD. Et bien, tout mes DVD présentant qq erreurs irrécupérables mais cela ne se voyait pas à première vue (c'était des photos perso).
Bref, un support sans vérification périodique, je ne vois pas trop l'interet.
"- Qu'est-ce que cela peut apporter à la boite dans laquelle je travaille ?"
des testeurs, du debugages, de la notoriété, etc...
"- Quelle type de licence dois-je mettre ? GPL ? LGPL ? autre ?"
GPL si vous gardez le controle complet des droits d'auteurs (comme pour Trolltech et MySQL Labs, tout auteur de patch doit vous céder vo droits) sinon la GPL pourra s'éteindre à tous les softs de la boite.
LGPL est une bonne solution si vous ne voulez pas maintenir "correctement" le machin.
"- En quel nom doit-on mettre pour l'auteur la librairie, le nom du du développeur ? Le nom de ma société doit apparaître ou pas ?"
Le copyirght est celui de la boite, rajouter le nom des auteurs, c'est sympa pour eux...
"- Ou dois-je la mettre ? freshmeat ? sourceforge ?"
oui, c'est les 2 les plus courant.
"- La librairie est en C++ et compilé uniquement sur windows (VS6)"
Bah déjà, pour des raisons de cout, les puces de sécurité ne sont pas tamper résistant. Donc, des attaques hardwares "de base" pourraient extraire les jolies clefs.
Ta "liste maudite", c'est exactement ce qu'il font. Un appareil qui se compromet n'a pas forcément besoin d'une mise à jour (qui est d'ailleurs une potentiel faille de sécurité) software mais hardware.
Ensuite, un appareil grand publique est vendu en millions d'exemplaires. Donc, pour quelques dizaines milliers d'ado qui utilisent le device pour pirater, ils désactivent des millions de télé.
[^] # Re: un de ces quatre
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Ah ! Les femmes .... Évalué à 1.
A part perdre de l'eau, je ne voix pas bien l'interet de se désabillé quand il fait chaud... (à par pour les filles quand on est un mec)
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
En gros, une ligne de cache fait 32 ou 64 octets selon le modèle de processeur. Donc, je pense que cela serait super interrescant d'avoir les voisins dans cette ligne de cache. Par exemple, si tu découpes ton images en cube de 4*4*4, tu as tous les voisins 4*4 dans la même ligne de cache ou presque. C'est du tailing, cela permet d'augmenter la localité d'acces aux donnés.
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
Tu as pu vérifier l'augmentation de performance avec la modification de offset () ?
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
C'est pour ça que je parlais de gain théorique. Je ne crois pas qu'il existe des astuces en c++ qui permète d'induire un choix de layout mémoire selon l'utilisation qu'il en est fait. Si cela existait l'utilisateur n'aurait pas à s'en soucier.
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 4.
La fonction offset() est très utilisé forcément. En la modifiant par :
return (x+width*y)+(width*height*z+width*height*depth*v);
Le but est de réduire le nombre de dépendance read-after-write qui tue le parralèlisme.
J'obtient 10% de perf en plus sur le test sur processeur athlon. Par contre, cela ne change rien sur une machine pentium.
Les 3 tests qui sont dans CImg_demo qui rendent des fps sont en fait très dépendant de la vitesse d'affichage donc non représentatif pour les calculs.
J'ai essayé de modifier offset() pour que v sois la 1er dimension et non la dernière. Telle que c'est codé ici, on a 3 plans de couleur, un vert, un rouge, un bleu. Avec v en première dimension, on a R,V,B,R,V,B,R,V,B,... Cela dépend beaucoup des calculs mais je pense qu'en général, quand on utilise une couleur d'un pixel on a beaucoup de chance d'immédiatement utiliser les autres couleurs. Dans le "rangement" RVB, les 3 couleurs sont dans la même ligne de cache, donc en théorie, les acces devrait être plus rapide.
A prioris d'autre macro utilise le layout mémoire sous -entendu donc il faudrait modifier plus de chose que offset() pour faire le test.
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 1.
Il faut savoir sortir des sentiers battus de temps en temps, sinon on coderait encore tout en basic.
Cela n'a pas de rapport en l'occurence... Je ne considère pas le fait de tout mettre dans un seul fichier comme ayant un seul avantage sur celui d'avoir quelques fichiers. L'utilisation d'opérateur ternaire est une vrai avancé.
Avec un IDE qui retrouve les tags, cela peut se faire mais bon...
Sinon avec des header précompilé, je gagne plus de 60% du temps de compilation cela devient accèptable.
J'ai essayé l'option de compilation -ftree-vectorize, cela change très peu les temps d'execution, je suis un peu déçu.
"La première sécurité est la liberté"
[^] # Re: il faut ensuite replacer firefox comme User Agent
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Indignation : Ebay et Linux. Évalué à 9.
ok je ->[]
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
J'ai bricolé avec hier soir. Le plus chiant c'est vraiment les temps de compilations. Plusieurs minutes sur un pc pas trop vieux pour un seul fichier ! (gcc 4.0.1) C'est d'autant plus énervant sur un bi-cpu avec le 2ième cpu idle (car il n'y a qu'un fichier à compiler).
Sinon, cela a l'air simple d'emplois.
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 4.
Pour la vitesse de compilation, si ton code est découpé, sous unix, le include <cimg_windows.h> ne sera pas executé, et les lignes correspondante non parsé, c'est peut-être negligable, j'en sais trop rien. Mais je trouve que le temps de compile des exemples est long.
Pour le nouveau entrant qui s'interesserait à la bibliothèque en elle-même, je pense même que c'est plus facile de faire un 'Search' du nom de la fonction dans un seul fichier plutot qu'un grep pour savoir deja dans quel fichier se trouve la fonction, puis un search.
Si ton code est correctement structuré, tu sais tout de suite quel fichier ouvrir pas besoin de grep.
Eviter l'effet masse, c'est aussi un moyen d'avoir plus de codeurs.
"La première sécurité est la liberté"
[^] # Re: Apu updates ?
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 1.
Cela permet au nouveau entrant de savoir tout de suite ou aller chercher les fonctions à modifier. Cela évite de connaitre tout le code avant de commencer une modif.
J'imagine que bouger un .h est plus simple qu'une arboressence, mais cela revient en fait au même.
"La première sécurité est la liberté"
[^] # Re: oups un seul fichier...
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
"La première sécurité est la liberté"
[^] # du c++ ?!
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 2.
// Create two display window, one for the image, the other for the color profile.
CImgDisplay
main_disp(image,"Color image (Try to move mouse pointer over)",0),
draw_disp(500,400,"Color profile of the X-axis",0);
cimg_mapXYZV(dest,x,y,z,k) {
const double X = ((double)x/img1.dimx()-0.5)*ca + ((double)y/img1.dimy()-0.5)*sa;
if (X+0.5<pmin) alpha=0; else {
if (X+0.5>pmax) alpha=1; else alpha=(X+0.5-pmin)/(pmax-pmin);
}
dest(x,y,z,k) = (unsigned char)((1-alpha)*img1(x,y,z,k) + alpha*img2(x,y,z,k));
}
Le code précédent qui ressemble à une fonction est en fait dans le corps de main. Certe il y a peu de ligne de code, mais j'avoue avoir du mal à le comprendre ce code. A quoi sert de faire du c++, si c'est aussi facile à lire que du perl.
"La première sécurité est la liberté"
# oups un seul fichier...
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Sortie de CImg 1.1.5. Évalué à 3.
Sinon qu'en est-il des performances ? Si je recodes moi-mêmes, j'aurais 10x plus de perf ou bien le code utilise les astuces du genre de celle de blas ? (pour faire des traitements léger mais temps réel)
"La première sécurité est la liberté"
# évaluation de linux...
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Ohloh, un nouvel annuaire de projet Open Source. Évalué à 4.
En utilisant la méthode COCOMO, l'évalution "basique" donnait plus de 100 millions, une évaluation plus poussé (parrallèlisme, gestion hardware, etc...) donnait plus de 500 millions (600 ?). Donc, le prix donné ici me parait bien bas...
"La première sécurité est la liberté"
[^] # Re: tiens cela me rappelle
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Il n'y a pas écrit La Poste... et heureusement. Évalué à 3.
"La première sécurité est la liberté"
# euh...
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Coup de gueule pour une chanson.... Évalué à 8.
Je ne sais pas mais cela me parait délirant...
Cela me rappelle une histoire similaire au états unis ou des scouts devait payer un droit pour chanter leur chanson autour d'un feu de camp.
"La première sécurité est la liberté"
[^] # Re: Archivage
Posté par Nicolas Boulay (site web personnel) . En réponse au journal création d'un "coffre-fort virtuel". Évalué à 2.
Cela revient au même non ?
J'ai déjà fait l'exercice d'une copie complète de CD/DVD en regardant le /var/log/messages et les erreurs CD. Et bien, tout mes DVD présentant qq erreurs irrécupérables mais cela ne se voyait pas à première vue (c'était des photos perso).
Bref, un support sans vérification périodique, je ne vois pas trop l'interet.
"La première sécurité est la liberté"
[^] # Re: Archivage
Posté par Nicolas Boulay (site web personnel) . En réponse au journal création d'un "coffre-fort virtuel". Évalué à 3.
Ensuite, pour le média, c'est gérer par l'état donc à eux de garantir de le renouvellement et la gestion de stoquage.
"La première sécurité est la liberté"
# en rapide :
Posté par Nicolas Boulay (site web personnel) . En réponse au message Open source et boite privée. Évalué à 4.
des testeurs, du debugages, de la notoriété, etc...
"- Quelle type de licence dois-je mettre ? GPL ? LGPL ? autre ?"
GPL si vous gardez le controle complet des droits d'auteurs (comme pour Trolltech et MySQL Labs, tout auteur de patch doit vous céder vo droits) sinon la GPL pourra s'éteindre à tous les softs de la boite.
LGPL est une bonne solution si vous ne voulez pas maintenir "correctement" le machin.
"- En quel nom doit-on mettre pour l'auteur la librairie, le nom du du développeur ? Le nom de ma société doit apparaître ou pas ?"
Le copyirght est celui de la boite, rajouter le nom des auteurs, c'est sympa pour eux...
"- Ou dois-je la mettre ? freshmeat ? sourceforge ?"
oui, c'est les 2 les plus courant.
"- La librairie est en C++ et compilé uniquement sur windows (VS6)"
suffit de la préciser dans sourceforge.
"La première sécurité est la liberté"
[^] # Re: mouaip...
Posté par Nicolas Boulay (site web personnel) . En réponse à la dépêche Microsoft se met à l'Open Document. Évalué à 3.
C'est quand même moins vrai pour ODF qui contient des "balises classiques", cela manque juste de sémantique type docbook.
"La première sécurité est la liberté"
[^] # Re: Hum
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Defective by Design. Évalué à 2.
"La première sécurité est la liberté"
[^] # Re: Hum
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Defective by Design. Évalué à 4.
Ensuite, un appareil grand publique est vendu en millions d'exemplaires. Donc, pour quelques dizaines milliers d'ado qui utilisent le device pour pirater, ils désactivent des millions de télé.
Donc, j'imagine bien les scandale associés...
"La première sécurité est la liberté"