2011-03-12 3 views
3

J'ai un programme C++ qui effectue un long calcul en parallèle en utilisant OpenMP. Maintenant, ce programme doit également répondre à l'entrée de l'utilisateur et mettre à jour certains graphiques. Jusqu'à présent, j'ai commencé mes calculs à partir du thread principal/interface graphique, en équilibrant soigneusement la charge de travail de sorte qu'il ne soit pas trop court pour masquer le temps de threading OpenMP ni trop long pour que l'interface graphique ne réponde plus.Gestion d'un thread graphique dans un programme utilisant OpenMP

De toute évidence, je voudrais résoudre ce problème en exécutant tout simultanément. Pour autant que je sache, OpenMP 2.5 ne fournit pas un bon mécanisme pour cela. Je suppose que ce n'était pas prévu pour ce type de problème. Je ne voudrais pas non plus dédier un noyau entier au thread de l'interface graphique, il a juste besoin de < 10% d'un pour son travail. Je pensais que peut-être séparer le calcul en un pthread séparé qui lance les constructions parallèles serait un bon moyen de résoudre ce problème. J'ai codé cela, mais OpenMP s'est écrasé lorsqu'il a été appelé à partir de pthread, similaire à ce bogue: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36242. Notez que je n'essayais pas de lancer des constructions parallèles à partir de plus d'un thread à la fois, OpenMP n'était utilisé que dans un pthread à travers le programme.

Il semble que je ne puisse ni utiliser OpenMP pour planifier mon travail GUI en même temps, ni utiliser pthreads pour que les constructions parallèles soient exécutées simultanément. Je pensais simplement gérer mon travail GUI dans un fil séparé, mais cela se révèle plutôt moche dans mon cas et pourrait ne pas fonctionner en raison des différentes bibliothèques que j'utilise.

Quelle est la solution du manuel ici? Je suis sûr que d'autres ont utilisé OpenMP dans un programme qui doit gérer simultanément une interface graphique/réseau, etc., mais je n'ai pas été en mesure de trouver des informations en utilisant Google ou le forum OpenMP.

Merci!

+0

Vous devez utiliser OpenMP? Vous pourriez simplement essayer d'utiliser pthreads pour tout et il serait facile d'avoir un thread "Display" et un thread "Computation". –

+1

Bien sûr, personne n'a * strictement * à * utiliser * OpenMP, mais je préfère résoudre ce problème et apprendre quelque chose qui abandonne simplement OpenMP et le remplace par un pool de threads géré manuellement plus bavard – ASD1

Répondre

0

Il n'y a pas de solution de manuel. L'application de manuels pour OpenMP est des programmes non interactifs qui lisent les fichiers d'entrée, font de lourds calculs et écrivent des fichiers de sortie, tous en utilisant le même pool de threads de taille ~ #CPUs dans votre supercalculateur. Il n'a pas été conçu pour l'exécution simultanée de code interactif et de calcul et je ne pense pas que l'interopérabilité avec une librairie de threads soit garantie par la spécification. En dehors de la théorie, il semble que vous ayez rencontré un bug dans l'implémentation GCC d'OpenMP. Veuillez déposer un rapport de bogue auprès des responsables GCC et, pour l'instant, recherchez un autre compilateur ou exécutez votre code GUI dans un processus séparé, en communiquant avec le programme OpenMP via un mécanisme IPC. (Par exemple, E/S asynchrones sur des sockets.)

+0

C'est en quelque sorte ce que j'attendais d'OpenMP. Mais dans votre exemple, comment pourrais-je réellement mettre en œuvre la communication avec mon programme GUI? J'aurais probablement besoin d'avoir un thread séparé pour exécuter mon mécanisme IPC de manière asynchrone, en synchronisant avec les threads OpenMP pour extraire les données, etc. Et cela semble me mettre exactement au même endroit que je suis déjà. a été fermé comme "RESOLVED INVALID", donc je ne pense pas que cela aiderait beaucoup à classer exactement le même problème. – ASD1

+0

@ ASD1: vous n'avez pas forcément besoin de threads pour les E/S asynchrones; vous pourriez essayer 'poll' /' select' et peut-être des signaux pour surveiller/tuer/redémarrer le programme principal, exécuter plusieurs instances, etc. Cela dépend simplement de la quantité d'interactivité requise. (Comme je l'ai dit, vous pouvez essayer un autre compilateur: Intel C++ peut être une option, bien que dans mon expérience, sa sortie fonctionne plutôt mal sur les cœurs AMD.) –

+0

Oui, je pourrais utiliser une méthode polling ou aysnc pour la communication énorme limitation de OpenMP me fera abandonner certainement pour mon programme actuel et probablement pour tous les travaux futurs.Je ne veux tout simplement pas être dans une situation où j'ai un programme entièrement fonctionnel et je dois réécrire le code de thread juste parce que je veux ajouter un thread graphique/réseau/etc. Ce qui est dommage, parce que je pensais qu'OpenMP était plutôt soigné. – ASD1

Questions connexes