Question

J'ai écrit un programme multi-thread qui effectue des calculs lourds en CPU avec beaucoup d'opérations en virgule flottante. Plus spécifiquement, c'est un programme qui compare les séquences d'animation image par image. C'est à dire. il compare les données d'image de l'animation A avec toutes les images de l'animation B, pour toutes les images de l'animation A. J'effectue cette opération intensive pour différentes animations en parallèle afin que le programme puisse fonctionner sur les paires AB, BC et CA dans parallèle. Le programme utilise QtConcurrent et une "carte". fonction qui mappe un conteneur avec des mouvements sur une fonction. QtConcurrent gère le pool de threads pour moi. Je travaille sur un processeur Intel Quad Core afin de générer 4 threads.

Le problème est que mon processus détruit mon processeur. L’utilisation est constante à 100% et j’obtiens un écran bleu de la mort si je lance mon programme sur un nombre de mouvements suffisant (défaut de page dans une zone non paginée). Je soupçonne que c'est parce que mon ordinateur est overclocké. Cependant, cela pourrait-il être dû à la façon dont j'ai codé mon programme? Certains outils de benchamrking très intensifs que j’avais utilisés pour tester la stabilité de ma machine ne se sont jamais effondrés sur mon PC. Est-il possible de contrôler la manière dont mon programme utilise mon processeur pour réduire la charge? Ou peut-être que je ne comprends pas bien mon problème?

Était-ce utile?

La solution

Il existe d'excellentes réponses ici.

J'ajouterais simplement que, dans la perspective d'avoir effectué de nombreux ajustements de performances, à moins que chaque thread ait été optimisé de manière agressive, il y a de fortes chances qu'il ait beaucoup de place pour une réduction de cycle.

Pour faire une analogie avec une course automobile longue distance, il existe deux façons de gagner:

  1. Rendre la voiture plus rapide
  2. Faites moins d’arrêts et de déplacements en parallèle

D'après mon expérience, la plupart des logiciels initialement écrits sont assez éloignés de la route la plus directe, surtout à mesure que le logiciel prend de l'ampleur.

Comme l'a dit Kenneth Cochran, il ne faut jamais deviner. Si vous corrigez quelque chose sans avoir prouvé que c'est un problème, vous investissez dans une conjecture.

Le moyen le plus utilisé pour rechercher des problèmes de performances consiste à utiliser des profileurs.

Cependant, je le fais souvent et ma méthode est la suivante: http: //www.wikihow.com/Optimize-Your-Program%27s-Performance

Autres conseils

L’overclocking de PC peut entraîner toutes sortes de problèmes étranges. Si vous pensez que cela est la cause première de votre problème, essayez de le cadencer dans des intervalles raisonnables et relancez vos tests.

Cela pourrait également être une sorte de bug de mémoire assez étrange dans lequel vous corrompriez votre RAM de manière à ce que Windows (je suppose que ce système d’exploitation, à cause de BSOD) ne puisse plus récupérer (très peu probable, mais qui sait).

Une autre possibilité à laquelle je peux penser est que vous avez une erreur dans votre implémentation du threading qui tue Windows.

Mais au début, je regarderais le problème de l'overclocking ...

le type d'opération que vous avez décrit est déjà hautement parallélisable. L'exécution de plusieurs tâches peut en réalité nuire aux performances . La raison en est que la taille du cache d’un processeur est limitée et que plus vous essayez d’en faire simultanément, plus la part de cache de chaque thread est réduite.

Vous pouvez également examiner les options utilisant votre GPU pour absorber une partie de la charge de traitement. Les GPU modernes sont beaucoup plus efficaces pour la plupart des types de transformation vidéo que les processeurs de générations similaires.

  

Je pense que c'est parce que mon ordinateur est overclocké.

C'est certainement possible. Essayez de le régler à la vitesse normale pendant un moment.

  

cela pourrait-il être dû à la façon dont j'ai codé mon programme?

Il est très peu probable qu'un programme exécuté en mode utilisateur provoque un BSOD.

