DivideConcept.net

le blog de divide.

Archive pour octobre 2009

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…

edit 12/11/2009: cela est peut-être aussi du au fait que mes tests dépassaient le cache processeur. L’execution est beaucoup plus rapide lorsqu’on reste dans cette limite (buffer de 2-3 MB tout au plus). L’écart est donc probablement moins important et le gain quad-core plus proche du x3 que d’un x2.

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 !

edit 12/11/2009: le gain peut plutot être considéré de 3*3=x9

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