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.
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. –