2010-07-31 15 views
4

Supposons que vous ayez écrit un code C++ portable qui fonctionne correctement sur différentes plates-formes. Pour apporter des modifications afin d'optimiser les performances, vous utilisez l'assemblage en ligne dans votre code. Est-ce une bonne pratique (optimisation du compilateur mis de côté) ou va-t-il poser des problèmes de portabilité?L'assemblage en ligne perturbe-t-il la portabilité?

Répondre

6

De toute évidence, l'assemblage en ligne n'est même pas proche de portable. Pour maintenir la portabilité du tout, vous devez généralement utiliser un #ifdef (ou quelque chose sur cet ordre) pour déterminer quand l'utiliser du tout.

Ma propre préférence est de séparer le langage d'assemblage dans un fichier séparé, et dans le fichier makefile décider s'il faut construire la version portable ou la version en langage assembleur.

+1

Notez aussi que ce bit de code a été le goulot d'étranglement prouvé sur une plate-forme, et juste parce que vous avez réussi à améliorer les performances sur cette plate-forme par codage assembleur, ne signifie pas que l'une ou l'autre de ces choses sera vrai sur une autre plate-forme. Ainsi, le code original est toujours la première tentative sur une nouvelle plate-forme, jusqu'à ce qu'il soit correctement profilé. –

13

Évidemment, cela brise la portabilité - le code ne fonctionnera que sur l'architecture spécifique pour laquelle le langage d'assemblage est destiné. En outre, c'est normalement une perte de temps - l'optimiseur du compilateur est presque certainement mieux à écrire le code assembleur que vous êtes.

+0

"l'optimiseur du compilateur est presque certainement meilleur pour écrire le code assembleur que vous êtes." - Malheureusement, il suffit d'allumer des choses comme SIMD peut être une tâche presque aussi difficile que d'écrire un peu de code assembleur ;-) –

+0

@Steve D'accord - presque certainement mieux que je suis, alors. –

+0

Il y a peu (très peu) d'humains autour qui soient meilleurs à l'assemblage que le compilateur. Même s'il y avait une optimisation, il est probable qu'une nouvelle version du compilateur inclura bientôt cette optimisation et donc recompiler simplement votre code vous donnera un meilleur code (alors que l'assemblage doit être maintenu en permanence). –

2

Cela dépend.

Si vous avez seulement un assemblage x86, votre application ne fonctionnera jamais sur ARM et x64 natif. Pour résoudre ce problème, vous pouvez l'entourer de # ifdef selon l'architecture. C'est l'approche multi-plateforme, les bibliothèques hautement optimisées telles que l'utilisation h264. Dans la plupart des cas, cependant, cela n'en vaut pas la peine. Utilisez juste C très spécifique et il se comportera très semblable à l'assemblage natif.

+1

À mon humble avis, une meilleure solution consiste à placer les fonctions avec le langage d'assemblage dans des fichiers sources de langage d'assemblage distincts. Laissez le processus de construction choisir les fichiers sources corrects en fonction de la plate-forme cible. –

2

L'autre choix évident est d'implémenter uniquement l'assemblage en ligne sur certaines architectures, et de conserver le C++ original (non optimisé) pour toute autre architecture, plutôt que d'essayer de générer l'assemblage pour toutes les architectures. (Convenablement #ifdefed, bien sûr.) Ensuite, vous bénéficiez de l'optimisation de l'architecture unique, avec la fonctionnalité de base sur tous.

Cependant, lorsque nous l'avons fait sur des projets sur lesquels j'ai travaillé par le passé, c'était la pire partie à maintenir - un autre morceau de code changeait, et exactement ce qui était passé dans la fonction isolée (s) changerait, et le C++ original et l'assemblage ne correspondraient plus, et il y avait beaucoup de gémissements et de grincements de dents.