Ich betrachte ein einfaches Problem - Beschleunigung der Berechnung der komponentenweise Produkt von zwei Doppelfelder. Ich habe festgestellt, dass ich mit AVX-Befehlen nur etwa 20% Beschleunigung erziele, verglichen mit der sequentiellen Multiplikation in einer Schleife.Intel intrinsics assembly code
ich beschlossen, die Latenzen für die beiden Fälle zu prüfen und wurde mit dem Assembler-Code der Ladeoperation verwirrt:
### __m256d pd;
### pd = _mm256_load_pd(a);
movq -112(%rbp), %rax //Pushing the pointer to the stack
vmovapd (%rax), %ymm0 //Pushing 32 bytes from memory to ymm
vmovapd %ymm0, -80(%rbp) //What is
vmovapd -80(%rbp), %ymm0 //happening here?
vmovapd %ymm0, -48(%rbp) //Quite slow down, since vmovapd cost ~ vmulpd
Above Teil der Anordnung für die folgenden C-Code ist:
inline int test(double * a) {
__m256d pd;
pd = _mm256_load_pd(a);
return 1;
}
in der Beschreibung der __m256_load_pd wird gesagt, dass es auf diese Weise getan wird:
dst[255:0] := MEM[mem_addr+255:mem_addr]
dst[MAX:256] := 0
, d.h. in umgekehrter Reihenfolge? Aber wie haben diese 2 Zeilen Assemblercode damit zu tun?
Sie kompilieren mit der Optimierung deaktiviert, so gcc macht braindead langsamen Code. Mit der Optimierung kompiliert 'test()' nur zu der 'return 1', weil' pd' nie benutzt wird. Wenn die Beschleunigung um 20% mit "-O0" ist, versuchen Sie es mit "-O3". Sie müssen die Optimierung aktivieren, wenn der Code schnell ausgeführt werden soll. –
AT & T-Syntax verwendet 'op src2, src1, dest' mit'% 'Dekoratoren auf Registernamen, während Intel-Syntax' op dest, src1, src2' verwendet. Der Pseudocode des Intel-Handbuchs ist überhaupt nicht asm, er beschreibt nur die Operation. –
20% Beschleunigung ist das Ergebnis für -O3 Flag mit Icpc. – Tzoiker