2016-05-18 30 views
0

Ich habe eine einfache Code-Zeile (64 Bytes in Form von 8 Doppelzimmern - genau one i7 cache line) in einem für i-Schleife, die für k Schleife verschachtelt in ist:Gibt es einen intrinsischen Befehl für Ergebnis [i] + = A [k] * sin (B [k] * C [i] + D [k])?

result[i] += A[k] * sin(B[k] * C[i] + D[k]) 

Ich sehe mich um intell intrinsics manual noch verloren zu sein scheint: wie man nach solcher Funktion fragt?

+0

Es ist sehr unwahrscheinlich, dass es eine intrinsische für die Vier-Parameter-Operation 'a * sin (b * c + d) 'gibt. Dies ist keine grundlegende Operation, für die eine CPU wahrscheinlich eine dedizierte Anweisung hat. –

Antwort

1

Warten Sie eine Minute, ist i oder k in der inneren Schleife? Unter der Annahme, k ist für alle i konstant, dann Broadcast A[k] in einen ganzen Vektor, mit _mm256_set1_pd(A[k]), und dasselbe für die anderen Array [k] Operanden.


Wie Raymond sagt, das ist viel zu komplex für eine einzige Anweisung. Selbst sin() ist nicht in Hardware implementiert (außer für die Skalarversion x87). Intels intrinsische Anleitung listet einige Intel-Bibliotheksfunktionen auf, die nur Intel's SVML provides sind, nicht Teil von <immintrin.h> von gcc/clang.


Verwenden an FMA (_mm256_fmadd_pd) für B[k] * C[i] + D[k], und dieses Ergebnis auf eine vektorisiert sin() Funktion übergeben, wenn Sie einen finden können.

Führen Sie dieses Ergebnis in eine andere FMA für die result[i] += A[k] * ....

Dies dauert natürlich zwei 32B Vektoren mit AVX.

AVX512 ist 64B Vektoren, aber ist nur in Xeon Phi Beschleunigerkarten für jetzt verfügbar.

+0

Sie haben Recht "ich" ist innere Schleife – DuckQueen

+0

Vielen Dank! BTW könnte man 'result [i] + = A [k] * ...' intrinsics (zumindest für 32B) verknüpfen? – DuckQueen

+0

@DuckQueen: Es gibt nur einen intrinsischen für gepackten Doppel-FMA, also gibt es nichts anderes zu verknüpfen. Der C-Compiler kümmert sich um die Wahl zwischen 'VFMADD132PD' /' VFMADD231PD'. Es gibt auch eine intrinsische "fmsub_pd" und ['_mm256_fnmadd_pd'] (http://www.felixcloutier.com/x86/VFNMADD132PD:VFNMADD213PD:VFNMADD231PD.html), um das Produkt zu negieren (z.B." d - b * c "). Da all Ihre Operationen hinzugefügt werden, brauchen Sie nur die gleiche FMA innerhalb und außerhalb der sin(). –