Question

Je vais avoir un vrai problème étrange en utilisant GCC pour ARM avec les optimisations activées. Mon application C Compiler ++ sans les optimisations produit un exécutable lors de l'exécution en sortie les résultats escomptés. Dès que j'allume la optimisations - qui est -O1 - ma demande ne parvient pas à produire les résultats escomptés. J'ai essayé pendant quelques jours pour repérer le problème mais je suis désemparés. J'éliminé toutes les variables non initialisées de mon code, je corrigeais les endroits où aliasing stricte pourrait causer des problèmes mais je n'ai pas les résultats appropriés.

J'utilise GCC 4.2.0 pour ARM (le processeur est un ARM926EJ-s) et l'exécution de l'application sur une distribution Linux de MontaVista.

Voici les drapeaux que je utilise:

-O1 -fno-unroll-loops fno-merge-constants -fno-omit-frame-pointer -fno-toplevel-reorder \
-fno-defer-pop -fno-function-cse -Wuninitialized -Wstrict-aliasing=3 -Wstrict-overflow=3 \
-fsigned-char -march=armv5te -mtune=arm926ej-s -ffast-math

Dès que je bande le drapeau -O1 et recompilation / réassocier l'application I obtenir les résultats de sortie appropriés. Comme vous pouvez le voir sur les drapeaux j'ai essayé de désactiver toute optimisation, je pensais que cela pourrait causer des problèmes, mais toujours pas de chance.

quelqu'un n'a aucune indications sur la façon dont je pourrais encore résoudre ce problème?

Merci

Était-ce utile?

La solution

D'une manière générale, si vous dites « casse optimisation mon programme », il est de 99,9% votre programm qui est cassé. Activation des optimisations que découvre les défauts dans votre code.

Vous devriez aussi aller simple sur les options d'optimisation. Seulement dans des circonstances très spécifiques vous besoin d'autre chose au-delà des options standard -O0, -O2, et peut-être -O3 -OS. Si vous vous sentez faire besoin des paramètres plus précis que cela, tenez compte de mantra des optimisations:

Mesure, Optimize, mesure.

Jamais aller par "feeling" ici. Prouver qu'une certaine option d'optimisation non standard ne bénéficie considérablement votre application, et comprendre pourquoi (à savoir, comprendre exactement ce que cette option fait et pourquoi elle affecte votre code).

Ce n'est pas un bon endroit pour naviguer les yeux bandés.

Et de voir comment vous utilisez l'option la plus défensive (-O1), puis désactiver une demi-douzaine d'optimisations, et puis ajouter -ffast-math, me conduit à supposer que vous faites actuellement juste que .

Eh bien, peut-être un borgne.

Mais la ligne de fond est la suivante:. Si l'activation de l'optimisation casse votre code, il est plus probable de la faute de votre code

EDIT: Je viens de trouver cela dans le manuel GCC:

  

-ffast-math: Cette option ne devrait jamais être activée par une option -O    car elle peut entraîner une sortie incorrecte pour les programmes qui dépendent   une application exacte des règles IEEE ou ISO / spécifications pour les mathématiques   les fonctions.

Cela ne dit, au fond, que votre -O1 -ffast-math pourrait en effet briser correcte code. Cependant, même si enlever -ffast-math supprime votre problème actuel, vous devriez au moins avoir une idée pourquoi . Sinon, vous pouvez simplement échanger votre problème maintenant avec un problème à un moment plus pratique plus tard (comme, quand vos pauses produit à l'emplacement de votre client). Est-il vraiment -ffast-math qui était le problème, ou avez-vous cassé le code mathématique qui est découvert par -ffast-math?

Autres conseils

-ffast-math doit être évitée si possible. Il suffit d'utiliser -O1 pour l'instant et laisser tomber tous les autres commutateurs d'optimisation. Si vous voyez toujours des problèmes alors le temps de pour démarrer le débogage.

Sans voir votre code, il est difficile d'être plus précis que « vous avez probablement un bug ».

Il existe deux scénarios où permettant des optimisations modifie la sémantique du programme:

  • il y a un bogue dans le compilateur, ou
  • il y a un bug dans votre code.

Ce dernier est probablement le plus probable. Plus précisément, vous comptez probablement quelque part du comportement non défini dans votre programme. Vous comptez sur quelque chose qui juste pour arriver à être vrai lorsque vous compilez en utilisant ce compilateur sur ce ordinateur avec ces drapeaux du compilateur, mais qui n » t garanti par la langue. Ainsi, lorsque vous activez les optimisations, GCC n'est pas tenu de conserver ce comportement.

Montrez-nous votre code. Ou une étape dans le débogueur jusqu'à ce que vous obtenez au point où les choses vont mal.

Je ne peux pas être plus précis. Il pourrait être un pointeur ballants, les variables non initialisées, brisant les règles d'aliasing, ou même faire juste une des nombreuses choses que les résultats undefined rendement (comme i = i++)

Essayez de faire un test minimal. Réécrire le programme, la suppression des choses qui ne touchent pas l'erreur. Il est probable que vous découvrirez le bug vous-même dans le processus, mais si vous ne le faites pas, vous devriez avoir un programme d'exemple un écran peut après.

Soit dit en passant, si , comme d'autres ont émis l'hypothèse, il est -ffast-math qui provoque votre problème (c.-à-compilation avec juste -O1 fonctionne très bien), alors il est probable que vous avez un peu de mathématiques là-bas, vous devriez réécrire toute façon . Il est un peu une simplification, mais -ffast-math permet au compilateur de calculs essentiellement Réorganiser que vous pourriez nombres mathématiques abstraits - même si le faire sur le matériel réel peut causer des résultats légèrement différents puisque les nombres à virgule flottante ne sont pas exactes. En se fondant sur ce genre de détail flottant point est susceptible d'être accidentelle.

Si vous voulez comprendre le bug, un test cas minimal est essentiel dans tous les cas.

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