Multithread et core 2 duo

Multithread et core 2 duo - C++ - Programmation

Marsh Posté le 12-07-2008 à 16:42:21    

:hello:  
 
Je souhaite accélerer le code C++ que j'ai concu dans ma thèse, en utilisant au mieux le core 2 duo de mon mac.  
 
Le coeur du moteur de calcul est clairement parallélisable, j'ai deja la version parallèle sur papier. Mais je voudrais savoir quelles sont les meilleures bibliothèques C++ a rajouter sous Xcode pour pouvoir lancer un thread de calcul sur chacun des deux cores. J'ai entendu parler de Boost, est ce simple a utiliser ?
 


---------------
MK DS 459634-483247
Reply

Marsh Posté le 12-07-2008 à 16:42:21   

Reply

Marsh Posté le 12-07-2008 à 19:13:44    

C'est le spécialiste du multithread ? :d
 
ce que je voudrais faire c'est decouper un domaine de calcul (éléments finis) en 2 et d'attribuer les calculs sur chaque moitié a un core, j'ai quelques notions de threads mais c'est tout  [:fat dog]


Message édité par Theorie du Kaos le 12-07-2008 à 19:15:11

---------------
MK DS 459634-483247
Reply

Marsh Posté le 12-07-2008 à 21:04:36    

en gros boost::thread te permets tres simplement à partir d'un objet effectuant ton calcul de lancer un groupe de X thread.

 

Par contre avant de se lacher sur les threads, t'as optimisé en SIMD, vérifier la localité de tes caches et vérifier la complexité des algos ?
si trop long/trop complexe à expliquer => MP


Message édité par Joel F le 12-07-2008 à 21:05:41
Reply

Marsh Posté le 12-07-2008 à 22:42:19    

ou la non j'ai pas fait tout ca :ouch:  
 
je serais pas contre quelques liens a ce sujet si tu as ca sous la main :o
 
Grosso modo mon code travaille sur des images de grandes dimensions, et ce que j'aimerais faire c'est découper les images en plusieurs morceaux et confier chaque morceau a chaque core. a la fin de chaque calcul, je veux imposer des conditions de continuité entre les solutions calculée sur les bords des morceaux ... voila, donc je verrai des threads s'occuper de calculer les solutions de mes equations sur des morceaux d'images et une fois les threads terminés, je recollerais le tout ...
 
apres j'ai une grosse fonction qui prends un certain nombre de parametres, qui s 'occupe de faire mon calcul. J'imagine qu'il faudrait appeller les threads avec cette fonction , les seuls parametres changeant etant les morceaux d'images sur lesquels je veux que chaque core se concentre


Message édité par Theorie du Kaos le 12-07-2008 à 22:44:22

---------------
MK DS 459634-483247
Reply

Marsh Posté le 12-07-2008 à 22:57:48    

pas de lien mais des cours. Chercher les cours de prog SIMD de lionel lacassagne pr tout ce qui est SIMD ou check ma signature.
Le reste j'ai aps de lien, tout dans la tete. Je te ferais un topo lundi au calme.

 

Sinon question, comment gere tu la memoire de tes images (en terme de SDD) ?


Message édité par Joel F le 12-07-2008 à 23:00:47
Reply

Marsh Posté le 13-07-2008 à 20:54:50    

je cherche merci :)
 
les images je les gere avec OpenCV pour le moment mais j'envisage de passer sur une autre lib. J'ai pas trop regardé les details d'implémentation des images mais je crois que ce sont de betes pointeurs sur des matrices


Message édité par Theorie du Kaos le 13-07-2008 à 20:57:31

---------------
MK DS 459634-483247
Reply

Marsh Posté le 13-07-2008 à 21:30:57    

openCV v_v mouais :/ pointeur 1D donc avec calcul d'offset :/

Reply

Marsh Posté le 13-07-2008 à 23:12:34    

je voudrais passersur CImg ;)


---------------
MK DS 459634-483247
Reply

Marsh Posté le 13-07-2008 à 23:16:00    

Je botte peut-être à côté mais MPI peut aussi convenir et c'est assez facile d'accès si mes souvenirs sont bons.
 
Source :
http://www.sunwizard.net/forum/viewtopic.php?t=2334&sid=2b6a7a5aadae4f75355d2a4811dc9635

Reply

Marsh Posté le 14-07-2008 à 09:23:38    

non, non, non. Avant de sortir l'artillerie, y  assez de choses à optimiser.
et MPI fait office d'ours polaire vis à vis de boost::thread.

 
Theorie du Kaos a écrit :

je voudrais passersur CImg ;)


La bonne blague :o ;)

 

Bon tiens moi au courant de ce qui te manque comme infos


Message édité par Joel F le 14-07-2008 à 09:24:06
Reply

Marsh Posté le 14-07-2008 à 09:23:38   

Reply

Marsh Posté le 14-07-2008 à 09:47:05    

Il y a ca aussi, dans un esprit plus C++ que les threads : http://www.intel.com/cd/software/p [...] 294797.htm

Reply

Marsh Posté le 14-07-2008 à 10:07:03    

guère plus que Boost::thread qui reste très orienté objet ;)

Reply

Marsh Posté le 14-07-2008 à 18:57:03    

Je regarde boost::bind pour pouvoir mettre des fonctions a arguments dans un thread, je dois avoir une vingtaine d'arguments a passer a ma fonction, mais le compilo me dit que boost::bind ne peut pas prendre tous ces arguments ... comment je fais pour passer une liste d'arguments quelconques ?


---------------
MK DS 459634-483247
Reply

Marsh Posté le 14-07-2008 à 19:01:10    

bah tu fait un foncteur qui n'aura aps besoin de passer par bind ;)

Reply

Marsh Posté le 14-07-2008 à 19:01:33    

c'est a dire :??:
 
edit : voila ce que j'ai essayé :
 
thread right_thread(boost::bind(OpticalFlow, _1, _2, _3, _4, _5,
            _6, _7, _8, _9, _10, _11, _12,
            _13, _14, _15, _16, _17, _18,
            _19, _20, _21)(logfile,
               PyramidEta,
               PyramidLevels,
               Il0_r_pyramid,  
               Ilt_r_pyramid,
               PyramidLevelOF,
               U_right_start,  
               V_right_start,
               PyramidLevelSF,
               U_right_end,
               V_right_end,
               h,
               EpsilonOuter,
               EpsilonInner,
               EpsilonSOR,
               MaxIterOuter,
               MaxIterInner,
               MaxIterSOR,
               OmegaSOROF,
               AlphaOF,
               Gamma
               ));
 
Mais apparemment on ne peut pas aller au dela de l'argument _9 :??: (_10 n'est pas reconnu)


Message édité par Theorie du Kaos le 14-07-2008 à 19:11:07

---------------
MK DS 459634-483247
Reply

Marsh Posté le 14-07-2008 à 19:22:09    

solution 1 : une structure :E

 

solution 2 :

 
Code :
  1. class optical_flow
  2. {
  3.   public :
  4.   opticalFlow( /* ta grosse lise d'argument */ )
  5.   {
  6.     // copies (/!\ donc des param dans tes membres
  7.   }
  8.   void operator()()
  9.   {
  10.      // appel de ta fonction avec les membres en arguments
  11.   } 
  12. private:
  13. // les membres contenant tes arguments
  14. };
 

tu instancie cette classe pr chaque thread et tu passe chaque instance à un thread différent. Attention au fait que boost thread fait des deep copie, donc verifie bien que tu passe des réf. ou que tes parametres peuvent etre copiés sans pb de perfs.

 

et opticalFlow, si c'ets ce que je pense, tu peut le vectoriser aussi.


Message édité par Joel F le 14-07-2008 à 19:30:26
Reply

Marsh Posté le 14-07-2008 à 19:24:49    

Je crois que j'ai compris , je vais essayer et je te dis :d  
 
merci infiniment :jap:


---------------
MK DS 459634-483247
Reply

Marsh Posté le 18-07-2008 à 19:16:40    

Bon ben ca marche super bien, merci beaucoup :jap:


---------------
MK DS 459634-483247
Reply

Marsh Posté le 18-07-2008 à 19:36:06    

:) ca donne quoi en teme de gain ? JE suppose que tu n'as que threader ?

Reply

Marsh Posté le 19-07-2008 à 10:06:29    

J'ai pas encore fait de mesures precises mais je dois gagner minimum 30% en temps de calcul a vue de nez, ca peut etre plus faut que je mette un timer pour comparer les versions mono- et bithread
 
Et oui j'ai encore de l'optimisation a faire sur le code donc je peux espere encore mieux :jap:  


---------------
MK DS 459634-483247
Reply

Marsh Posté le 19-07-2008 à 11:19:27    

si ton code est vraiment indépendant tu devrais dépasser les 1.3 de gain je pense.

Reply

Marsh Posté le 27-07-2008 à 17:59:28    

je vais voir ca, je faisais une pause redaction de these et je laissais mon code reposer :d


---------------
MK DS 459634-483247
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed