[DEV] Compiler VLC pour les CPU Atom
Aujourd'hui, nous vous proposons une petite actualité dédiée aux amoureux du développement et de la programmation, mais également à tout geek qui se respecte : qui n’a en effet jamais désiré améliorer les programmes qu’il utilise et les optimiser « aux petits oignons » pour sa propre configuration ? On peut également songer à optimiser un programme pour une génération de processeurs ou une plateforme en particulier...
Nous allons donc nous intéresser à la compilation sur plateforme Win32 de VLC, un lecteur multimédia extrêmement léger. Pour l'occasion, nous allons essayer d'optimiser VLC pour les plateformes Atom, l'idée étant de tirer parti de toute la puissance disponible sur un netbook lambda basé sur une telle plateforme.
L’environnement de développement
Plusieurs choix sont possibles en ce qui concerne l’environnement de développement, nous avons choisi MinGW (Minimalist GNU for Windows), une adaptation sur plateforme Win32 des logiciels de développement et de compilation du GNU (GCC - GNU Compiler Collection), et MSYS (Minimal SYStem), un environnement en ligne de commande servant de support aux outils de développement MinGW.
Commençons donc par télécharger MinGW, puis installons-le en choisissant « download latest repository catalogue » afin d'utiliser les dernières versions des outils. Ne pas oublier de cocher « C++ Compiler » et « MinGW Developer ToolKit » (qui comprend MSYS), nous allons en avoir besoin…
Installer ensuite TDM-GCC (version SlJl) dans le même répertoire que MinGW. La version de GCC intégrée à MinGW pose en effet quelques problèmes lors de l'étape de compilation...
Créer un répertoire nommé « local » dans <lecteur>/MinGW/msys/1.0/.
Lancer enfin MinGW Shell. L'invite de commande nous place dans /home/<Utilisateur> par défaut (qui se trouve en réalité dans <lecteur>/MinGW/msys/1.0/home/<Utilisateur>).
Sources et pré-requis
Récupérer les sources de LUA (5.1.4) et de VLC (1.1.10) et les placer dans <lecteur>/MinGW/msys/1.0/home/<utilisateur>.
Décompresser les fichiers (commandes à taper ou à copier-coller dans l'invite de commande MSYS/MinGW) :
tar -xvzf lua-5.1.4.tar.gz
tar -xvjf vlc-1.1.10.tar.bz2
Ouvrir le fichier /home/utilisateur/lua-5.1.4-src-Makefile (avec WordPad par exemple) et remplacer :
CFLAGS= -O2 -Wall $(MYCFLAGS)
par :
CFLAGS= -O3 -Wall -march=atom -mfpmath=sse -pipe $(MYCFLAGS)
Cela permet d'activer de nombreuses optimisations permises par le compilateur, de lui demander d'utiliser les instructions SSE plutôt que du code x87 pour les opérations flottantes (mfpmath=sse), et enfin de générer du code optimisé pour les processeurs Atom (-march=atom). En contre-partie, les processeurs plus anciens risquent de rencontrer quelques problèmes pour exécuter le programme...
Compiler enfin LUA :
cd lua-5.1.4
make mingw -j2
make install
cp ./src/lua51.dll /local/bin
Si vous possédez un processeur quad-core, vous pouvez essayer de remplacer -j2 par -j4...
Compiler VLC
Définir la variable PKG_CONFIG_PATH :
export PKG_CONFIG_PATH=/win32/lib/pkgconfig
Récupérer les "contribs" (des librairies pré-compilées) et les décompresser dans <lecteur>/MinGW/msys/1.0/ en retirant "usr" du chemin (les fichiers doivent se trouver dans <lecteur>/MinGW/msys/1.0/win32/... ).
Récupérer les scripts configure-msys.sh et configure-common.sh et placer ces fichiers dans <lecteur>/MinGW/msys/1.0/home/<utilisateur>vlc-1.1.9/extras/package/win32 avec comme noms configure-msys.sh et configure-common.sh.
Ouvrir le fichier configure-msys.sh et modifier :
CONFIGOPTS="--host=i586-mingw32msvc --build=i386-linux
--disable-mkv --disable-taglib --disable-nls --enable-debug"
en :
CONFIGOPTS="--disable-mkv --disable-taglib --disable-nls --disable-debug --disable-upnp --prefix=/local"
Récupérer pkg-config (0.25-1) et pkg-config-dev (0.25-1) et décompresser les fichiers dans <lecteur>/MinGW/msys/1.0/local/ .
Compiler VLC :
cd vlc-1.1.10
cp -v /usr/win32/share/aclocal/* m4/
cp -v /usr/share/aclocal/* m4/
cp -v /usr/local/aclocal/* m4/
PATH=/usr/win32/bin:$PATH ./bootstrap
LDFLAGS="-L/win32/lib -L/local/lib" CPPFLAGS="-I/win32/include -I/local/include" CFLAGS="-O3 -march=atom -mfpmath=sse -pipe" CXXFLAGS="${CFLAGS}" sh extras/package/win32/configure-msys.sh
On cherche ici aussi à utiliser le maximum d'optimisations autorisées par le compilateur et à générer du code optimisé Atom (en particulier le support des instructions MMX, SSE, SSE2, SSE3 et SSSE3).
Ouvrir /home/<utilisateur>/vlc-1.1.10/vlc-config et replacer :
cflags_tuning="-mtune=pentium2"
cflags_optim_size=" -Os"
cflags_optim_speed=" -O4 -ffast-math -funroll-loops"
cflags_optim_nodebug=" -fomit-frame-pointer"
cflags_nooptim=" -O0"
par :
cflags_tuning="-march=atom"
cflags_optim_size=" -Os"
cflags_optim_speed=" -O3 -mfpmath=sse -malign-double -maccumulate-outgoing-args -m128bit-long-double -momit-leaf-frame-pointer -minline-all-stringops -ffast-math -funroll-loops"
cflags_optim_nodebug=" -fomit-frame-pointer"
cflags_nooptim=" -O0"
Cela permet d'utiliser de nombreuses optimisations permises par le compilateur, et de générer du code optimisé pour les processeurs Atom.
Taper ensuite dans l'invite de commande MSYS/MinGW :
PATH=/local/bin:$PATH make -j2
Ça y est, VLC est compilé ! On va ensuite créer un fichier zip contenant tous les fichiers nécessaires au logiciel.
Récupérer zip (3.0) et bzip2 (1.0.5) et décompresser les fichiers dans <lecteur>/MinGW/msys/1.0/local/ .
Taper ensuite dans l'invite de commande MSYS/MinGW :
make package-win32-zip
Le fichier vlc-1.1.10-win32.zip est créé, il ne manque plus qu'à le récupérer dans /home/<utilisateur>/vlc-1.1.10 ! C'est votre processeur Atom qui va être content... Bien entendu, il est toujours possible de faire mieux, nous attendons d'ailleurs vos idées !
Un problème, une remarque ou une idée pour améliorer la compilation ou optimiser encore un peu plus VLC ? N'hésitez surtout pas à laisser un commentaire !
- Developpement,
- compilation ,
- VLC ,
- atom
- TDJ : Sennheiser PXC 360 BT
- Nostalgeek 2001 (4) : Athlon, DDR et GeForce 2MX
- Cisco va aider la Chine à surveiller ses citoyens
- Les serveurs d'Apple piratés par Anonymous
- Asus PA238Q : un 23 pouces pour les pros
- Un Bulldozer FX-8130P déjà overclocké à 5,1 GHz
- AirDrop, le Wi-Fi Direct d'Apple a des limites
- AMD Brazos-T pour les tablettes Windows 8
- Les données européennes soumises au Patriot Act
- Un boîtier externe « ouvert » en SATA 6Gbps
- Un nouveau TouchPad d’HP pour le mois d'aout
- Un NEMS 3D gravé dans un wafer
- Durée de vie des SSD : on recommence (11)
- Windows 8 : une CTP la semaine prochaine ?
- Toshiba F750 : un notebook 3D sans lunettes
- Asus présente sa souris WX-Lamborghini
- Un CPU OMAP certifié Netflix sur Android
- Un Snapdragon quad core sortira en 2013





Ha tien, un article peu courant qui constitue une idée originale !
A noter que MingW existe aussi en version native 64 bits pour générer du code 64 bits, et que la plupart des processeurs ATOM sont en fait 64 bits ! C'est une option intéressante si on a installé windows en version 64 bits (au lieu de la version "Starter" qui équipe presque tous les netbooks).
EDIT : je ne suis pas certain que -Os et -O3 soient compatibles...
EDIT : je ne suis pas certain que -Os et -O3 soient compatibles...
Le -Os n'est utilisé que si on choisit de compiler VLC en optimisant la taille. Ce n'est pas ce path que l'on prend ici
le --disable-mkv m'intrigue. On risque pas de se retrouver avec un VLC ne sachant pas lire les mkv ? ce qui serait un peu dommage quand meme.
Ça serait possible de faire une comparaison des performances entre la version classique téléchargée sur le site de VLC et la version compilée "sur mesure" pour son processeur?
Pour voir le gain réel?
le --disable-mkv m'intrigue. On risque pas de se retrouver avec un VLC ne sachant pas lire les mkv ? ce qui serait un peu dommage quand meme.
Je viens de tester, ça fonctionne.
Ça serait possible de faire une comparaison des performances entre la version classique téléchargée sur le site de VLC et la version compilée "sur mesure" pour son processeur?Pour voir le gain réel?
ça serait intéressant à faire effectivement... Quelqu'un se dévoue pour essayer
Pourrait-on compiler pour SB afin d'utiliser Quick Sync ou mon idée est à la masse ?
article intéressant et inhabituel, en effet.
a condition de préciser toutefois qu'il ne suffit pas de quelques options de compilation pour optimiser du code. le processus d'optimisation est un travail de fond qui commence dès la conception du logiciel, donc bien avant l'écriture de la moindre ligne de code.
la seule optimisation due à la compilation est vraiment très très marginale, on l'utilise plutôt pour accroitre la compatibilité que pour autre chose.
ceci étant dit, merci pour cet article très technique pour une fois...
article intéressant et inhabituel, en effet.
a condition de préciser toutefois qu'il ne suffit pas de quelques options de compilation pour optimiser du code. le processus d'optimisation est un travail de fond qui commence dès la conception du logiciel, donc bien avant l'écriture de la moindre ligne de code.
la seule optimisation due à la compilation est vraiment très très marginale, on l'utilise plutôt pour accroitre la compatibilité que pour autre chose.
ceci étant dit, merci pour cet article très technique pour une fois...
Effectivement
On peut aussi faire simplement make -j. Il me semble que ça lancera autant de processus de compilation qu'il y a de coeurs à disposition.
On peut aussi faire simplement make -j. Il me semble que ça lancera autant de processus de compilation qu'il y a de coeurs à disposition.
Exact.
ya pas moyen de faire un script qui détecte le cpu est les flags des unités installés, et de faire un exécutable destiné pour le pc en question ?
Mine de rien, moi qui m'y connais en info, je trouve, re-trouver les commandes, si je veux faire ça pour un Bulldozer ou un Lliano, ou n'importe quoi d'autre que vlc, c'est quand même un peu lourd.
Je suis pas spécialiste de linux aussi, donc normal aussi que je trouve ça lourd, mais bon, j'avoue c'est bien pratique. Ex, il y a Handbrake qui est open, et qui serais bien de l'avoir direct en avx, par ex.
ya pas moyen de faire un script qui détecte le cpu est les flags des unités installés, et de faire un exécutable destiné pour le pc en question ?Mine de rien, moi qui m'y connais en info, je trouve, re-trouver les commandes, si je veux faire ça pour un Bulldozer ou un Lliano, ou n'importe quoi d'autre que vlc, c'est quand même un peu lourd.Je suis pas spécialiste de linux aussi, donc normal aussi que je trouve ça lourd, mais bon, j'avoue c'est bien pratique. Ex, il y a Handbrake qui est open, et qui serais bien de l'avoir direct en avx, par ex.
Il faut dans ce cas utiliser -march=native
ça détecte le CPU installé, et choisit l'archi qui va bien.
Mais dans le cas de la news, j'ai pas tellement envie de compiler VLC sur un Atom
comme d'hab il n'y a personne pour poster le binaire compilée, il reste plus qu'a laisser les novices comme moi perdre leur temps a essayer de 'compiler' pour qu'en plein milieu, submergé de messages d'erreurs, je me rende compte que j'ai perdu une heure de mon temps pour rien. Merci pour l'effort, dommage de s'etre arreter en si bon chemin.
comme d'hab il n'y a personne pour poster le binaire compilée, il reste plus qu'a laisser les novices comme moi perdre leur temps a essayer de 'compiler' pour qu'en plein milieu, submergé de messages d'erreurs, je me rende compte que j'ai perdu une heure de mon temps pour rien. Merci pour l'effort, dommage de s'etre arreter en si bon chemin.
L'objectif n'était pas de mettre en ligne le binaire final, mais au contraire que tout le monde puisse, pas à pas (d'où toutes les étapes détaillées !), arriver au même résultat.
Sinon, pour ceux qui ne veulent pas s’embêter/perdre leur temps/tester (tout simplement), il est toujours possible d'aller récupérer le binaire de VLC - non optimisé mais qui fonctionne partout - sur le site officiel...
Tient, un peu hors sujet mais je tente quand même : j'avais télécharger UMPlayer il y a quelques semaines et pendant quelques jours je ne pouvais plus lire de vidéos avec. Maintenant c'est revenu mais est-ce arriver à d'autres ?
A quand le tuto pour ICC ?
Les pratiques anticoncurrentielles d'Intel sont relou, mais si on cherche les perfs maximales sur une archis Intel, c'est à tenter.
Lors de la compilation de VLC, la ligne : cp -v /usr/local/aclocal/* m4/ ne marche pas chez moi, par contre j'ai trouvé aclocal dans /usr/local/share/aclocal. J'ai continué avec ça donc et quand plus tard je rentre : PATH=/local/bin:$PATH make -j2 , j'obtiens : make: ***No targets specified and no makefile found. Stop.
Une idée svp ?
Lors de la compilation de VLC, la ligne : cp -v /usr/local/aclocal/* m4/ ne marche pas chez moi, par contre j'ai trouvé aclocal dans /usr/local/share/aclocal. J'ai continué avec ça donc et quand plus tard je rentre : PATH=/local/bin:$PATH make -j2 , j'obtiens : make: ***No targets specified and no makefile found. Stop.Une idée svp ?
tu lances bien la commande make en étant dans le bon répertoire (vlc-x.x.xx) ?
Oui je viens de tester après "cd vlc-1.1.10" et ça donne rien donc j'étais dans le bon répertoire.
Oui je viens de tester après "cd vlc-1.1.10" et ça donne rien donc j'étais dans le bon répertoire.
Et si tu lances ,toujours dans ce repertoire, un simple make, il commence à compiler ?
Marche pas non plus, il affiche toujours :
"make: *** No targets specified and no makefile found. Stop."
Peut être que j'ai foiré un truc dans les fichier .m4 au moment du cp -v /usr/local/aclocal/* m4/ (voire manip que j'ai faite dans mon premier message en gris)
Marche pas non plus, il affiche toujours :"make: *** No targets specified and no makefile found. Stop."Peut être que j'ai foiré un truc dans les fichier .m4 au moment du cp -v /usr/local/aclocal/* m4/ (voire manip que j'ai faite dans mon premier message en gris)
Même si tu avais foiré un truc à ce niveau, la commande make fonctionnerait...
quand tu as fait le "sh extras/package/win32/configure-msys.sh", t'as pas eu de message d'erreur ?
J'ai plusieurs warning et la dernière ligne écrite est :
"configure: Error: Library shout >= 2.1 needed for shout was not found"
Sinon je vois quand même 2 fichiers makefile dans vlc-1.1.10 (un .in et un .am)
J'ai plusieurs warning et la dernière ligne écrite est :"configure: Error: Library shout >= 2.1 needed for shout was not found"Sinon je vois quand même 2 fichiers makefile dans vlc-1.1.10 (un .in et un .am)
Et bien il va falloir que tu attendes que je revienne de vacances alors
Ou qu'une âme charitable passe par là avant
Pas de probleme

Mon atom tiendra le coup jusque là...