L'ESS, intrinsèques, et l'alignement

J'ai écrit un vecteur 3D de classe à l'aide d'une beaucoup de l'ESS compilateur intrinsèques. Tout a bien fonctionné jusqu'à ce que j'ai commencé à démarrent des instances des classes ayant le vecteur 3D en tant que membre de de nouveau. J'ai vécu étrange se bloque en mode release, mais pas en mode debug et dans l'autre sens.

J'ai donc lu quelques articles et pensé que j'avais besoin d'aligner les classes de posséder un exemple de vecteur 3D de classe à 16 octets trop. Donc j'ai juste ajouté _MM_ALIGN16 (__declspec(align(16)) devant les classes comme suit:

_MM_ALIGN16 struct Sphere
{
    //....

    Vector3 point;
    float radius
};

Qui semble résoudre le problème au premier abord. Mais après la modification du code de mon programme a commencé à planter dans d'étranges façons de nouveau. J'ai cherché sur le web et trouvé un blog article. J'ai essayé ce que l'auteur, Ernst Chaud, fait pour résoudre le problème et ça fonctionne pour moi aussi. J'ai ajouté le nouveau et supprimer des opérateurs de mes classes comme ceci:

_MM_ALIGN16 struct Sphere
{
    //....

    void *operator new (unsigned int size)
     { return _mm_malloc(size, 16); }

    void operator delete (void *p)
     { _mm_free(p); }

    Vector3 point;
    float radius
};

Ernst mentionne que cette approche pourrait être problématique, mais il a juste des liens vers un forum qui n'existe plus, sans expliquer pourquoi il pourrait être problématique.

Donc mes questions sont:

  1. Quel est le problème avec la définition des opérateurs?

  2. Pourquoi n'est-il pas d'ajouter _MM_ALIGN16 à la définition de classe assez?

  3. Quelle est la meilleure façon de traiter les problèmes d'alignement à venir avec l'ESS intrinsèques?

  • Dans le premier cas, vous êtes répartition des structures sur la pile ou le tas? Je ne suis pas sûr malloc renvoie aligné mémoire par défaut, tandis que les _mm_malloc certainement ne serait - ce que voulez-vous dire par "après un moment, mon programme a commencé à planter de nouveau"? Voulez-vous dire après l'avoir quitté en cours d'exécution pour un peu (et ce qui était il en train de faire)?
  • Les problèmes ont commencé quand j'ai commencé à l'allocation de leurs structures sur le tas. Avec la "après un certain temps", phrase, je veux dire qu'il a commencé à s'écraser après j'ai changé le code. Je suppose que l'alignement a droite par accident, puis je l'ai détruite. Je pense que malloc n'a pas de retour de mémoire de 16 octets alignés qui est le problème, je suppose. Ma question est de savoir vraiment quel est le problème avec l'opérateur approche et quelle est la meilleure façon de gérer le code à l'aide de l'ESS intrinsèques.
  • En fait, vous n'avez pas besoin de spécifier l'alignement de Sphere (à l'aide de cette _MM_ALIGN16 chose), car le compilateur est assez intelligent pour voir que Sphere 16-alignés membre et ajuste automatiquement Sphere's l'alignement des exigences (étant donné que Vector3 est correctement aligné). C'est la raison pour laquelle vous n'avez pas explicitement à aligner Vector3 soit si elle a déjà un __m128 membre. C'est seulement l'allocation dynamique, c'est un problème et cela peut être surmonté par la surcharge operator new/delete, comme écrit dans le blog (et les autres choses, comme spécialisée std::allocator).
InformationsquelleAutor Jan Deinhard | 2012-09-19