Összetákoltam egy ilyen gány kódot (nem a kód és a stílusa számít, hanem az eredmény):
#include <stdio.h>
#include <sched.h>
#include <sys/wait.h>
char stack1[123456];
char stack2[123456];
long long res1, res2;
int sum(void *id)
{
long long i, s = 0;
for (i = 1; i <= 1234567890; ++i)
s += i;
printf("%lld\n", s);
if (id == (void*)1) res1 = s;
else res2 = s;
return 0;
}
int main()
{
puts("cloning");
clone(sum, stack1+123455, SIGCHLD|CLONE_VM, (void*)1);
clone(sum, stack2+123455, SIGCHLD|CLONE_VM, (void*)2);
puts("waiting");
wait(0);
wait(0);
puts("ending");
printf("%lld + %lld = %lld\n", res1, res2, res1+res2);
return 0;
}
Optimalizáció nélkül lefuttatva, mérve az időt:
cloning
waiting
762078938126809995
762078938126809995
ending
762078938126809995 + 762078938126809995 = 1524157876253619990
real 0m25.432s
user 0m49.877s
sys 0m0.023s
Nem biztos, hogy korrektül használom, ennyit tudtam kiszűrni a manpagejából. Viszont nagyon tetszik a futási idő. Sajna csak 2 proci van a laptopomon, ezért több szálat szerintem felesleges létrehozni ilyen apró konzolos számolgatós programoknál. Biztos, hogy valamikor alkalmazását fogom vehetni, csak el ne felejtsem.
- rlblaster blogja
- A hozzászóláshoz be kell jelentkezni
- 911 megtekintés
Hozzászólások
Hali!
Proba keppen leforditottam a kododat, fejbeli interpretalas utan =)
coornail@daneel(/tmp)$ cc main.c -Wall
coornail@daneel(/tmp)$ time ./a.out
cloning
waiting
762078938126809995
762078938126809995
ending
762078938126809995 + 762078938126809995 = 1524157876253619990
real 0m12.694s
user 0m12.629s
sys 0m0.008s
Ami erdekes, mert nekem 1 procim van, az is egy athlon-xp 2500+, es fele annyi ido alatt futott le mint nalad?
Es aztan jott a gentoo fele ricerelesi kedv:
coornail@daneel(/tmp)$ cc main.c -Wall -O3 -march=athlon-xp
coornail@daneel(/tmp)$ time ./a.out
cloning
762078938126809995
waiting
762078938126809995
ending
762078938126809995 + 762078938126809995 = 1524157876253619990
real 0m0.018s
user 0m0.000s
sys 0m0.004s
A magyarazat erdekelne.
- A hozzászóláshoz be kell jelentkezni
A magyarazat erdekelne.
vegulis, a fordito is ki tudja talalni forditas kozben, hogy annak a felosszegzesnek mi is az eredmenye... kerdes, hogy az (marmint a forditas) mennyi ideig tart...:]
de ez tetszik, kiprobalom majd en is...
- A hozzászóláshoz be kell jelentkezni
Nem tart sokáig optimalizálással se, gondolom ilyenekre vannak beépített képletek.
- A hozzászóláshoz be kell jelentkezni
A forditas egy pillanat, most nem merem le, de ha 2mpnel tobb, akkor nemtudom mi vagyok. A kerdes tovabbra is fennall, vajon mit optimalizal ki a gcc? =)
- A hozzászóláshoz be kell jelentkezni
Nos, lefutattam újra, és ezen eredmények jöttek ki (azóta volt egy restart):
real 0m10.772s
user 0m21.322s
sys 0m0.010s
(fogalmam sincs tegnap este miért ment fele olyan gyorsan - 14 órája mehetett akkor a gép)
1862 MHz-es Intel Pentium Dual-Core-t állít magáról a masina. Hát lényegében egy szál gyorsabban lefut, mint nálad a kettő. De nem tudom honnan jöhet az a 8-9 másodperces különbség. (Ugye nem olyan gyors a procid?)
- A hozzászóláshoz be kell jelentkezni
oliver@pancs:/tmp$ time ./thread_test && time ./thread_test_opt
cloning
waiting
762078938126809995
762078938126809995
ending
762078938126809995 + 762078938126809995 = 1524157876253619990
real 0m18.246s
user 0m36.270s
sys 0m0.010s
cloning
waiting
762078938126809995
762078938126809995
ending
762078938126809995 + 762078938126809995 = 1524157876253619990
real 0m0.002s
user 0m0.000s
sys 0m0.010s
thread_test_opt <- cc -Wall -O3 -march=pentium4
linux v2.6.22.14 + madwifi v0.9.3.3-mal itt
debian gnu/linux @ linux-2.6.22.15-pancs1
- A hozzászóláshoz be kell jelentkezni
Legközelebb valami random szám Euler függvényértékének osztóinak a szorzatának a számolását fogom példafüggvényként alkalmazni, nehogy már tudjon akármit is optimalizálni a kompíler, hogy jobban tudjam szemléltetni azt, amit valójában akartam (itt nem a fordítók ügyességét akartam megmutatni). :)
- A hozzászóláshoz be kell jelentkezni
duplaposzt, bocsi
SZERK: Dehogy valami lényegi dolog is legyen itt:
Lehetséges, hogy nekem a noti valami félig takarékos módon van (fogalmam sincs hol lehetne megnézni, milyen programmal [GNOMEt használok ArchLinuxon]). Pl. ha kihúzom az áramot belőle, akkor nagyon észrevehető a lassulás, pl. a 3D játékok szaggatnak, de ha be van dugva akkor nem. Viszont lehet akkor sincs maxon kihasználva a proci. Ötlet?
- A hozzászóláshoz be kell jelentkezni
cpu freq scaling applet hozzáadása
- A hozzászóláshoz be kell jelentkezni
Nyugodt szívvel konstatálhatom, hogy 798 MHz-en van az a 25 másodperces futási idő.
Viszont maxon még mindig 10 másodperc. Ah, mindegy, jobb az AMD és kész. :)
- A hozzászóláshoz be kell jelentkezni
clone -t nem szokás közvetlenül hívni.
pthread library-t szokás használni.
- A hozzászóláshoz be kell jelentkezni