DivideConcept.net

le blog de divide.

Mon projet actuel nécessitant du traitement CPU temps réel sur de gros paquets de données, je me suis penché sur les possibilités de parallelisation CPU et le gain réel qu’on pouvait en tirer.
Il existe pour cela 2 techniques cumulables: le SSE et le multicore.



Gains réels de la parallélisation

Le SSE, introduit en 1999 par Intel (puis repris par AMD) et successeur du MMX, et ses dérivés SSE2 (2001) et SSE3 (2004), permet de traiter 4 nombres simple précision (32bit) en parallèle, en utilisant des registres 128 bits (quand au SSE2 il traite 2 nombres double-précision (64bit), et le SSE3 permet de faire des operations au sein des nombres stockés dans une unité 128 bit). On est donc censé avoir un gain théorique de x4. Il s’avère en pratique que ce gain est plus proche de x3, même utilisé à plein rendement.

Les processeurs multi-coeurs devenant un standard depuis quelques années, et avec l’arrivée récente de la nouvelle génération Intel les quad-core devenant de plus en plus répandus, il est logique de prendre en compte cette nouvelle manière de programmer les traitements. D’autant qu’une fois l’architecture multi-thread mise en place, celle-ci ne nécessite pas de reprogrammation pour tenir compte des futurs coeurs supplémentaires.
Ayant récemment acquis un core i5, je m’attendais donc à un gain de x4 en utilisant 4 threads simultanément au lieu d’une seule. Et bien les résultats sont tout autre: non seulement la création d’une thread prend du temps -quelques milliseconds, pas grand chose donc, mais dans un contexte temps réel cela a toute son importance-, mais les gains réels sont bien en deça de x4: avec de 2 threads lancé le gain est de x1.5, et avec 4 thread seulement de x2 ! Les 4 coeurs sont pourtant censé travailler indépendament les uns des autres sans se ralentir mutuellement…

Il y a donc une sacré palier entre les gains théoriques et réels: SSE et quad-core cumulé, le gain aurait du être de 4*4=x16, il n’est que de 3*2=x6. Toujours bon à prendre ceci dit !

Et l’assembleur ?

Tentant de tirer la moindre parcelle de performance du CPU, j’ai également écris quelques routines en assembleur. Pour arriver au constat suivant: ce n’est vraiment plus d’actualité !

 Au dela du fait que l’écriture de routines assembleur est pénible (le langage est simple, mais au bout de quelques lignes l’ensemble devient rapidement très abstrait et le raisonnement dur à reconstruire), à mon grand désarrois j’ai constaté que les routines équivalentes écrites en langage C++ clair étaient quasiment aussi rapides à l’execution ! Et les fonctions pré-écrites tels que memcpy() et memset() sont déjà optimisés pour tirer partie des registres 128bits…
Pire, les compilateurs semblent connaitre certaines subtilités concernant les processeur modernes qui échappent au commun des mortel, rendant même du code assembleur moins rapide que certains code C++… Dans les 2 cas, les différences de performance se jouent à 2% près, et du code C++ pourra indifférement être compilé en 32bit ou 64bit contrairement à de l’assembleur qui necessitera une réécriture.
Bref il est loin le temps ou Carmack utilisait l’assembleur pour coder les routines de rendu de Wolfenstein 3D…



Qt 4.6beta

La beta de l’environnement de développement Qt 4.6 vient d’être publié aujourd’hui: au dela des corrections de bug de la 4.6techpreview1, elle apporte des binaires officiels et un installeur pour Windows/Mac, et surtout Qt Creator 1.3 qui a bien évolué depuis la 1.2.90: encore plus d’inline completion, structures des dossiers, nouvelles possibilités de debuggage.

-Qt 4.6 beta
-Qt Creator 1.3 beta
-mon article précedent sur Qt qui contient quelques astuces/tutoriaux.

Pour installer l’environnement 4.6beta1 sur Windows, voici un step-by-step:

Telecharger qt-win-opensource-4.6.0-beta1-mingw.exe et qt-creator-win-opensource-1.3.0-beta.exe

