SSE (SIMD):Vektor mit Skalar multiplizieren

SSE (SIMD):Vektor mit Skalar multiplizieren


Eine übliche Operation, die ich in meinem Programm durchführe, ist das Skalieren von Vektoren mit einem Skalar (V*s, z. B. [1,2,3,4]*2 ==[2,4,6,8]). Gibt es dafür eine SSE- (oder AVX-) Anweisung, außer zuerst den Skalar an jeder Position in einem Vektor zu laden (z. B. _mm_set_ps(2,2,2,2)) und dann zu multiplizieren?


Das mache ich jetzt:


__m128 _scalar = _mm_set_ps(s,s,s,s);
__m128 _result = _mm_mul_ps(_vector, _scalar);

Ich suche etwas wie...


__m128 _result = _mm_scale_ps(_vector, s);

Antworten:


Abhängig von Ihrem Compiler können Sie die Codegenerierung möglicherweise etwas verbessern, indem Sie _mm_set1_ps verwenden :


const __m128 scalar = _mm_set1_ps(s);
__m128 result = _mm_mul_ps(vector, scalar);

Skalare Konstanten wie diese sollten jedoch nur einmal außerhalb von Schleifen initialisiert werden müssen, sodass die Leistungskosten irrelevant sein sollten. (Es sei denn, der Skalarwert ändert sich innerhalb der Schleife?)


Wie immer sollten Sie sich den Code ansehen, den Ihr Compiler generiert, und auch versuchen, Ihren Code unter einem anständigen Profiler auszuführen, um zu sehen, wo die Hotspots wirklich sind.