A priori, je dirais que vous n’utilisez pas une machine à 3 cœurs (ou 4, pour un usage à 100%), et la parallélisation nuira à votre performance si vous utilisez plus de threads que de cœurs. Créez un seul thread par cœur de processeur et, quoi que vous fassiez, ne accédez jamais aux données en même temps par différents threads . Les algorithmes de verrouillage de cache de la plupart des processeurs multicœurs vont absolument abattre vos performances. Dans ce cas, j'utiliserais le fil 1 sur les images 0- (L / N), le fil 2 sur les images (L / N) - (2 * L / N), (2 * L / N), traitant les animations L-frame CPU. .. enfilez N sur les cadres ((N-1) * L / N) -L. Faites les différentes combinaisons (A-B, B-C, C-A) en séquence de façon à ne pas écraser votre cache. De plus, cela devrait être plus simple à coder.

En note de côté? De véritables calculs comme celui-ci devraient utiliser 100% de l’UC, cela signifie que ça va aussi vite que possible.

L’overclocking est la cause la plus probable de l’instabilité. Avec n'importe quel algorithme gourmand en ressources CPU, il y aura une panique de CPU. Malgré l'overclocking, je trouverais un bon profileur de performances pour détecter les goulots d'étranglement. Ne jamais deviner où est le problème. Vous pourriez passer des mois à optimiser quelque chose qui n’a pas d’effet réel sur les performances, voire une dégradation des performances.

Il est trop facile de blâmer le matériel. Je vous suggère d’essayer d’exécuter votre programme sur un système différent et de voir comment cela se passe avec les mêmes données.

Vous avez probablement un bug.

Cherchez à utiliser les opérations SIMD. Je pense que vous voudriez SSE dans ce cas. Ils constituent souvent un meilleur premier pas que la parallélisation, car ils sont plus faciles à corriger et fournissent un coup de pouce considérable à la plupart des opérations de type algèbre linéaire.

Une fois que vous l'avez obtenu avec SIMD, examinez la parallélisation. On dirait que vous claquez également le processeur, alors vous pourriez peut-être vous arrêter en dormant au lieu d'attendre, et assurez-vous de nettoyer ou de réutiliser correctement les threads.

En l'absence du code d'erreur BSOD (utile pour rechercher), il est un peu plus difficile de vous aider avec celui-ci.

Vous pourriez peut-être essayer de rétablir physiquement votre mémoire ((retirez-la et déposez-la dedans). Moi et quelques-uns de mes connaissances, nous avons travaillé sur quelques machines où cela était nécessaire. Par exemple, j’ai par exemple essayé de mettre à niveau OS X une machine et elle ne cessait de tomber en panne ... enfin, j'ai sorti la mémoire et l'ai replacée dans la machine et tout allait bien.

Dormir (1); va réduire l'utilisation du processeur de moitié. J'ai rencontré le même problème avec un algorithme gourmand en ressources CPU.

Si votre processeur a deux cœurs ou plus, vous pouvez accéder au gestionnaire de tâches, aux processus, cliquer avec le bouton droit de la souris sur le nom du programme, cliquer sur Définir l'affinité et définir le programme pour qu'il utilise moins de cœurs.

Les actions demandées prendront alors plus de temps, mais entraîneront une diminution importante de l'utilisation du processeur.

Je pense qu'un écran bleu de la mort est provoqué lorsque la région de la mémoire du noyau est corrompue. Donc, utiliser le multithreading pour effectuer des opérations parallèles ne pourrait pas en être la raison.

Eh bien, si vous créez plusieurs threads comportant chacun des opérations en virgule flottante lourdes, l'utilisation de votre processeur atteindra à 100%.

Il serait préférable de pouvoir dormir un peu dans chaque fil de discussion afin que les autres processus aient une chance. Vous pouvez également essayer de réduire la priorité des threads.

Si vous utilisez la plate-forme Windows, mettez après un travail un appel à la fonction pour informer le processeur que vous souhaitez confier le processeur à d'autres processus. Appelez en mode veille comme ceci:

Slepp (0);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top