Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1511 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  qt et parallélisation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

qt et parallélisation

n°1907008
olivier__
Posté le 20-07-2009 à 21:58:41  profilanswer
 

Bonjour,
Je vais commencer par préciser que je ne suis pas du tout informaticien et que je peux donc faire de grosses bourdes en programmation...
Je cherche à déterminer les objets se situant en différents points d'une QGraphicsScene (afin d'obtenir une matrice).
Au départ, j'ai donc écrit :  

Code :
  1. for(int i=-nb/2;i<nb/2+1;i++)
  2. {
  3.       for (int j=-nb/2;j<nb/2+1;j++)
  4.      {
  5.           QGraphicsItem* itemTmp=graphicsscene.itemAt(i/(double)(nb*100),-j/(double)(nb*100));
  6.           if (itemTmp)
  7.           {
  8.              ...
  9.           }
  10.      }
  11. }


Cela fonctionne très bien mais n'est pas très rapide et un seul coeur est utilisé (alors que j'ai 16 coeurs à disposition).
Premier réflexe : je rajoute un "#pragma omp parallel for" avant le for. Pas de problème de compilation, mais le programme plante irrémédiablement (erreur de segmentation) sauf quand la QGraphicsScene est vide...
Alors je coupe la boucle en deux :

Code :
  1. QFutureWatcher<void> futureWatcher1;
  2. QFutureWatcher<void> futureWatcher2;
  3. futureWatcher1.setFuture(QtConcurrent::run(this, &MainWindowImpl::essai1));
  4. futureWatcher2.setFuture(QtConcurrent::run(this, &MainWindowImpl::essai2));
  5. futureWatcher1.waitForFinished();
  6. futureWatcher2.waitForFinished();
  7. void MainWindowImpl::essai1()
  8. {
  9. int nb=1000;
  10. for(int i=-nb/2;i<0;i++)
  11. {
  12.  for (int j=-nb/2;j<nb/2+1;j++)
  13.  {
  14.   QGraphicsItem* itemTmp=graphicsscene.itemAt(i/(double)(nb*100),-j/(double)(nb*100));
  15.  }
  16. }
  17. }
  18. void MainWindowImpl::essai2()
  19. {
  20. int nb=1000;
  21. for(int i=0;i<nb/2+1;i++)
  22. {
  23.  for (int j=-nb/2;j<nb/2+1;j++)
  24.  {
  25.   QGraphicsItem* itemTmp=graphicsscene.itemAt(i/(double)(nb*100),-j/(double)(nb*100));
  26.  }
  27. }
  28. }


J'obtiens alors la même erreur qu'en utilisant openmp. Je me dis alors que j'utilise les mêmes objets dans les deux threads et que c'est certainement la cause de l'erreur.
Du coup, je copie la QGraphicsScene dans une deuxième QGraphicsScene que j'utilise dans la fonction essai2(). Et là ça fonctionne, je n'ai pas d'erreur, j'ai bien deux coeurs utilisés, mais le calcul est 4 fois plus long... Pourquoi?
Quelqu'un pourrait-il m'aider à optimiser ce calcul?  
Merci d'avance!

mood
Publicité
Posté le 20-07-2009 à 21:58:41  profilanswer
 

n°1907053
Joel F
Real men use unique_ptr
Posté le 21-07-2009 à 08:10:10  profilanswer
 

Ta copie elle est pas gratuite non plus hein :o
En outre, QT étant codé avec les pieds, il doit contnir en interne des états static non partagées qui sérialisent les accés ...
Je te conseillerais de ne travailler que sur des données sorties de leurs contextes QT.
Ensuite, quel est le calcul effectué en vrai, car la je vois pas de code de traitement et optimiser sans voir le code, je sais pas faire.
Et enfin, tu parallelise ok, t'as au moins bencher pr savoir si c'etait bien ça qui était limitant ?