1. Installer qt-win-opensource-4.6.0-beta1-mingw en cochant la case pour telecharger MingW
2. Installer qt-creator-win-opensource-1.3.0-beta en laissant toutes les options par défaut
3. Lancer Qt Creator, aller dans Tools/Options/Qt4, cliquer sur “+” et rajouter:
Version Name: 4.6beta1
QMake Location: c:\qt\4.6.0-beta1\bin\qmake.exe
MinGw Directory: C:\MinGW
4. Cliquer sur “Rebuild”, et mettre Default Qt Version sur “4.6beta1″
5. Dans Help\Documentation, cliquer sur “Add…”
et sélectionner tous les fichiers dans C:\Qt\4.6.0-beta1\doc\qch, puis cliquer sur apply

Pour mon  nouveau projet, j’ai jeté un coup d’oeil aux différents environnements de dev multiplateforme qui existent actuellement, et après 1 mois d’utilisation, j’ai vraiment été conquis par Qt

Cet environnement réunis vraiment tous les avantage en un seul package:

-Une librairie qui couvre un large champs d’applications possible (interface, reseau, moteur web, opengl, multithreading, son, graphisme 2d, etc etc…)
-Multiplateforme: Windows/Mac/Linux, mais aussi Windows CE, Symbian et Linux embarqué
-Qt Creator, l’environnement de dev multiplateforme qui lui est associé, et qui propose 90% de ce qui rend le codage sous Visual Studio si plaisant (outils de debug, inline completion, designer d’interface, documentation intégré…)
-Licence LPGL (compatible avec une utilisation commerciale et du code propriétaire)

Il propose également un module pour faciliter l’intégration à Visual Studio, mais l’avantage de faire ses projets sous Qt Creator c’est bien évidemment qu’un seul projet peut se compiler indifféremment sur d’autres plateforme sans avoir à reconfigurer quoi que ce soit, et en gardant le même environnement de dev !

La technical preview (alpha) de Qt 4.6 vient d’être publié il y a 2 semaines, et apporte un lot de nouveautés non négligeables:

-Mise à jour du module OpenGL avec support des shaders (GLSL)
-Ajout d’un module audio de bas niveau, entrée et sortie
-Animation d’interfaces simplifiés, moteur graphique optimisé et support pour les interface de Windows 7
-Ajout d’un module pour les calculs 3d (matrices, vecteurs, etc)
-Support du multitouch sur Windows 7
-Qt Creator 1.2.90: selection inline des différentes instances d’une même variable, compilation plus rapide avec MinGw 4.4

Contrairement à la 4.5, il n’existe pas encore d’installeur pour la 4.6 (la version finale doit sortir fin 2009).
Pour installer l’environnement 4.6tp1 sur Windows, voici un step-by-step:

Telecharger qt-4.6.0_tp1-gcc_4.4-x86.7z, qt-4.6_tp1-doc.7z et QtPatcher.7z depuis http://qt.developpez.com/binaires/fr/
et qt-creator-win-opensource-1.2.90-setup.exe depuis le blog Qt

1. Créer le répertoire C:\Qt
2. Décompresser qt-4.6.0_tp1-gcc_4.4-x86.7z dans C:\Qt
3. Décompresser qt-4.6_tp1-doc.7z dans C:\Qt\qt-everywhere-opensource-src-4.6.0-tp1
4. Patcher le repertoire C:\Qt\qt-everywhere-opensource-src-4.6.0-tp1 avec QtPatcher.exe contenu dans QtPatcher.7z
5. Installer qt-creator-win-opensource-1.2.90-setup.exe
6. Lancer Qt Creator, aller dans Tools/Options/Qt4, cliquer sur “+” et rajouter:
Version Name: 4.6tp1
Path: C:\Qt\qt-everywhere-opensource-src-4.6.0-tp1
MinGw Directory: C:\Qt\qtcreator-1.2.90\mingw
7. Cliquer sur “Rebuild”, et mettre Default Qt Version sur “4.6tp1″
8. Dans Help\Documentation, cliquer sur “Add…”
et sélectionner tous les fichiers dans C:\Qt\qt-everywhere-opensource-src-4.6.0-tp1\doc\qch

Pour rajouter une librairie externe non compilée à un projet Qt

