[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux] Re: Vectorisation de code C++



Salut Rémi! 

Quoi de neuf?

C++ est un langage de programmation orienté objet -> différent de la
programmation séquencielle.

L'orienté objet tend à découper un programme en tâches et 
responsabilités distinctes. Sur ce point, l'exécution de certaines
tâches pourraient s'exécuter simultanément sur plusieurs CPU vu la
structure du langage. MAIS dans tes classes C++, tu vas retrouver des
morceaux de code séquentiel. Il est clair que ce code là n'a aucune
raison de s'exécuter sur deux CPU différents. Si tu as une boucle
gourmande et qui dure longtemps, à toi de voir comment distribuer le
calcul entre plusieurs process pour profiter de tes CPU. J'entends par
distribuer le calcul un truc du genre 

si tu as 

for (i = 0; i < 100; i++)
	mon_calcul_bien_lourd(); 

Essaye de te ramener à 

for (i = 0; i < 50; i++) 
        mon_calcul_bien_lourd();

dans le process A

et 

for (i = 50; i < 100; i++) 
        mon_calcul_bien_lourd();

dans le process B. 

Alors oui tu gagneras en performances et tes CPU montreront toute leur
puissance.

Encore faut-il que ce genre de distribution soit possible et n'amène pas
trop d'opérations pour garder la cohérence du calcul et de son résultat.

Tu ne gagneras pas un facteur x où x est le nombre de CPU. A cause du
coût qu'une exécution répartie va amener.

Maintenant au niveau de gcc, il faut savoir comment fonctionne un CPU

En gros (très gros), un CPU possède une file d'attente pour les
instructions. Dans cette file, toutes les instructions ne peuvent pas se
suivre. L'exemple a = b + e; c = a + c; est typique. Il y a des règles
assez complexes pour règler ce genre de cas.

Cette façon de faire s'appelle le pipelining.

Ce que gcc commence à savoir faire, c'est compiler le code source en
bloc d'instructions indépendant pour pouvoir utilisé les pipelines.
Evidement, les règles sont fonctions du nombre de niveau du pipeline (le
nombre de places dans la file) et le nombre de niveau est fonction du
CPU.

Pour ce qui est de l'opération de compilation, si tu utilises make,
ajouter le flag -j 2 permet de compiler en utilisant au maximum tes deux
CPUs.

J'espère que cela t'aide un peu tout de même, n'hésite pas à me
contacter si tu as vraiment besoin.

A bientôt

Benoit


On Wed, Apr 24, 2002 at 12:30:02PM, Jean-Marie Lambert wrote:
> Bonjour !
> 
> > gcc ne peut pas le faire pour toi, comment va-t-il savoir
> > quel code il peut séparer en deux applis indépendantes ?
> 
> Mon programme est consitué en grandes parties de boucles, 
> et il me semblait qu'il existait des compilateurs suffisament 
> intelligents pour voir (dans mon cas précis) quelles boucles 
> pouvaient être réalisées indépendamment des autres.
> 
> Dites-moi si je me trompe...
> 
> Merci,
> 
> Rémi LAMBERT
> _______________________________________________
> Linux Mailing List
> LCP - 11 Mai - http://www.unixtech.be/lcp.php
> Archives: http://www.unixtech.be/mailman/listinfo/linux
---end quoted text---

-- 

Benoit JOSEPH 
Manex SPRL: benoit.joseph@manex.be
Perso: joker@baby-linux.net
       benoit.joseph@teledisnet.be

Attachment: pgp01098.pgp
Description: PGP signature