Moyen le plus rapide pour faire horizontale float somme vectorielle sur x86

Vous avez un vecteur de trois (ou quatre) flotte. Quel est le moyen le plus rapide pour faire la somme d'eux?

Est ESS (movaps, mélanger, ajouter, movd) toujours plus vite que x87? Sont l'horizontale-ajouter des instructions SSE4.2-il la peine? Quel est le coût de déplacement de la FPU, puis faddp, faddp? Quelle est la manière la plus rapide spécifique de la séquence d'instruction?

"D'essayer d'arranger les choses de sorte que vous pouvez somme de quatre vecteurs à la fois" ne sera pas acceptée comme une réponse. 🙂

  • Si horizontal ajoute de la performance sont critiques pour vous, alors vous pourriez bien être à la veille d'SIMD de codage dans une moins de manière optimale - poster une partie de code qui montre comment et où vous en avez besoin pour ce faire.
  • Produit scalaire pour les angles entre les vecteurs, principalement. Remarque la dernière phrase.
  • J'ai lu la dernière phrase, mais je pense toujours qu'il peut y avoir une meilleure façon.
  • Je sais qu'il ya une meilleure façon, et c'est "exécuter des boucles de quatre éléments à un moment de sorte que vous pouvez paralléliser tout". La question est de savoir quel est le meilleur que nous pouvons faire à l'exclusion de cette façon (ce qui est compliqué et abrutissant)?
  • Il peut y avoir plus d'une "meilleure façon" mais si vous ne publiez pas n'importe quel code, alors il est difficile de donner de l'aide.
  • laissez-nous continuer cette discussion dans le chat
  • OK, je vais garder un œil sur le chat...
  • Il n'y a pas de "façon la plus rapide ... sur x86". Différents x86 processeurs d'exécution différents caractéristiques. Ce processeur ciblez-vous? Est votre "vecteur de trois flotteurs" en mémoire d'abord, ou de manière contiguë dans un ESS registre, ou quelque part d'autre?