Message cité 1 fois
Message édité par Joel F le 21-07-2009 à 08:15:05
n°1907069
olivier__
Posté le 21-07-2009 à 09:13:10  profilanswer
 

Merci pour la réponse.
Oui, j'ai benché et c'est bien ça qui est limitant. La copie du QGraphicsScene ne demande pas beaucoup de ressources car j'ai finalement peu de d'objets à l'intérieur comparativement aux boucles qui sont en réalité beaucoup plus nombreuses.
De toute façon, j'ai benché seulement les boucles (qui me permettent justement de sortir du contexte QT) et pas la copie du QGraphicsScene. Ma Question est surtout de savoir pourquoi lorsque je travaille sur 2 QGraphicsScene différents dans deux threads séparés contenant des boucles deux fois plus petites, les performances sont beaucoup moins bonnes qu'en effectuant une seule boucle ou les deux boucles à la suite et s'il y a une solution pour y remédier ou s'il y a un autre moyen de faire la même chose autrement.  
Après je peux toujours me passer de Qt, mais déterminer si un point est dans une ellipse dont les axes ne sont pas forcément ceux du système de coordonnées et qui peut se trouver en dessous d'une autre forme... Je n'ai pas trop envie de passer du temps à ça, mais s'il le faut (en sachant que je suis obligé de laisser l'interface graphique), je le ferai.


Message édité par olivier__ le 21-07-2009 à 09:13:44
n°1935108
Glock 17Pr​o
Posté le 24-10-2009 à 15:48:40  profilanswer
 

Joel F a écrit :

 
En outre, QT étant codé avec les pieds,?


 
QT est pas bien codé ??? argumente please


---------------
.
n°1935147
Joel F
Real men use unique_ptr
Posté le 24-10-2009 à 19:22:47  profilanswer
 

QT date d'avant le temps ou la STL etait dispo partout, ça recode les deux tiers de la STL avec un modele antédiluvien. Ensuite, y a pas de RAII partout (ou tres peu), du static partout en interne ce qui rend la reentrance complexe etc...
 
Je critique pas la lib pr son coté GUI, elle fait bien son boulot, mais ca sent le renfermé des que tu ouvres le capot.
 
Et je parle pas des MOC :€

n°1935148
Glock 17Pr​o
Posté le 24-10-2009 à 19:24:21  profilanswer
 

tu conseils  d'utiliser std::string/vector plutôt que  QString &co dans un projet qui utilise QT


Message édité par Glock 17Pro le 24-10-2009 à 19:25:36

---------------
.
n°1935150
Joel F
Real men use unique_ptr
Posté le 24-10-2009 à 19:52:57  profilanswer
 

il faudrait masi le pb c'ets que tu vas devoir passer ta vie à convertir car les fonctiosn Qt sont pas génériques


Message édité par Joel F le 24-10-2009 à 19:53:04
n°1935154
Glock 17Pr​o
Posté le 24-10-2009 à 20:05:26  profilanswer
 

T'as pas des liens qui parle des carances de qt je trouve pas


---------------
.
n°1935261
Glock 17Pr​o
Posté le 25-10-2009 à 19:26:40  profilanswer
 

Joel F a écrit :

 
Et je parle pas des MOC :€


http://doc.trolltech.com/4.5/templates.html
 
il parle ici de pourquoi les MOC sont comme ça

C++ with the moc essentially gives us the flexibility of Objective-C or of a Java Runtime Environment, while maintaining C++'s unique performance and scalability advantages


Message édité par Glock 17Pro le 25-10-2009 à 19:27:58

---------------
.
n°1935266
Joel F
Real men use unique_ptr
Posté le 25-10-2009 à 20:00:25  profilanswer
 

ouasi enfin, on peut faire pareil sans

mood
Publicité
Posté le 25-10-2009 à 20:00:25  profilanswer
 

n°1935276
Glock 17Pr​o
Posté le 25-10-2009 à 20:28:06  profilanswer
 

