Combien d'efforts avez-vous mettre pour obtenir des gains de l'utilisation SSE?

StackOverflow https://stackoverflow.com/questions/2623566

  •  26-09-2019
  •  | 
  •  

Question

Un cas

Disons que vous avez une petite classe:

class Point3D
{
private:
  float x,y,z;
public:
  operator+=()

  ...etc
};

Point3D &Point3D::operator+=(Point3D &other)
{
  this->x += other.x;
  this->y += other.y;
  this->z += other.z;
}

Une utilisation naïve de l'ESS serait tout simplement remplacer ces organes de fonction à l'aide de quelques intrinsics. Mais devrions-nous attendre à ce faire beaucoup de différence? MMX utilisé pour impliquer l'État coûteux cahnges IIRC, ne SSE ou sont-ils tout comme les autres instructions? Et même s'il n'y a pas directe « utiliser SSE » en tête, se déplaçant les valeurs dans les registres de l'ESS et sortez à nouveau faire vraiment plus vite?

Deuxième cas

, vous au lieu de travailler avec une base de code moins basé OO. Au lieu d'un tableau / vecteur d'objets Point3D, il vous suffit d'un grand choix de flotteurs:

float coordinateData[NUM_POINTS*3];

void add(int i,int j) //yes it's unsafe, no overlap check... example only
{
  for (int x=0;x<3;++x)
  {
    coordinateData[i*3+x] += coordinateData[j*3+x];
  }
}

Qu'en est-utilisation de l'ESS ici? Mieux?

En conclusion

tente d'optimiser les opérations simples de vecteur à l'aide SSE réellement utile, ou est-ce vraiment que lorsque vous faites des opérations précieux en vrac?

Était-ce utile?

La solution

En général, vous aurez besoin de prendre des mesures supplémentaires pour tirer le meilleur parti de l'ESS (ou toute autre architecture SIMD):

  • besoins de données à être alignés (idéalement) 16 octets

  • besoins de données à être contigus

  • vous avez besoin suffisamment de données pour rendre l'opération SIMD utile

  • vous devez soudent autant d'opérations que vous pouvez pour réduire les coûts des charges / magasins

  • vous devez être conscient du cache / hiérarchie mémoire et son impact sur les performances (par exemple bande mining utilisation / carrelage)

Autres conseils

il est utile si votre cas est-que vous faites beaucoup de mêmes calculs sur la gamme de données. par exemple calculer des racines carrées de beaucoup d'équations-. vous pouvez charger 4 valeurs dans les registres sse et les opérations d'appel une fois. cela augmentera les performances de 4.

et il y a des bibliothèques qui ont tous l'optimisation des sse à l'intérieur. ne vélo pas réinventé.

Gamasutra article montre ce qu'il faut pour faire rapide SSE Code basé. Il couvre votre « cas 1 » en détail.

Le code source est disponible à partir de page d'accueil .

J'ai essayé un cas au travail il y a quelques années et le gain de performance était à peine mesurable. En fin de compte, j'ai décidé de sauter depuis tous les tracas avec l'alignement de tous les Point3D sur les limites de 16 octets fait pas la peine.

Comme vous l'avez correctement SSE l'aurez deviné est le plus adapté aux opérations en vrac où ils peuvent donner une assez bonne vitesse vers le haut. Avant d'aller de l'avant et d'utiliser le chèque de l'ESS ce code, le compilateur génère déjà. Je sais par expérience que, par exemple, Visual Studio est assez bon à l'aide de l'ESS-optimisations.

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