|
Bas de page | |
---|---|
Auteur | Sujet : Optimisation et multi-thread en C |
Mourfizbak | Bonjour à tous !
Message cité 1 fois Message édité par Mourfizbak le 22-02-2012 à 12:15:18 |
Publicité | Posté le 22-02-2012 à 12:13:47 |
in_your_phion | Cela vient peut être de ton algorithme .. Tu dois pouvoir stocker des données en RAM et écrire seulement à la fin. Mais ça dépend combien tu veux stocker. Autrement, je te suggérerais de revoir ton algo et essayer déjà dans un premier temps de l'optimiser. Si ça se trouve, tu fais des copies inutiles dans tous les sens. Enfin, tu peux utiliser Valgrind et KcacheGrind qui te permettrons de faire un diagnostic précis pour voir où ton programme passe le plus clair de son temps et si tu peux modifier quelque chose. http://kcachegrind.sourceforge.net [...] GrindIndex sinon pour le multithread, ça dépend si tu peux paralléliser certaines taches ou pas ? d'autres membres du forum serons peut être plus expert que moi... Message édité par in_your_phion le 22-02-2012 à 12:54:03 |
in_your_phion |
tu as peut être des données que tu peux pré calculer ? ou charger au démarrage en mémoire plutôt que de faire des fread() dans tous les sens en cours d’exécution....
pour les threads, je suis pas spécialiste ... il me semble que dans l’idéal tu peux en affecter un à chaque cœur (donc idéalement autant de thread que de coeur) un truc important est aussi de mettre correctement les affinités et la priorités des threads. Quels threads tu affectes à quel coeur, et quel priorité ils ont. http://linux.die.net/man/2/sched_setaffinity enfin tu as des librairies du types intel thread building blocks qui sont bien je crois, si tu choisis de faire plusieurs threads Message édité par in_your_phion le 22-02-2012 à 14:57:01 |
Mourfizbak |
|
shaoyin | Si tu bosses sous Ubuntu, tu peux monter un répertoire en tmpfs et travailler dans ce répertoire pour tes écritures de fichiers. Concrètement, cela te permet de travailler sur une zone en RAM comme s'il s'agissait d'un répertoire, donc avec des lectures/écritures comme si tu manipulais des fichiers. L'avantage, c'est que cela ne devrait pas avoir beaucoup d'impact dans ton programme.
|
in_your_phion |
D'une manière générale, les temps d'accès au disque dur sont trèèèès longs ... Il faut donc que tu évites à maximum de faire les lectures ou des écritures sur le disque. Par exemple, tu fais au début une lecture et tu stockes tout dans des "variables" de ton programme, donc en RAM qui est beaucoup plus rapide d'accès que les DD. A la fin de ton programme tu peux écrire des fichiers. Mais faire des lectures/écritures sur un disque dur sera pénalisant si c'est intensif et au coeur de ton algorithme.
tu peux aussi essayer de faire plutôt des allocations sur la pile que sur le tas. Ce sera toujours moins rapide de faire une allocation "dynamique" comme le nom l'indique que d'allouer une variable de manière automatique car tu incrémentes juste un pointeur dans ce cas. Tu peux également vérifier que tu passes les objets par pointeurs à tes fonctions et non pas par copie ... auquel cas c'est inutile et prendra "du temps". Enfin tu dis que tu utilises des images, déclarer un tableau 1D est plus rapide au niveau des accès qu'un tableau 2D.
est équivalent à
Message cité 1 fois Message édité par in_your_phion le 23-02-2012 à 11:01:33 |
Mourfizbak |
|
in_your_phion |
Bad idea, à mon avis.
tu as un exemple de boucle ?
normalement oui, tu as juste à stocker les valeurs dans des variables pendant que ton programme s’exécute. Ce sera chargé en RAM. Tu es limité à 2Go de mémoire par processus si tu es sur un processeur 32 bits. Message édité par in_your_phion le 23-02-2012 à 12:11:31 |
Publicité | Posté le 23-02-2012 à 12:11:17 |
gilou ModérateurModzilla |
Si tu fais ça pour chaque pixel et que tu en as 1 million, ça fait 11 million d'opération d'I/O environ (bon, un peu moins si tes fichiers sont bufferisés, mais quand même. Et le pragma de parallélisation ne sert a rien ici, puisque les opérations d'I/O de lecture écriture positionnement disque ne sont pas parallélisables. sinogramme? c'est des caractères chinois? Tu vas faire un truc de ce genre ci: subsino1 = fopen( nom1 , "r" ) ; et ça devrait améliorer les choses. A+, Message cité 1 fois Message édité par gilou le 23-02-2012 à 13:46:05 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
in_your_phion |
c'est clairement là dedans que tu perds du temps je pense. Tu ne devrais pas faire le travail de ton algorithme en piochant les valeurs dans des fichiers... C'est sûr que ce n'est du tout optimal. Par ailleurs tu fais des écritures avec fput() c'est pareil => long et non adapté. A mon sens, je ferais : Tu as essayé ça ? Je pense que ça ira bien plus vite ... Ton programme ne doit intégrer des accès I/O qu'au début et à la fin, pas dans ton algorithme ! Message édité par in_your_phion le 23-02-2012 à 14:40:42 |
Mourfizbak |
Message édité par Mourfizbak le 23-02-2012 à 13:55:56 |
gilou ModérateurModzilla | Vérifies les retours des mallocs pour vérifier que les allocations mémoires se passent bien.
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
Mourfizbak | Bonjour !
Message édité par Mourfizbak le 27-02-2012 à 10:04:26 |
Mourfizbak | Petite simplification du problème pour vous éviter la lecture de tout le topic depuis le début :
|
gilou ModérateurModzilla | 1) Tes fichier de données sont bien des fichiers binaires, écrits comme une suite d'ints, sans le moindre retour de ligne ou autre?
Message édité par gilou le 27-02-2012 à 12:16:33 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
Mourfizbak | 1) Pas de soucis pour les fichiers binaires, ils sont bien écrits comme une suite propre d'ints (puisque traités par ImageJ comme tel sans aucun soucis).
Message édité par Mourfizbak le 27-02-2012 à 12:25:07 |
shaoyin | Quel est le type de ta variable sz_subsino ? Tu as peut-être un dépassement de capacité à la ligne 76, qui fait que tu n'alloues pas la quantité qu'il faut ? Cela n'explique pas l'erreur de segmentation, mais c'est une source d'erreur.
Message cité 1 fois Message édité par shaoyin le 27-02-2012 à 13:11:38 |
gilou ModérateurModzilla |
Message cité 1 fois Message édité par gilou le 27-02-2012 à 13:39:58 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
Mourfizbak |
|
gilou ModérateurModzilla | Bon, pour voir si on peut encore améliorer cela, pourrais tu m'expliquer exactement comment tu procedes, ie les boucles
Message cité 1 fois Message édité par gilou le 27-02-2012 à 14:23:52 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
Mourfizbak |
Message édité par Mourfizbak le 27-02-2012 à 15:27:58 |
gilou ModérateurModzilla | Je regarde ça ce soir à tête reposée et je posterai des commentaires.
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
gilou ModérateurModzilla |
Sauf que le programme actuel fait la sommation sur les ss_originaux et non pas sur les ss_bootstrap si j'ai bien suivi (et les ss_bootstrap, inutile de les écrire sur disque, autant les garder en mémoire).
--------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
gilou ModérateurModzilla | Si pour un fichier en sortie, sommer 5 bootstraps générés successivement te convient, alors ceci n'est ni gourmand en I/O (on ne lit et n’écrit rien d'intermédiaire, tout est en mémoire)
Message édité par gilou le 28-02-2012 à 02:12:49 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
gilou ModérateurModzilla | Notes que la valeur de découpage lors de la génération des bootstraps, frame_size = 800; est maintenant en pixels et non plus en octet. --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
Mourfizbak | Bonjour,
Message édité par Mourfizbak le 29-02-2012 à 11:18:30 |
gilou ModérateurModzilla | Bonjour, pas de problème, c'est juste que mon code m'est plus lisible que le tien (je préfère faire des allocations dynamiques, car on peut écrire du code plus générique que le recopier en changeant un indice), mais je vois que tu en as saisi le principe.
Message édité par gilou le 29-02-2012 à 12:38:36 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
Mourfizbak | Merci encore une fois pour toutes ces corrections. Je n'avais absolument pas vu ces problèmes :-/
Message édité par Mourfizbak le 29-02-2012 à 13:13:45 |
gilou ModérateurModzilla | Si le fichier contient un multiple de 800 pixels, alors effectivement, ça explique pourquoi le code marchait sans pépin.
Message édité par gilou le 29-02-2012 à 13:51:36 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
Mourfizbak | Bonjour,
Message édité par Mourfizbak le 01-03-2012 à 11:07:06 --------------- Dans le doute, reboot, et si ça rate, formate ! |
gilou ModérateurModzilla |
Message édité par gilou le 01-03-2012 à 12:31:25 --------------- There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! -- |
Mourfizbak | Bonjour !
--------------- Dans le doute, reboot, et si ça rate, formate ! |
Publicité | Posté le |
Sujets relatifs | |
---|---|
[C#] WCF Routing et WIF | PHP->C# Besoin de conversion svp |
Compilation parser XML pour intégration à un code C | intégrer .lib dans un projet C# (VS Express 2010) |
[SQL] Optimisation de requête sql | besoin d'aide en C |
C++ : Jeu Damier (aide) | Programmation en C |
programme de VR sur le net (multi-plateforme) | vb6 + data environement + requetes multi paramètres |
Plus de sujets relatifs à : Optimisation et multi-thread en C |