SSE vs. REG32 Was ODERt schneller?

09/11/2008 - 23:28 von Hubert Seidel | Report spam
Hallo NG,

in der Delphi-NG
gibt es mal wieder eine Frage a la "Was ist schneller".
Es geht dabei wie man am schnellsten zwei Arrays mit Oder verknüpft.

Hier meine beiden Varianten:
==procedure IntArrayOrReg16(var a,b; c:integer);
asm
push ebx
push esi
push edi

mov esi, a
mov edi, b
sub edi, esi

shr ecx, 3 // ecx := ecx / 8

jecxz @ende

@lp01:

db $0F,$18,$46,$40 { prefetchnta [esi+64] }
db $0F,$18,$44,$3E,$40 { prefetchnta [esi+edi+64] }

mov ebx, [esi]
mov edx, [esi+4]
or ebx, [esi+edi]
or edx, [esi+edi+4]
mov [esi], ebx
mov [esi+4], edx

mov ebx, [esi+8]
mov edx, [esi+12]
or ebx, [esi+edi+8]
or edx, [esi+edi+12]
mov [esi+8], ebx
mov [esi+12], edx

mov ebx, [esi+16]
mov edx, [esi+4+16]
or ebx, [esi+edi+16]
or edx, [esi+edi+4+16]
mov [esi+16], ebx
mov [esi+4+16], edx

mov ebx, [esi+8+16]
mov edx, [esi+12+16]
or ebx, [esi+edi+8+16]
or edx, [esi+edi+12+16]
mov [esi+8+16], ebx
mov [esi+12+16], edx

add esi, 32
dec ecx
jnz @lp01

@ende:
pop edi
pop esi
pop ebx
end;

==
procedure IntArrayOrSse16(var a,b; c:integer);
asm
push esi
push edi

mov esi, a
mov edi, b
sub edi, esi

shr ecx, 4 // ecx := ecx / 16

jecxz @ende

@lp01:

db $0F,$18,$46,$40 { prefetchnta [esi+64] }
db $0F,$18,$44,$3E,$40 { prefetchnta [esi+edi+64] }

db $0F,$28,$06 { movaps xmm0, [esi] }
db $0F,$28,$56,$10 { movaps xmm2, [esi+16] }
db $0F,$28,$66,$20 { movaps xmm4, [esi+32] }
db $0F,$28,$76,$30 { movaps xmm6, [esi+48] }

db $0F,$56,$04,$3E { orps xmm0, [esi+edi] }
db $0F,$56,$54,$3E,$10 { orps xmm2, [esi+edi+16] }
db $0F,$56,$64,$3E,$20 { orps xmm4, [esi+edi+32] }
db $0F,$56,$74,$3E,$30 { orps xmm6, [esi+edi+48] }

db $0F,$29,$06 { movaps [esi], xmm0 }
db $0F,$29,$56,$10 { movaps [esi+16], xmm2 }
db $0F,$29,$66,$20 { movaps [esi+32], xmm4 }
db $0F,$29,$76,$30 { movaps [esi+48], xmm6 }

add esi, 64
dec ecx
jnz @lp01

@ende:
pop edi
pop esi
end;

==Falls der komplette Code interessieren sollte:
news:gf520r$1hj$03$1@news.t-online.com (SSE-Variante)
news:gf5392$kcr$02$1@news.t-online.com (REG32-Variante)
Die beiden Arrays sind je 6000000 Integer a 32Bit groß.

Auf meinem PIII wurden im Original 24 Takte pro Integer
(in Delphi) gegenüber der SSE-Variante mit 15,6 Takte benötigt.
24,090 <== # ==> 15,598 > -35,252%
Auf der gleichen CPU war die REG32-Variante sogar
zu meinem großen erstaunen etwas schneller:
24,516 <== # ==> 13,907 > -43,275%

Ich kann das leider nur auf einem PIII testen.
Hat jemand zufàllig Zeit und Lust den Code
auf einer neueren CPU zu Testen?

mfg.
Herby

P.S:
Ok,... das prefetchnta ist voraussichtlich überflüssig.
Wird aber auch nicht schneller wenn's weg ist:)

http://www.hubert-seidel.de
 

Lesen sie die antworten

#1 Hubert Seidel
11/11/2008 - 00:18 | Warnen spam
Hallo Jan,

"Jan Seiffert" schrieb im
Newsbeitrag news:gf9e93$hq$02$

Hubert Seidel wrote:

Hallo Hubert :)
Hmmm, welches ist denn jetzt das richtige Post? Ich antworte mal hier


drauf...

Das mit "SSE" nicht mit "SSE3" (wieso muss mich ich zufàllig mit einer 3
vertippen?)

> in der Delphi-NG
> gibt es mal wieder eine Frage a la "Was ist schneller".
> Es geht dabei wie man am schnellsten zwei Arrays mit Oder verknüpft.

Hihihi.
Es gibt also auch noch andere die das Problem haben, bei mir war es


nur XOR und AND.

Und vor allem Performance ist Thema Nummer 1 ;-)

[snip code]
> ==> > Falls der komplette Code interessieren sollte:
> news:gf520r$1hj$03$ (SSE-Variante)
> news:gf5392$kcr$02$ (REG32-Variante)
> Die beiden Arrays sind je 6000000 Integer a 32Bit groß.

also fast 23 Mb...


+1MB, aber wofür hat man ja ein Rechenknecht ;-)
Nagut, bei mir sind es nur 128kb, aber dafuer immer und immer wieder.



...
Man kann auf den Code die ueblichen Tricks anwenden, unrolling,


sheduling etc.
OK, das macht den SSE Code schneller, aber genauso den normalen


Register Code.

Ja, irgendwie war ich doch darüber überrascht :-)

<Schnip>
Super, Vielen Dank! Jetzt bin ich wesentlich schlauer :-)
SSE u.s.w fàngt an mein Interesse zu wecken.
Insbes. weil die Register zusàtzlich zur Verfügung stehen.
Ist bisher bei mir irgendwie vorbei gegangen.

> P.S:
> Ok,... das prefetchnta ist voraussichtlich überflüssig.
> Wird aber auch nicht schneller wenn's weg ist:)
>
Sag das nicht...



Aha, ok. Bin ja noch am Anfang, bekomme wohl
ein immer klareres Bild wo es lang geht :-)

thx&mfg.
Herby

P.S:
In der Delphi NG hat Jens Dierks
in news:4916ea1d$0$15518$
übrigends folgenden interessanten Link gepostet:
http://www.agner.org/optimize/
Da gibt's ein paar seeehr interessante PDF's zum download!
Also falls es Dich oder jemanden interessieren sollte, nur zu :=)

http://www.hubert-seidel.de

Ähnliche fragen