You are here
Home > posts

Xmm3-spor

Xmm3-spor h1>

Fa via App Store Les dette innlegget i var app!

Ved hjelp av XMM0-register og minnefelter (C ++-kode) er dobbelt sa fort som ASM bare bruker XMM-registre – hvorfor?

Jeg prover a implementere noen inline assembler (i Visual Studio 2012 C ++ kode) for a utnytte SSE. Jeg vil legge til 7 tall for 1e9 ganger, sa jeg plasserte dem fra RAM til xmm0 til xmm6 registre av CPU. nar jeg gjor det med inline montering i visuell studio 2012 med denne koden:

og dette er den oppsamlede koden fra C ++ kompilatoren for koden ‘resVal + = val1 + val2 + val3 + val4 + val5 + val6 + val7’:

Som det er synlig, bruker kompilatoren bare ett xmm0-register, og for andre ganger henter det verdier fra RAM.

Svar pa begge koder (min ASM kode og c + + kode) er det samme, men c + + koden tar omtrent halvparten av min ASM kode a kjore!

Jeg ble lest om CPU-registre som jobber med dem, er mye raskere enn minnet. Jeg tror ikke dette forholdet er sant. Hvorfor ASM-versjonen har lavere ytelse til C ++-koden?

Nar dataene er i hurtigbufferen (som det vil v re tilfelle etter den forste sloyfen, hvis den ikke er der allerede), gjor det lite forskjell hvis du bruker minne eller register. Et flytende punkt tillegg vil ta litt lengre tid enn en syklus i utgangspunktet. Den endelige butikken for a veksle «unties» xmm0-registeret slik at registret blir fritt «omdopt», noe som gjor at flere av lokkene kan kjores parallelt.

Dette er et typisk tilfelle av «med mindre du er helt sikker, la du skrive kode til kompilatoren».

Siste punkt ovenfor forklarer hvorfor koden er raskere enn kode hvor hvert trinn i lokken er avhengig av et tidligere beregnet resultat.

I kompilatoren generert kode kan sloyfen gjore tilsvarende av:

Na, som du kan se, kunne vi «blande» disse to «tradene»:

Jeg foreslar ikke at det er sa mye ute av ordrebekreftelse, men jeg kan sikkert se hvordan sloyfen kan utfores raskere enn sloyfen din. Du kan sannsynligvis oppna det samme i assemblerkoden din hvis du hadde et reserveregister [i x86_64 har du ytterligere 8 registre, selv om du ikke kan bruke inline assembler i x86_64. ]

(Merk at registrering av omdoping er forskjellig fra min «threaded» loop, som bruker to forskjellige registre – men effekten er omtrent den samme, loopen kan fortsette etter at den treffer resVal-oppdateringen uten a vente pa at resultatet skal v re oppdatert)

Top

Hei! Ønsker du å spille i det største kasinoet? Vi fant det for deg. Prøv her nå!