1. File/New File or Project…/Projects/Empty Qt4 Project
2. Sélectionner le répertoire contenant le dossier de votre librairie, et donner comme nom de projet le nom du dossier de la librairie, puis terminer la création
3. Clic droit sur le projet de la librairie, Add Existing Files…
4. Sélectionner tous les fichiers .h/.c/.cpp de la librairie et les rajouter
5. Ouvrir le fichier .pro correspondant à la librairie
6. Ajouter à la fin
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
(ceci permettra au projet principal de trouver le chemin des fichiers qui composent la librairie)
7. Sauvegarder et fermer le projet de librairie
8. Dans le projet principal, ouvrir le .pro et rajouter la ligne suivante: include(cheminverslefichierprojetdelalibrairie.pro)

Pour rajouter une librairie externe compilée à un projet Qt

1. Ouvrir le fichier .pro du projet
2. Rajouter  INCLUDEPATH += dossierheaderslibrairie
3. Selon qu’il s’agisse d’une librairie compilée pour Windows, Linux ou Mac, rajouter au choix:
win32:LIBS += dossierlibrairiecompiléewindows/fichiercompilé.lib
linux:LIBS += dossierlibrairiecompiléelinux/fichiercompilé.so
macx:LIBS += dossierlibrairiecompiléemac/fichiercompilé.so

Pour afficher le contenu d’un tableau lors du debug

1. Dans Locals and Watcher, clic-droit Insert new watch item, double-clic sur <Edit>
2. S’il s’agit d’un tableau de floats de 100 entrées (par exemple), taper (float[100])*montableau
MAJ: il est aussi possible d’écrire {float[100]}montableau

Cela fait maintenant un peu plus de 2 semaines que DIVIDE FRAME est lancé, l’occasion de dresser un premier bilan de l’évolution et des problèmes rencontrés à grande échelle…

It’s not a feature, it’s a bug !

Malgrès les nombreux tests effectués avant le lancement, j’ai reçu plusieurs messages d’utilisateurs chez qui le plugin ne marchait pas: démarrage un peu déstabilisant !
J’ai donc travaillé d’arrache-pied ces 2 semaines à résoudre patch après patch les bugs rencontrés.
Fort heureusement, l’attente que je supposais (n’ayant pas fait d’études de marché) autour d’une technologie de ce genre s’est prouvée, ces utilisateurs restant en demande malgrès les problèmes rencontrés. Le forum sur le site de la boite s’est avéré plus  utile que je ne l’imaginais !

Finalement, très peu de bugs concernaient le moteur de décodage même, ironiquement la majeure partie des problèmes avaient pour origine le système de distribution des dll Visual Studio (manifest, side-by-side assembly).
Au fur et à mesure des patchs, j’ai aussi corrigés quelques points mineurs:
-même pour un plugin “silencieux”, il est important de fournir un Readme, pour que l’utilisateur soit sur du paramétrage de sa machine et du bon fonctionnement du plugin.
-écrire un fichier de log dans le C:\ est une erreur depuis Vista, ce genre d’informations doit être regroupé dans le répertoire %APPDATA%
-un flux RSS sur le site d’une boite a toute son importance, pour que les utilisateurs puissent se tenir au courant de la sortie des patchs.
-le captcha sur les sections communicantes du site s’est avéré efficace, le seul jour où je l’ai désactivé, le forum et le mail se sont retrouvés spammés.

Enfin, je crois que ma réactivité face aux problèmes et questions divers a favorisé l’indulgence dans les cas critiques !

Diffusion

En 2 semaines, DIVIDE FRAME a atteint (et même légérement dépassé) le rythme minimum de rentabilité. Il faut néanmoins que ce rythme se maintienne, mais j’ai bon espoir au vu du nombre de corrections effectués, et de la campagne qui n’est pas encore véritablement commencée (seuls les forums sont au courant pour l’instant).
Pour donner un ordre d’idée, 1 téléchargement sur 100 se convertit en vente à l’heure actuelle.

NVIDIA m’a récemment proposé de figurer aux seins de leurs applications CUDA référencés, et de participer à leur opération commerciale “Built for Adobe Pros“. J’espère en tirer une visibilité plus grande à terme.

Affaire à suivre…

Ça fait quelques mois que je n’avais pas posté d’articles, et pour cause…

Après quelques divagations de R&D (entre autre le SSDM, et quelques projets dont je n’ai pas parlé ici), je me suis aperçu qu’inventer des technos en indépendant n’était pas un modèle viable économiquement; malgré l’intérêt de Crytek et d’Ubisoft pour le SSDM, il semble que ce ne soit pas dans la philosophie de ces boites que d’acheter une techno seule. Comme il n’était pas dans mon optique de redevenir salarié, les négociations se sont arrêtés là.

Si une techno seule n’est pas vendable, proposer directement un produit finit semblait être la voie à suivre. Histoire de ne pas partir dans un projet interminable pour lancer ma boite (grâce au statut d’auto-entreprise), j’ai attaqué par un plugin.

Les nouvelles caméras HD proposent depuis 1 an le format AVCHD, destiné à remplacer le HDV; hors ce format est basé sur le h.264, codec difficile à éditer à l’heure actuelle. Autant la plupart des machines peuvent lire ces vidéos sans trop de problème, autant les logiciels de montage ont encore beaucoup de mal à gérer ce codec pour du montage temps réel, au point que la plupart sont obligés de transcoder les vidéos dans un format intermédiaire.
avchdh264

Choix techniques

Etant familier des GPU, c’est donc naturellement vers ça que je me suis tourné pour chercher une solution temps-réel. Actuellement, 2 technos permettent d’accéder aux capacité de décodage des GPU: DXVA et CUDA. Le premier fait le bonheur des lecteurs multimédia (type MPC-HC), le second des logiciels de transcodage (type Badaboom).
Je me suis d’abord tourné vers DXVA, qui a l’avantage d’être une solution multi-hardware (ATI/NVIDIA). Malheureusement, passé la simple implémentation dans un lecteur vidéo, je me suis bien vite aperçu que personne ne maitrisait vraiment cette technologie; pas même les développeurs de chez Microsoft, pourtant à l’origine de la norme. Une application pour du traitement semblait donc compromise. Restait donc CUDA, qui s’est avéré beaucoup plus souple d’utilisation.
C’est là que le challenge s’est présenté: entre développer une simple application linéaire (lecture/transcodage), et un moteur capable d’extraire n’importe quelle image à la demande, de façon totalement arbitraire, de plusieurs vidéos en simultané. Et faire en sorte que ce flux aléatoire tire partie au maximum des capacités hardware, autant qu’un flux linéaire le peut.

NVIDIA CUDANVIDIA PUREVIDEO HD 2
liste des GPU compatibles

Contacts et négociations

Ce projet n’aurai pas été réalisable sans l’accord et le support des différentes boites propriétaires des technos en jeu. Ainsi, tout ce qui concerne la partie décodage GPU n’est disponible que sous NDA avec NVIDIA.
Je remercie au passage les développeurs de Sony de s’être prêté au jeu, en m’offrant une licence Vegas Pro 9 et en le patchant avant sa sortie pour éviter tout problème de compatibilité avec mon plugin.
Pour obtenir ces contacts, LinkedIn m’a été grandement utile. A l’époque où j’écrivais cet article, j’en supposais les possibilités. Avec ce projet, j’ai pu les vérifier. Grâce à ce réseau, j’ai pu atteindre directement les personnes impliqués dans tel ou tel département de chaque boite, là où le service clientèle me répondait à coté plusieurs semaines après… La fonction mail est payante, mais il est tout aussi possible de faire passer un message en rajoutant les personnes de second ou troisième degré dans son réseau. Le double avantage, c’est qu’au fur et à mesure notre réseau s’agrandit (donc plus de boites joignables). Le projet m’a ainsi fait passé de 110.000 personnes joignables à 2.000.000 (en 3em degré).

Le développement

En 6 mois de développement, je n’ai jamais autant appris sur les subtilités du C++ qu’avec ce projet.
L’obligation de marier différents environnements (Vegas, Premiere, CUDA, et librairies diverses…) m’a obligé à comprendre certaines conventions qui m’étaient jusque-là complètement étrangères (type les conventions d’appels __cdecl / __stdcall), les pointeurs de fonctions au sein de classes, maitriser le fonctionnement des threads, les optimisations assembleur, les subtilités d’encapsulations et d’inclusions qui garantissent la compatibilité quelle que soit l’environnement, et permettent de valider à coup sur chaque étape.
Nécessité d’implémenter aussi une fonction de log, et truffer les différentes étapes du programme de ces logs. Cette boite noire s’avère indispensable à partir du moment où le projet devient complexe, et facilitera grandement le débuggage si un problème arrive chez un client.
J’en recopie ici une version simplifiée, qui génère un journal HTML:

//exemple d'utilisation: logerror("error decoding frame %u from file %s",framenumber, filename);

void logerror(char* format, ...)
{
static FILE* logfile;
logfile=fopen("c:/debug.htm","a");

static char logmsg[512];
va_list args;
va_start (args, format);
vsprintf(logmsg,format, args);
va_end (args);

SYSTEMTIME time;
GetLocalTime(&time);

fprintf(logfile,"<b>%04u-%02u-%02u %02u:%02u:%02u <i>[%s]</i></b><br>\n",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond,logmsg);

fclose(logfile);
}

Bilan

Le beta-test du plugin aura duré 6 semaines, pendant lesquelles plus de 100 fichiers issues de 12 caméras hd différentes ont été testés. Le moteur seul a été soumis à une dizaine de configurations grâce au concours de la communauté NoFrag, qui s’est montré comme toujours ouverte et réactive !
Après 1200h de travail sur 6 mois, et autant de builds, le projet est maintenant prêt pour une diffusion publique. Dans un premier temps, je lance la version Sony Vegas Pro 9 32bit et Adobe Premiere CS3/CS4, puis devrait suivre Sony Vegas Pro 9 64bit, et Thomson/Canopus Edius.
frameratesize

packshotvegaspackshotpremiere

GPU Decoder sur DIVIDEFRAME.COM
http://www.vimeo.com/5181272

Google Street étend son territoire…

Vendredi 27 mars 2009 à 12:59

Google Street en Octobre 2008 (d’après le screenshot à cette date):

Google Street en Mars 2009:

Toutes les principales villes françaises sont maintenant intégralement couvertes (à l’exception de Bordeaux), plus le Royaume-Uni, l’Espagne, l’Italie, et la Hollande.

Je ne sais pas combien ça représente de chauffeurs et de kilomètres parcourus, en tout cas je n’aurai pas imaginé que ça se mette en place si vite alors que seule une avenue de Paris était couverte il y a 1 an…

Collaboration Sir_Carma / Divide

Mercredi 4 mars 2009 à 16:47

Inspiré par la dernière compo de Sir_carma, qui m’a gentiment fournit les pistes sources, j’ai brodé avec ce que j’avais envie d’y voir figurer…
Ma première collab NoFrag :)
Divide and Sir Cama - See Cooper (collab).mp3

A corps ouvert / Invaders Must Die

Dimanche 22 février 2009 à 17:18

ourbody
Ça doit bien faire 2 ans que j’attendais son passage, l’exposition controversé Our Body / A corps ouvert de l’anatomiste allemand Gunther von Hagens s’installe enfin à Paris, Espace 12 Madeleine, du 12 février au 10 mai 2009. Pour rappel, il s’agit d’une exposition d’écorchés plastinés, sorte de momification moderne.

prodigy

Invaders Must Die, le nouvel album de Prodigy, sort -officiellement- demain en France. Et J-21 pour le concert à Paris !

compo orchestrale

Samedi 24 janvier 2009 à 18:01

Ça doit bien faire 1 an que je n’avais pas fait de compo orchestrale, je m’y réessaye aujourd’hui inspiré par la récente tempête

Please enable Javascript and Flash to view this Flash video.Divide - Weather

D’autre part, j’ai refait le design de mon site en m’inspirant de vista/7

L’auto-entreprise… Enfin !

Jeudi 22 janvier 2009 à 11:29