ok donc QT in finé  c'est moisie, c'est ça qu'il faut retenir ?


---------------
.
n°1935280
Joel F
Real men use unique_ptr
Posté le 25-10-2009 à 21:24:49  profilanswer
 

non, ca fait sont boulot. Juste que c'est totu sauf du C++ moderne

n°1935288
Glock 17Pr​o
Posté le 25-10-2009 à 21:59:37  profilanswer
 

qu'est ce qui caractérise le C++ moderne ? la liste est trop longue ?


---------------
.
n°1935289
masklinn
í dag viðrar vel til loftárása
Posté le 25-10-2009 à 22:00:10  profilanswer
 

Le jugement que je vois souvent, et qui semble correspondre à ce qu'en pense Joel F, est que Qt fournit pas mal d'APIs vraiment sympas et agréables à utiliser, mais que l'implémentation est plus douloureuse quand tu regardes comment ça fonctionne sous le chrome.

 

(par contre je pense aussi que la déclaration de Joel F comme quoi Qt est "codé avec les pieds" est spécieuse: le développement de Qt a été lancé en 1991, faut voir la gueule des compilos C++ de l'époque et je doute qu'il y ait eu une réécriture complète depuis donc les principes et bases de l'époque sont toujours là)

Message cité 1 fois
Message édité par masklinn le 25-10-2009 à 22:02:47

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1935292
Joel F
Real men use unique_ptr
Posté le 25-10-2009 à 22:34:55  profilanswer
 

masklinn a écrit :


Le jugement que je vois souvent, et qui semble correspondre à ce qu'en pense Joel F, est que Qt fournit pas mal d'APIs vraiment sympas et agréables à utiliser, mais que l'implémentation est plus douloureuse quand tu regardes comment ça fonctionne sous le chrome.


Voila
 

masklinn a écrit :


(par contre je pense aussi que la déclaration de Joel F comme quoi Qt est "codé avec les pieds" est spécieuse: le développement de Qt a été lancé en 1991, faut voir la gueule des compilos C++ de l'époque et je doute qu'il y ait eu une réécriture complète depuis donc les principes et bases de l'époque sont toujours là)


tu sais bien que spécieux c'est mon deuxième prénom :o
Avoir commencé en 1991 ne les dispensaient pas de refactoriser/moderniser de temps en temps non ?

n°1935425
Aiua
PSN : Aiua / GT : Aiua42
Posté le 26-10-2009 à 15:24:59  profilanswer
 

Joel F a écrit :


tu sais bien que spécieux c'est mon deuxième prénom :o
Avoir commencé en 1991 ne les dispensaient pas de refactoriser/moderniser de temps en temps non ?


ben faut faire des choix, soit tu supportes plus d'OS, tu proposes plus d'API... soit tu modernises les parties qui fonctionnent (et encore, j'suis pas sur qu'il faille pas se débarasser d'un certain nombre de compilos encore supportés par Qt pour le faire)
 
cela dit, dire que Qt est codé avec les pieds, pour moi ça reste du troll poilu


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
n°1935495
Joel F
Real men use unique_ptr
Posté le 26-10-2009 à 17:37:49  profilanswer
 

Aiua a écrit :


ben faut faire des choix, soit tu supportes plus d'OS, tu proposes plus d'API... soit tu modernises les parties qui fonctionnent (et encore, j'suis pas sur qu'il faille pas se débarasser d'un certain nombre de compilos encore supportés par Qt pour le faire)


Ouasi enfin bon, tu peut faire tout en parallele aussi. Ca les tuerais pas d'avoir un branches modern/ dans leur SCV préféré.
 

Aiua a écrit :


cela dit, dire que Qt est codé avec les pieds, pour moi ça reste du troll poilu


Le terme est mal choisi mais d'experience il s'interface mal avec pas mal de composants standards et à des comportements inintuitifs aevc d'autres c'ets tout.

n°1935503
masklinn
í dag viðrar vel til loftárása
Posté le 26-10-2009 à 17:52:26  profilanswer
 

Joel F a écrit :

Ouasi enfin bon, tu peut faire tout en parallele aussi.


Dans le monde réel, t'es toujours limité en ressources et il faut prioriser. Si pour autant que Trolltech soit concerné le code Qt existant fonctionne et fait ce qu'ils demandent sans leur coûter des sommes faramineuses à maintenir et à étendre, ils n'avaient pas de raison de le réécrire (et perdre des années, et probablement tout pêter) juste pour s'amuser et faire plaisir à 3 gars sur un forum et 2 mailing lists [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1935507
Aiua
PSN : Aiua / GT : Aiua42
Posté le 26-10-2009 à 17:59:58  profilanswer
 

Joel F a écrit :


Ouasi enfin bon, tu peut faire tout en parallele aussi. Ca les tuerais pas d'avoir un branches modern/ dans leur SCV préféré.

certes, après c'est une question de ressources
cela dit, c'est du LGPL maintenant, donc rien n'empêche quiconque de la faire cette dite branche, si Nokia n'est pas motivé :D
 

Joel F a écrit :


Le terme est mal choisi mais d'experience il s'interface mal avec pas mal de composants standards et à des comportements inintuitifs aevc d'autres c'ets tout.


quelle idée d'utiliser d'autres composants, y a tout dans Qt :o
 

Spoiler :

je blague hein :D
enfin à moitié, parce qu'il arrive qd même fréquemment qu'on puisse tout faire avec Qt, mais je suis d'accord que le toolkit a parfois du mal à s'entendre avec ses petits camarades :jap:


 
'fin c'est peut être par manque d'expérience, mais pour l'instant, j'ai pas trouvé d'autre toolkit aussi agréable à utiliser en C++ :)


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
n°1935523
Joel F
Real men use unique_ptr
Posté le 26-10-2009 à 18:42:14  profilanswer
 

A mais, si le tiers des biblio tierces était comme Qt en terme de qualité d'interface, ca serait 'achement bien. Je critique l'impl. c'est tout.

n°1935524
esox_ch
Posté le 26-10-2009 à 18:50:59  profilanswer
 

Désolé de m'immiscer dans une discussion dans laquelle je ne connais pas grand chose, mais j'aimerais bien poser une question :o
 
Joel, tu dis que l'implémentation de Qt est pas terrible, mais n'est-ce pas un peu la même chose pour l'implémentation de tout "gros truc" devenu tellement énorme que plus personne n'a le temps/les ressources/les compétences pour pouvoir décider de lancer une restructuration?
 
ça me vient à l'esprit parce qu'il y a quelques temps je lisait un troll quelque part qui disait que le kernel de Linux est plein de bouts de code cradissimes, genre des boucles "for" pour créer des délais & co


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1935531
Joel F
Real men use unique_ptr
Posté le 26-10-2009 à 19:35:54  profilanswer
 

esox_ch a écrit :


Joel, tu dis que l'implémentation de Qt est pas terrible, mais n'est-ce pas un peu la même chose pour l'implémentation de tout "gros truc" devenu tellement énorme que plus personne n'a le temps/les ressources/les compétences pour pouvoir décider de lancer une restructuration?


 
Bah je croyais que le libre et le ouvert c'etait fait pour ? Mais quand il faut mettre les mains dans le cambouis, y a plus personne ?
Boost est un gros truc, et je peut te dire qu'on parle plein de fois de reecrire des pans entier à interface constante.  
 
Après pour pas passer pour un yakafokon, je repéte que je donnais juste mon avis d'utilisateur qui a du un jour devoir ouvrir un .cpp de Qt pour comprendre un bug infame dan sune appli mi MPI, mi pthread, mi Qt et d'avoir pleurer.  [:absolutelykaveh]

n°1935533
esox_ch
Posté le 26-10-2009 à 19:43:55  profilanswer
 

Joel F a écrit :


 
Bah je croyais que le libre et le ouvert c'etait fait pour ? Mais quand il faut mettre les mains dans le cambouis, y a plus personne ?
Boost est un gros truc, et je peut te dire qu'on parle plein de fois de reecrire des pans entier à interface constante.  
 
Après pour pas passer pour un yakafokon, je repéte que je donnais juste mon avis d'utilisateur qui a du un jour devoir ouvrir un .cpp de Qt pour comprendre un bug infame dan sune appli mi MPI, mi pthread, mi Qt et d'avoir pleurer.  [:absolutelykaveh]


 
Tu dis qu'on en parle souvent, mais est-ce que ça se fait à la fin? Parce que justement c'est là qu'on trouve un gros effet "yakafokon" comme tu dis.
 

Spoiler :


ça devait quand même être un gros projet le tien pour qu'il contienne 3 moitiés (  mi MPI, mi pthread, mi Qt )


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1935534
Joel F
Real men use unique_ptr
Posté le 26-10-2009 à 19:47:27  profilanswer
 

esox_ch a écrit :


Tu dis qu'on en parle souvent, mais est-ce que ça se fait à la fin? Parce que justement c'est là qu'on trouve un gros effet "yakafokon" comme tu dis.


 
La 1.37 a restructuré toutes les libs systemes (ficheirs, memoire aprtagées, asio) pour les rendre interoperables, la 1.40 a restructuré les ficheirs pr preparer la venue du build par CMake, je bosse sur la fusion lambda/Phoenix pour la 1.42 ...
 

esox_ch a écrit :


ça devait quand même être un gros projet le tien pour qu'il contienne 3 moitiés (  mi MPI, mi pthread, mi Qt )


Ouais, façon de parler quoi.

n°1935536
Aiua
PSN : Aiua / GT : Aiua42
Posté le 26-10-2009 à 19:59:43  profilanswer
 

Joel F a écrit :


Bah je croyais que le libre et le ouvert c'etait fait pour ? Mais quand il faut mettre les mains dans le cambouis, y a plus personne ?
Boost est un gros truc, et je peut te dire qu'on parle plein de fois de reecrire des pans entier à interface constante.  
 
Après pour pas passer pour un yakafokon, je repéte que je donnais juste mon avis d'utilisateur qui a du un jour devoir ouvrir un .cpp de Qt pour comprendre un bug infame dan sune appli mi MPI, mi pthread, mi Qt et d'avoir pleurer.  [:absolutelykaveh]


Qt c'est "vraiment" libre et ouvert (dans le sens où n'importe qui peut contribuer sans pb) depuis vraiment pas longtemps (le passage en LGPL et les dépôts publiques), faut laisser le temps que ça se mette en place, mais la politique de Nokia laisse penser que ça pourrait s'améliorer de ce coté là
 
sinon je pense que tu sais que pour mettre les mains dans le cambouis il faut la compétence et le temps, et même si n'importe qui peut contribuer au noyau linux par exemple, tout le monde n'a pas les ressources pour le faire
 
après je suis d'accord que sur certains cas, Qt peut sûrement poser des problèmes, mais dire tel quel que c'est codé avec les pieds comme tu l'as dit, ça pouvait laisser penser à qq1 qui ne s'en serait jamais servi et qui passerait par là qu'il vaudrait mieux éviter Qt, alors que dans 90% des cas ça répond parfaitement aux besoins, c'est pour ça que je me suis permis de dire que tu trollais.


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
n°1935553
Joel F
Real men use unique_ptr
Posté le 26-10-2009 à 21:36:46  profilanswer
 

j'ai du oublier le :o de service alors

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  qt et parallélisation

 

Sujets relatifs
MPI et parallélisationparallélisation sur un "cluster"
Parallèlisation d'un programme avec MPICH[JAVA] Parallelisation
[VB] gestion des process / parallélisation de procédures 
Plus de sujets relatifs à : qt et parallélisation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR