pentium3.rpm ??
Paweł Sikora
pluto w ds14.agh.edu.pl
Pon, 15 Mar 2004, 13:54:51 CET
On Monday 15 of March 2004 12:58, Marcin Doliński wrote:
> W liście z pon, 15-03-2004, godz. 12:31, Paweł Sikora pisze:
> > jedni powiedza, ze warto, inni, ze zysk jest niemierzalny.
> > skro jednak taka opcja jest w kernelu, to chyba nie powstala
> > tylko dla sportu...
>
> Nie prawda. Były w sieci testy wydajności kernel 2.4 vs. 2.6 i
> optymalizacja per arch z prockami HT. W przypadku kernela 2.4
> -march=pentium4 tylko bruździ, w przypadku 2.6 daje dużo większą
> wydajność. Moja odpowiedź - warto.
ja ze swojej strony podam taki maly przyklad lepszego wykorzystania
procka do obliczen staloprzecinkowych. wezmy na warsztat zwykle
dodawanie liczb 64 bitowych, ktore sa coraz powszechniej wykorzystywane
zarowno w kernelu jak i w aplikacjach z userspace'u.
/jako model posluzyla mi arch. 32 bitowa i686 & PIII/
#ifndef VEC
typedef long long int i64;
#else
typedef int v2si __attribute__ ((mode(V2SI)));
typedef v2si i64;
#endif
i64 a, b, c[4];
inline i64 foo(const i64 a, const i64 b)
{
return (a + b);
}
int main(int argc,char **argv)
{
c[0] = foo(a, b);
c[1] = foo(a, c[0]);
c[2] = foo(b, c[0]);
c[3] = foo(c[1], c[2]);
return 0;
}
*** wariant 1 - i686 ***
# gcc -Wall -O2 z.c -s -S -march=i686 -fverbose-asm
-fomit-frame-pointer -mregparm=3
foo:
addl 4(%esp), %eax # b, tmp61
adcl 8(%esp), %edx # b,
ret
(...)
main:
pushl %ebp #
movl %esp, %ebp #,
subl $24, %esp #,
movl %esi, -8(%ebp) #,
movl a, %eax # a, a
andl $-16, %esp #,
movl %edi, -4(%ebp) #,
movl a+4, %edx # a, a
subl $16, %esp #,
movl %ebx, -12(%ebp) #,
movl b, %esi # b, b
movl b+4, %edi # b, b
movl %eax, %ecx # a, <anonymous>
movl %edx, %ebx # a, <anonymous>
addl %esi, %ecx # b, <anonymous>
adcl %edi, %ebx # b, <anonymous>
addl %ecx, %eax # <anonymous>, <anonymous>
adcl %ebx, %edx # <anonymous>, <anonymous>
addl %ecx, %esi # <anonymous>, <anonymous>
adcl %ebx, %edi # <anonymous>, <anonymous>
movl %eax, c+8 # <anonymous>, c
addl %esi, %eax # <anonymous>, <anonymous>
movl %edx, c+12 # <anonymous>, c
adcl %edi, %edx # <anonymous>, <anonymous>
movl %ebx, c+4 # <anonymous>, c
movl -12(%ebp), %ebx #,
movl %esi, c+16 # <anonymous>, c
movl -8(%ebp), %esi #,
movl %edi, c+20 # <anonymous>, c
movl -4(%ebp), %edi #,
movl %eax, c+24 # <anonymous>, c
xorl %eax, %eax # <result>
movl %ecx, c # <anonymous>, c
movl %edx, c+28 # <anonymous>, c
movl %ebp, %esp #,
popl %ebp #
ret
*** wariant 2 - pentium 3 ***
# gcc -Wall -O2 z.c -s -S -march=pentium3 -fverbose-asm
-fomit-frame-pointer -mregparm=3
foo:
addl 4(%esp), %eax # b, tmp61
adcl 8(%esp), %edx # b,
ret
(...)
main:
pushl %ebp #
movl %esp, %ebp #,
subl $24, %esp #,
movl %esi, -8(%ebp) #,
movl a, %eax # a, a
andl $-16, %esp #,
movl %edi, -4(%ebp) #,
movl a+4, %edx # a, a
subl $16, %esp #,
movl %ebx, -12(%ebp) #,
movl b, %esi # b, b
movl b+4, %edi # b, b
movl %eax, %ecx # a, <anonymous>
movl %edx, %ebx # a, <anonymous>
addl %esi, %ecx # b, <anonymous>
adcl %edi, %ebx # b, <anonymous>
addl %ecx, %eax # <anonymous>, <anonymous>
adcl %ebx, %edx # <anonymous>, <anonymous>
addl %ecx, %esi # <anonymous>, <anonymous>
adcl %ebx, %edi # <anonymous>, <anonymous>
movl %eax, c+8 # <anonymous>, c
addl %esi, %eax # <anonymous>, <anonymous>
movl %edx, c+12 # <anonymous>, c
adcl %edi, %edx # <anonymous>, <anonymous>
movl %ebx, c+4 # <anonymous>, c
movl -12(%ebp), %ebx #,
movl %esi, c+16 # <anonymous>, c
movl -8(%ebp), %esi #,
movl %edi, c+20 # <anonymous>, c
movl -4(%ebp), %edi #,
movl %eax, c+24 # <anonymous>, c
xorl %eax, %eax # <result>
movl %ecx, c # <anonymous>, c
movl %edx, c+28 # <anonymous>, c
movl %ebp, %esp #,
popl %ebp #
ret
jak widac powyzej roznica miedzy i686, a p3 zadna.
gcc wygenerowal nam mase 2 taktowych instrukcji mov,add,sub,xor.
niby to szybkie, ale jednak sporo tego jest.
no to jeszcze jedna kompilacja:
*** wariant 2 - pentium 3 +MMX ***
# gcc -Wall -O2 z.c -s -S -march=pentium3 -fverbose-asm
-fomit-frame-pointer -mregparm=3 -DVEC
foo:
paddd %mm1, %mm0 # b, tmp61
movq %mm0, (%eax) # tmp61, <result>
ret
(...)
main:
pushl %ebp #
xorl %eax, %eax # <result>
movl %esp, %ebp #,
subl $8, %esp #,
andl $-16, %esp #,
subl $16, %esp #,
movq a, %mm0 # a, a
movq b, %mm2 # b, b
movq %mm0, %mm1 # a, <anonymous>
paddd %mm2, %mm1 # b, <anonymous>
paddd %mm1, %mm0 # <anonymous>, <anonymous>
movq %mm0, c+8 # <anonymous>, c
paddd %mm1, %mm2 # <anonymous>, <anonymous>
paddd %mm2, %mm0 # <anonymous>, <anonymous>
movq %mm1, c # <anonymous>, c
movq %mm2, c+16 # <anonymous>, c
movq %mm0, c+24 # <anonymous>, c
leave
ret
i co otrzymalismy?
duzo mniej instrukcji, ktore na dodatek wykonuja sie w jednym cyklu zegara.
lekko liczac dostalismy 2-krotne przyspiesznie i mniejszy kod
wynikowy na prostej arytmetyce.
--
If you think of MS-DOS as mono, and Windows as stereo,
then Linux is Dolby Digital and all the music is free...
Więcej informacji o liście dyskusyjnej pld-devel-pl