Il y a 1 an et demi je me suis inscrit en micro-entreprise (micro-bnc), à l’époque le statut le plus “simple” pour créer son entreprise individuelle.
1 an et demi après, il s’avère que ce statut est en fait beaucoup plus lourd que prévu, que ce soit au niveau des charges sociales ou en complexité administrative. En fait, si je n’avais pas contesté à maintes reprises les cotisations qui m’étaient demandés (je ne compte plus mes envois en recommandé et les mises en demeure que j’ai reçu), j’aurai payé plus que ce que j’avais facturé dans l’année, un comble..! Ce statut était pourtant à l’époque le plus light, mais avec 4 organismes établissant chacun leur propres barèmes (RSI, CIPAV et l’URSSAF, sans oublier l’impôt sur les entreprises) on se retrouve rapidement avec des seuils minimum aberrant, même si aucun revenu n’a été produit dans l’année.

Récemment le secrétaire d’Etat chargé du Commerce a eu le bon sens de créer un nouveau statut, l’auto-entrepreneur, qui devrait rassurer ceux qui hésitent à franchir le pas pour créer leur entreprise individuelle.
Ce statut assure en effet un taux fixe de cotisation de 21,3% sur les revenus générés (avec cotisation mensuelle ou trimestriel au choix, donc pas de mauvaise surprise l’année suivante) ce qui signifie zéro revenu=zéro cotisation. Ce statut permet d’engrenger jusqu’à 32000€ brut par an, soit 32000*(100-21.3)/100/12=2100€ net/mois, plutôt correct pour un début d’activité !
De plus les procédures administratives (création, déclaration de revenu et fermeture d’entreprise) sont extrêmement simplifiés, puisque tout passe par un formulaire en ligne sur le site officiel de l’auto-entrepreneur.
Cette loi a le mérite d’encadrer les différents organismes de cotisation, et si les artisans peuvent y adhérer depuis le 1er janvier 2009, ce n’est pas le cas des professions libérales qui devront attendre officiellement le 15 février 2009 pour pouvoir y adhérer, puisque la CIPAV y va à reculons devant le manque à gagner (hinhin).

Un très court reportage TF1 du 2 janvier sur l’auto-entreprise

Et pour en savoir plus, une émission très intéressante de BFM du 19 janvier avec pas mal de réponses, et le forum du site auto-entrepreneur.fr.

Bulle d’immersion à 180 degrés low-cost

Samedi 17 janvier 2009 à 19:25

En jouant à Mirror’s Edge je suis régulièrement bluffé par le degré d’immersion, que ce soit au niveau de l’éclairage ou du body-awareness. Je crois qu’avec Crysis, aucun jeu ne m’avait donné autant l’envie de m’immerger complètement dans un environnement virtuel.
Inspiré par le jDome, passé en home de NF il y a quelques temps (mais pas encore disponible à l’heure actuelle), j’ai décidé de tenter l’expérience en construisant ma propre bulle d’immersion low-cost.

Matériel requis:
-Un vidéo-projecteur HD (trouvable à partir de 650€, tout du moins il y a 1 an de cela)
-8 feuilles de papier A4 (ou 4 feuilles A3) à 80gr/m² (plus dense: trop opaque, moins dense: trop souple), heureusement ce sont les plus répandus.
-Un support (help yourself)

1/ Assemblez soigneusement les feuilles avec du scotch transparent de manière à former une surface de 84cm*59.4cm

2/ Téléchargez le patron ci-dessous (je ne garantie pas avoir fait le meilleur design, n’hésitez pas à en tester d’autres):

3/ Fixez temporairement votre surface au mur (avec de la patafix par exemple), et projetez le patron dessus:

4/ Repassez au crayon le motif, puis détachez l’ensemble.

5/ Découpez le patron

6/ Assemblez les bords soigneusement avec des petits morceaux de scotch, en partant du centre.
C’est l’étape la plus délicate, et il n’est pas possible de le faire d’un seul trait à cause de la courbure.

7/ ? Trouvez un support

8/ Profit !

Patch FOV pour Mirror’s Edge

L’immersion est vraiment là (ceux qui ont déjà vu des films à la Géode comprendront), mais ce système me donne envie de vomir au bout de 5min. Je n’ai donc malheureusement pas poussé l’expérience plus loin…