Wie findet man die maximale horizontale in eine 256-bit-AVX-Vektor

Ich habe ein __m256d Vektor verpackt mit vier 64-bit-floating-point-Werte.

Ich muss die horizontale maximale von der vector-Elemente und speichert das Ergebnis in einer double-precision-skalaren Wert;

Meine versuche wurden alle mit einer Menge von schlurfenden der vector-Elemente, so dass der code nicht sonderlich elegant noch effizient. Auch fand ich es unmöglich, bleiben nur die AVX-Domäne. Irgendwann hatte ich die Verwendung der SSE-128-bit-Anweisungen zum extrahieren der endgültigen 64-bit-Wert. Ich möchte jedoch zu sein, erwies sich als falsch, auf diese Letzte Aussage.

Also die ideale Lösung:

1) nur verwenden, nur AVX-Anweisungen.

2) minimieren der Anzahl der Anweisungen. (Ich hoffe auf nicht mehr als 3-4 Anweisungen)

Having said that, jede elegante/effiziente Lösung akzeptiert werden, auch wenn Sie nicht Einhaltung der oben genannten Richtlinien.

Vielen Dank für jede Hilfe.

-Luigi

  • Das ist eine schwierige Frage... machst du das mit nur 1 Vektor? Oder haben Sie viele Vektoren, für die Sie brauchen, um zu finden, die max? Können Sie (relativ) effizient tun, 4 von diesen parallel mit einem 4 x 4-Vektor transponieren...
  • Naja... ich beschäftige mich mit vielen Vektoren. Jedoch ist die Einfachheit der Verarbeitung rechtfertigen nicht zwei 4x4-Transposition Operationen für jede iteration. Also ich bin von der Verarbeitung alles, was "horizontal" ohne transposition. Ich bin immer ein großer speed-up, der Art, der Nähe von 4x, denn ich bin die Vermeidung der Aufwand für die Umsetzung. Alles wird in einer engen Schleife manuell abgerollt 4 mal. Allerdings, wenn die Schleife ist vorbei, ich bin Links mit einem letzten AVX Vektor. Ich habe zu finden, die größte der vier Elemente, um zu speichern das Ergebnis zurück in mein doppelter Genauigkeit skalarer Wert. Daher meine Frage...
  • Wenn es nicht in der "enge Schleife", ist es auch performance kritisch?
  • Dieses mal nicht wirklich... 🙂 aber ich weiß, ich werde laufen in eine situation, wo es performance-kritisch. Das ist, warum ich formulierte die Frage, wie ich es Tat...
  • Ah 🙂 In diesem Fall ist der beste Weg, dies zu tun wäre wahrscheinlich sehr spezifische, wie es verwendet wird. In anderen Worten, es ist nicht vectorizable auf dieser Ebene, aber können Sie schieben Sie es auf eine höhere Ebene...
  • Was meinst du mit "schieben Sie es auf eine höhere Ebene" ?
  • lassen Sie uns weiter, diese Diskussion im chat
  • Beachten Sie, dass Sie bleiben können, in die AVX-Domäne, während mit einer 128-bit-Anweisungen. Es gibt eigentlich 3 Arten von Befehlen: AVX256, AVX128 und legacy SSE128. Ein Schalter zwischen den ersten beiden und letztere zu vermeiden ist, seine teuer auf Intel (also nicht auf AMD), aber die ersten beiden können vermischt werden, fast frei (Sie können zum einfügen vzeroupper manchmal)

Schreibe einen Kommentar