Multithread et core 2 duo - C++ - Programmation
Marsh Posté le 12-07-2008 à 19:13:44
C'est le spécialiste du multithread ?
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
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
Marsh Posté le 12-07-2008 à 22:42:19
ou la non j'ai pas fait tout ca
je serais pas contre quelques liens a ce sujet si tu as ca sous la main
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
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) ?
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
Marsh Posté le 13-07-2008 à 23:12:34
je voudrais passersur CImg
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
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
Bon tiens moi au courant de ce qui te manque comme infos
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
Marsh Posté le 14-07-2008 à 10:07:03
guère plus que Boost::thread qui reste très orienté objet
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 ?
Marsh Posté le 14-07-2008 à 19:01:10
bah tu fait un foncteur qui n'aura aps besoin de passer par bind
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)
Marsh Posté le 14-07-2008 à 19:22:09
solution 1 : une structure :E
solution 2 :
Code :
|
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.
Marsh Posté le 14-07-2008 à 19:24:49
Je crois que j'ai compris , je vais essayer et je te dis
merci infiniment
Marsh Posté le 18-07-2008 à 19:16:40
Bon ben ca marche super bien, merci beaucoup
Marsh Posté le 18-07-2008 à 19:36:06
ca donne quoi en teme de gain ? JE suppose que tu n'as que threader ?
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
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.
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
Marsh Posté le 12-07-2008 à 16:42:21
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