Multicore rulez!

Sziasztok!
Új tag vagyok (linuxon is kezdő), majd egyszer be is fogok mutatkozni, valamikor.
Szóval számomra a legtöbb dolog itt a Linuxon új, valszeg sokakat inkább idegesítek ilyesmi bejegyzéssel. Majd csak rámszólnak.
Írtam magamnak egy bejegyzést, hogy el ne felejtsem miként lehet Linuxon egyszerűen többszálazni.

Ö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.

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.

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?)


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

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). :)

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?

clone -t nem szokás közvetlenül hívni.
pthread library-t szokás használni.