Este în regulă să se amestece instrucțiunile codate ale SSE moștenite și cele codificate VEX în aceeași cale de cod?

Odată cu introducerea AVX, Intel a introdus schema de codificare VEX în arhitectura Intel 64 și IA-32. Această schemă de codare este folosită în cea mai mare măsură cu instrucțiunile AVX. Mă întrebam dacă este bine să amesteci instrucțiunile codate cu VEX și instrucțiunile denumite acum "moștenirea SSE".

Principalul motiv pentru care pun această întrebare este dimensiunea codului. Luați în considerare aceste două instrucțiuni:

shufps xmm0, xmm0, 0
vshufps xmm0, xmm0, xmm0, 0

I commonly use the first one to "broadcast" a scalar value to all the places in an XMM register. Now, the instruction set says that the only difference between these two (in this case) is that the VEX-encoded one clears the higher (>=128) bits of the YMM register. Supposing that I don't need that, what's the advantage of using the VEX-encoded version in this case? The first instruction takes 4 bytes (0FC6C000), the second - 5 (C5F8C6C000).

Vă mulțumim pentru toate răspunsurile în avans.

0
Nu, nu. Ele pot fi zero sau randomizate sau orice, nu-mi pasă.
adăugat autor Daniel Kamil Kozar, sursa
@harold Acesta ar trebui să fie un răspuns. Mulțumiri!
adăugat autor Daniel Kamil Kozar, sursa
Are un registru YMM o jumătate superioară care este utilizată?
adăugat autor harold, sursa
Atunci este bine. În cazul implementărilor curente, în cazul în care jumătatea superioară a fost resetată (VZEROUPPER), nu există nici o penalizare pentru utilizarea instrucțiunilor SSE vechi.
adăugat autor harold, sursa
Da, cred că voi adăuga câteva informații și o voi transforma într-un răspuns ..
adăugat autor harold, sursa

2 răspunsuri

În cazul implementărilor curente, dacă (cel puțin) jumătatea superioară a fost resetată (VZEROUPPER sau VZEROALL) nu există nici o penalizare pentru utilizarea instrucțiunilor SSE vechi.

Așa cum este detaliat la pagina 128 în Agner Fog: optimizarea subrutinelor în asamblare , utilizând instrucțiuni SSE vechi în timp ce (unele) jumătăți superioare sunt în uz poartă o pedeapsă de performanță. Această pedeapsă se face o singură dată când intrați în statul unde registrele YMM sunt împărțite în mijloc și din nou când părăsiți acea stare.

Amestecarea instrucțiunilor 128-biți codate VEX și instrucțiunile SSE vechi nu este o problemă.

0
adăugat

Nu este sigur. În conformitate cu manualul pentru dezvoltatori de software pentru Intel , varianta versiunea VEX.128, jumătatea superioară a registrului YMM, versiunea SSE moștenită nu. Cel mai greu lucru: unii asamblori (cum ar fi gasm) pot converti SHUFPS în VSHUFPS în timp ce creează fișier obiect (când se aplică flag -mavx). Am găsit exact aceeași problemă cu un fișier de asamblare.

0
adăugat