Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 119 odgovora
  • 35.157 pregleda

Najnovija ↓

Re: Test Brzine procesora - "besposlen pop jarice krsti" 07.11.2008. u 10:44 · pre 219 meseci #82
Aha, jesmo preterali, potkrali se neki bug-ovi a mi svaki put ko blesavi:
Code:

150 linija koda


Pa nemamo vise ni da postujemo kodove jer smo zavrsili, dakle jos jednom source i bin evo ga ovaj put u attachmentu i to je to....
Potpis
make love - !war
Re: Test Brzine procesora - "besposlen pop jarice krsti" 07.11.2008. u 13:26 · pre 219 meseci #83
Za malu vremensku rezoluciju koristite clock() funkciju i clock_t tip pa rezultat
delite sa CLOCKS_PER_SEC kako bi dobili rezoluciju u sekundama.
Sto se tice problema sa manje od 30mb to je zato sto ako neki thread zavrsi
dva puta pre nego neki drugi a 30mb se zavrsi za malo vremena
dolazi do greske jer se koriste samo dva semafora, tj neki thread
ce biti aktiviran dva puta dok neki nece pa ce izostati potrebna
4 sem_posta kako bi main thread nastavio da signalizira.
U tom slucaju treba staviti po par semafora za svaki thread, a same semafore i mem
blok proslediti thread f-ji preko strukture, recimo struct Data{ sem_t sem,sem1; int* mem; };

Pozdrav!
Re: Test Brzine procesora - "besposlen pop jarice krsti" 07.11.2008. u 14:16 · pre 219 meseci #85
Ne furamo windows na ovom forumu... :)
Salim se.

Bilo bi zanimljivo da vidimo ista masina, isti kod - kakve bi razlike bile u brzini izvrsavanja na linuxu i na windowsu.
Potpis
Beneath civilization's fragile crust, cold chaos churns...
Re: Test Brzine procesora - "besposlen pop jarice krsti" 07.11.2008. u 15:29 · pre 219 meseci #88
-lpthread switch daje podrsku za koriscenje thread-ova koji se u ovom
kodu koriste, pa ako neko bude kompajlirao za windows pazite i na to
koji je kompajler i sta treba ukljuciti za ovo na njemu za ovu podrsku.

(-Wall je manje bitna opcija cini mi se, samo vezana za neka dodatna upozorenja oko kompajliranja)
Potpis
oligofrenolog
Re: Test Brzine procesora - "besposlen pop jarice krsti" 07.11.2008. u 16:57 · pre 219 meseci
izmenjeno 1 put, poslednji put combuster 07.11.2008. u 17:24
  1. combuster07.11.2008. u 17:24zapis iz teksta poruke
#89
Ne moze... Losi su pthread header-i za windows, semaphore.h je lose napisan i to kolje kompajliranje... Probao sam sa Bloodshed, cygwin, lcc32, visual studiom (skidao sam header-e sa neta) i ne vredi. Uvek zeza semaphore.h koji sam skidao sa dva izvora, jedan direktno sa net-a a drugi preko paketa iz bloodshed-a! Jedino da probam da napravim exe iz linux-a...
Evo i iz linuxa sa mingw-om

Code:

combuster@vostro:~/test$ i586-mingw32msvc-gcc -x c test.c
/tmp/ccGW9wEm.o:test.c:(.text+0x92): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0xa2): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x118): undefined reference to `_sem_init'
/tmp/ccGW9wEm.o:test.c:(.text+0x12c): undefined reference to `_sem_init'
/tmp/ccGW9wEm.o:test.c:(.text+0x1d5): undefined reference to `_pthread_create'
/tmp/ccGW9wEm.o:test.c:(.text+0x1f9): undefined reference to `_pthread_create'
/tmp/ccGW9wEm.o:test.c:(.text+0x21d): undefined reference to `_pthread_create'
/tmp/ccGW9wEm.o:test.c:(.text+0x248): undefined reference to `_pthread_create'
/tmp/ccGW9wEm.o:test.c:(.text+0x258): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x268): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x278): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x288): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x2a8): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x2b8): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x2c8): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x2d8): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x2e8): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x2f8): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x308): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x318): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x338): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x348): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x358): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x368): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x378): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x388): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x398): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x3a8): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x3c8): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x3d8): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x3e8): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x3f8): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x408): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x418): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x428): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x438): undefined reference to `_sem_wait'
/tmp/ccGW9wEm.o:test.c:(.text+0x458): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x468): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x478): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x488): undefined reference to `_sem_post'
/tmp/ccGW9wEm.o:test.c:(.text+0x499): undefined reference to `_pthread_join'
/tmp/ccGW9wEm.o:test.c:(.text+0x4aa): undefined reference to `_pthread_join'
/tmp/ccGW9wEm.o:test.c:(.text+0x4bb): undefined reference to `_pthread_join'
/tmp/ccGW9wEm.o:test.c:(.text+0x4cc): undefined reference to `_pthread_join'
/tmp/ccGW9wEm.o:test.c:(.text+0x589): undefined reference to `_sem_destroy'
/tmp/ccGW9wEm.o:test.c:(.text+0x599): undefined reference to `_sem_destroy'
collect2: ld returned 1 exit status


Slicno mi javlja i na windows-u kada resim probleme sa semaphore.h i sl...
Potpis
make love - !war
Re: Test Brzine procesora - "besposlen pop jarice krsti" 09.11.2008. u 23:00 · pre 218 meseci #90
hmmm.. meni na ubuntu 32bit 8.04 samo opterecuje jedno jezgro, i to konstantno, znaci ne prebacuje na drugo....
da li je to do koda ne znam, jer ja ne znam da iskompajliram kod mene, ne bavim se toliko time ali resio da probam ...
Re: Test Brzine procesora - "besposlen pop jarice krsti" 10.11.2008. u 03:44 · pre 218 meseci
izmenjeno 1 put, poslednji put Kernel-1 10.11.2008. u 06:13
  1. Kernel-110.11.2008. u 06:13zapis iz teksta poruke
#91
Napisi koji ti je tacno procesor, koji su rezultati, i koji si od ovih
programa pokrenuo koje smo do sada kacili.

(Ako je 32-bit masina, onda skini i pokreni poslednji fajl uz poruku koji je okacio combuster,
a ako je 64-bit masina, onda skini i pokreni poslednji fajl koji sam ja okacio uz svoju poruku)

Ako nisi siguran koji ti je procesor pokreni u konzoli ove 2 komande:

cat /proc/cpuinfo | grep model
cat /proc/cpuinfo | grep cache


i prenesi sta tacno dobijes kada ih pokrenes.


Dobar program za pracenje opterecenja koji lepo graficki prikazuje opterecenja po jezgrima je gkrellm.
Instaliras ga sa:

sudo apt-get install gkrellm

Jos jednom uploadujem konacnu verziju za 64 bit-a - V 1.0.0 - minorne izmene kozmeticke prirode (source i kompajlirana izvrsna verzija ko nece da kompajlira sam):

Izgleda ovako:

Code:

srdjan@Zverko:~$ ./ProcTest64-v1.0.0 
Test Brzine Procesora - 64-bit - Verzija 1.0.0  - [ES]

Unesite koliko memorije alocirate za test (64 do 512 MB):32

Postavljena vrednost nije dozvoljena. Minimum je 64.

srdjan@Zverko:~$ ./ProcTest64-v1.0.0 
Test Brzine Procesora - 64-bit - Verzija 1.0.0  - [ES]

Unesite koliko memorije alocirate za test (64 do 512 MB):513

Postavljena vrednost nije dozvoljena. Maksimum je 512.

srdjan@Zverko:~$ ./ProcTest64-v1.0.0 
Test Brzine Procesora - 64-bit - Verzija 1.0.0  - [ES]

Unesite koliko memorije alocirate za test (64 do 512 MB):128
Program je alocirao 128 MB RAM-a.
25 procenata komletirano... 
50 procenata komletirano... 
75 procenata komletirano... 
100 procenata komletirano! 

Vreme izvrsavanja je 0 minuta i 11 sekundi.

srdjan@Zverko:~$ 


Ko kompajlira source sam, da podsetimo na komandu (sa opcijama):

gcc -Wall -lpthread -O2 ProcTest64-v1.0.0.c -o ProcTest64-v1.0.0
Potpis
oligofrenolog
Re: Test Brzine procesora - "besposlen pop jarice krsti" 10.11.2008. u 09:32 · pre 218 meseci
izmenjeno 1 put, poslednji put Kernel-1 10.11.2008. u 10:07
  1. Kernel-110.11.2008. u 10:07zapis iz teksta poruke
#93
ako neko nece da ima ogranicenje na 512 max memorije, samo izbacite TACNO ovaj deo koda pre kompajliranja,
ali mislim da nema potrebe za vise od 512 da se maltretira racunar :)

if (mb > 512)
{
printf("\n");
printf("Postavljena vrednost nije dozvoljena. Maksimum je 512.\n");
printf("\n");
return 0;
}


Dognju granicu ostavite iz sigurnosnih razloga.

@combuster - hehe, ne brini ako se odvojim u frakciju, propade moj solo projekat posto C znam malo zesce :)))
Potpis
oligofrenolog
Re: Test Brzine procesora - "besposlen pop jarice krsti" 10.11.2008. u 19:53 · pre 218 meseci #94
Sta ti hvali, znas dovoljno da radis reviziju software-a, ti zaelotu jedan sto bi rek'o dimke... Neprijatelju terranske rase (tj nas zemljana). :D Ortak mi sad javnuo da njemu blokira program ako nema dovoljno ram-a tj ne radi mu if !mem uslov, a ne radi ni meni, izgleda mi da trpa u swap... Provericu sutra, radim sad onu bazu... Ili proveri ti veceras ako imas vremena...
Potpis
make love - !war
Re: Test Brzine procesora - "besposlen pop jarice krsti" 10.11.2008. u 21:06 · pre 218 meseci
izmenjeno 1 put, poslednji put Kernel-1 10.11.2008. u 21:20
  1. Kernel-110.11.2008. u 21:20zapis iz teksta poruke
#96
Kod mene je 4GB rama i swap od oko 1,3GB na 64-bit sistemu, i sad sam mu stavio 4500MB,
poceo je da radi, a onda da drlja po swapu, prekinuo sam ga naravno, verovatno bi zavrsio
za nekih godinu dana ako mi pre toga ne crkne disk :)))

Dakle, ako se alocira onoliko memorije da to zahvata i swap, onda krece disk da drlja
(kada se popuni RAM) ... i to vec onda postaje benchmark izdrzljivosti HDD-a :)

Kada stavim 5000, onda ispise da nema dovoljno memorije (a zajedno sa swap-om imam oko 5,3GB
ali deo te memorije je vec zauzet kojecime, pa onda u tom trenutku nema da alocira 5000 mb valjda)

Ali necemo se sad baviti limesima ;) - ogranicenje od 64 do 512 does the job - a moglo bi i na 128, dosta je...
Potpis
oligofrenolog
Re: Test Brzine procesora - "besposlen pop jarice krsti" 10.11.2008. u 22:08 · pre 218 meseci #97
Citat:
Branimir Maksimovic:
Code:
int main ()
{
  sem_init(&sema,0,0);
  sem_init(&sema1,0,0);

  int* mem = calloc(4,BLCK_SIZE*sizeof(int));


Ovim će samo jedan procesor (tj. jezgro) rezervisati svu memoriju, što posle može iskvariti performanse ako postoji „afinitet“ memorije po procesoru, tj. ako svaki procesor ima deo memorije kojem najbrže pristupa. Zato, za svaki slučaj, uspostavljanje memorije kad god može treba da ide paralelno na isti način kao i izračunavanje.

Citat:
[...] posto se sada testira i brzina memorije.
[...]

Code:
    int i = 0;
    for(;i<BLCK_SIZE;++i)
    {
      *((int*)p+i) = i;
    }


Neko uobičajeno preznojavanje memorije, zapravo minimalno smisleno odmeravanje brzine podsklopa procesor-keš-memorija, bio bi euklidski skalarni proizvod:
Code:
double a[VSIZE], b[VSIZE];
double sum;

// Uspostavljanje a, b...

// Štoperica počinje ovde.
sum = 0.0;
for(i = 0; i < VSIZE; ++i) {
    sum += a[i] * b[i];
}
// Štoperica staje ovde.

Zatim se ovaj kôd vrti za različite veličine vektora, da bi se iscrtao grafik zavisnosti broja operacija u pokretnom zarezu (FLOP) u sekundi od veličine vektora. Kao ovde. U njemu se ogleda brzina FPU-a procesora, brzina, veličina i broj keševa, i brzina memorije. Kada se izvršava paralelno, onda se rezultat može uporediti sa jednoprocesorskim, odnosno proveriti ubrzanje po segmentima x-ose.

Ceo program u prilogu, zajedno sa skripticom za crtanje grafika (mora da bude instaliran Gnuplot i Imejdžmedžik, tj. naredbe gnuplot i convert u putanji). OpenMP podrazumevno račva onoliko niti koliko ima procesora (tj. jezgara), a određen broj može se zadati promenljivom okruženja OMP_NUM_THREADS:
Code:
$ gcc test-02.c -O3 -fopenmp
$ OMP_NUM_THREADS=1 ./a.out > t1.dat
$ OMP_NUM_THREADS=2 ./a.out > t2.dat
$ OMP_NUM_THREADS=4 ./a.out > t4.dat
$ ./test-02-plot.py t1.dat t2.dat t4.dat
t1~t2~t4.png
$


Ovo je uzgred prvo odmeravanje koje vam pokažu na vežbama, da odmah shvatite koliko je jedan jedini broj kao mera „brzine procesora“ besmislen :) Bar na C2D-u, gornji grafik će pokazati da su za euklidski skalarni proizvod sva jezgra preko jednog bespotrebna, jer i to jedno potpuno zaguši memorijsku magistralu čim veličina vektora premaši kapacitet keša. A to znači, bespotrebna za sve proračune koji uključuju velike sisteme linearnih jednačina (npr. naučno-inženjerske simulacije).

No, da se ne bismo štrecali, probe mogu da se pokreću i sa ./a.out 1, za upotrebu drugog, hipotetičkog (mada beskorisnog) skalarnog proizvoda, ali takvog da izvodi mnogo više računskih operacija po jednom dohvatanju iz memorije. Tada ne dolazi do zagušenja memorije (bar s dve niti, nemam četvorojezgarni procesor pri ruci), i dobija se reklamirano ubrzanje.
Sviđa mi se1
Re: Test Brzine procesora - "besposlen pop jarice krsti" 10.11.2008. u 22:22 · pre 218 meseci #98
evo da dopunim svoju poruku
kao sto sam napisao, u pitanju je 32-bitni Kubuntu 8.04
koristio sam cputest koji je postavio combuster na prvoj strani http://www.elitesecurity.org/p2092218

masina je dual 2 core
model : 15
model name : Intel(R) Pentium(R) Dual CPU T2330 @ 1.60GHz
model : 15
model name : Intel(R) Pentium(R) Dual CPU T2330 @ 1.60GHz
cache size : 1024 KB
cache size : 1024 KB
2GB RAM

i rezultati su sledeci:
sloba@sloba-laptop:~/Desktop$ time ./cputest
25 percent done:
50 percent done:
75 percent done:
100 percent done - Test completed!

real 0m8.247s
user 0m8.233s
sys 0m0.004s

i preko gkreallm i htop vidim da samo opterecuje prvo jezgro...

sto se tice kompajliranja to nisam nikad probao pa ako neko zeli nek pusti na pm objasnjenje kako da odradim, ako je vama bitno...


Re: Test Brzine procesora - "besposlen pop jarice krsti" 11.11.2008. u 03:39 · pre 218 meseci
izmenjeno 2 puta, poslednji put Branimir Maksimovic 11.11.2008. u 08:32
  1. Branimir Maksimovic11.11.2008. u 08:32zapis iz teksta poruke
  2. Branimir Maksimovic11.11.2008. u 07:25zapis iz teksta poruke
#99
Citat:

Ovim će samo jedan procesor (tj. jezgro) rezervisati svu memoriju, što posle može iskvariti performanse ako postoji „afinitet“ memorije po procesoru, tj. ako svaki procesor ima deo memorije kojem najbrže pristupa. Zato, za svaki slučaj, uspostavljanje memorije kad god može treba da ide paralelno na isti način kao i izračunavanje.



Tacno, ali to nece ti biti dovoljno posto moras da znas koji memorijski deo pripada jednom, drugom trecem
procesoru i da alociras tako. Takodje onda moras da bindujes threadove za odredjene procesore
koji su alocirali date blokove, tj ne mozes blok1 da izvrsavas na procesoru2,
a to ne mozes ni sa malloc ni sa calloc niti mozes to da radis preko omp-a koji izvlaci najgore
moguce performanse iz numa arhitekture ),vec sa libnuma na linux-u
i pthreads ako cemo vec tako ;)

Drugo program ti ne skalira bas najbolje, identicne su mi performanse i sa 1 , 2 i 4 threada.
edit: Mada u stvari, ovde bi tako i trebalo da bude posto je jedan bus, i u mjom primeru
mislim da bi 1 thread radio isto kao i 2 ili 4 posto je jedan procesor dovoljan da se saturise
bus, vec drugi mora da deli isti bus pa se ne dobija nista.
edit2: ali definitivno nesto ne valja posto time komanda vraca isto vreme i kad su jedan i kad su dva
threada a imam dual, a meris samo read?
edit3: na osnovu merenja se vidi da omp ima neki overhead koji se eliminise kad je veci
broj ciklusa i to je to, i jos imas efekat kad podaci staju u cache i kad ne staju ;)
E sad sta u stvari meris ovim benchmarkom ;)? brzinu cache-a, memorije? ili procesora.
Cilj bench-a je da se vidi koliko vremena treba nekoj konfiguraciji da to odradi,
a na amd-ovima ti nece nista brze raditi posto ne setujes afinitet i ne alociras
po numa nodama, mada ionako sa dva cpu-a to se i ne primeti.
I na kraju interesantno je sto u globalu program ima isto vreme izvrsavanja za sve kombinacije,
ali to je verovatno zbog toga sto sinhronizujes na vreme izvrsavanja petlje.

Pozdrav!

bmaxa@maxa:~$ time OMP_NUM_THREADS=1 ./flops
# Selected loop: 0
# VSIZE [*] SPEED [MFLOPS] SUMSUM [*]
100 474 16.7
200 807 33.3
500 1315 83.3
1000 1639 166.7
2000 1853 333.3
5000 2076 833.3
10000 2166 1666.7
20000 2264 3333.3
50000 2297 8333.3
100000 2288 16666.7
200000 2287 33333.3
500000 1211 83333.3
1000000 1109 166666.7
2000000 1113 333333.3
5000000 1129 833333.3
10000000 1132 1666666.7

real 0m31.833s
user 0m29.446s
sys 0m2.360s
bmaxa@maxa:~$ time OMP_NUM_THREADS=2 ./flops
# Selected loop: 0
# VSIZE [*] SPEED [MFLOPS] SUMSUM [*]
100 40 16.7
200 85 33.3
500 175 83.3
1000 382 166.7
2000 688 333.3
5000 1108 833.3
10000 1733 1666.7
20000 1766 3333.3
50000 2531 8333.3
100000 2966 16666.7
200000 2896 33333.3
500000 1314 83333.3
1000000 1133 166666.7
2000000 1109 333333.3
5000000 1103 833333.3
10000000 1143 1666666.7

real 0m31.645s
user 0m26.870s
sys 0m9.573s

a evo i za drugu petlju:

bmaxa@maxa:~$ time OMP_NUM_THREADS=2 ./flops 1
# Selected loop: 1
# VSIZE [*] SPEED [MFLOPS] SUMSUM [*]
100 624 20.9
200 899 41.8
500 1340 104.6
1000 1878 209.2
2000 2369 418.4
5000 2434 1046.0
10000 2780 2092.0
20000 2800 4184.0
50000 2269 10460.0
100000 3138 20920.0
200000 2284 41839.9
500000 2287 104599.8
1000000 2931 209199.6
2000000 3934 418399.2
5000000 3928 1045997.9
10000000 3970 2091995.8

real 0m32.107s
user 0m35.638s
sys 0m3.908s
bmaxa@maxa:~$ time OMP_NUM_THREADS=1 ./flops 1
# Selected loop: 1
# VSIZE [*] SPEED [MFLOPS] SUMSUM [*]
100 1805 20.9
200 2046 41.8
500 2182 104.6
1000 2224 209.2
2000 2251 418.4
5000 2268 1046.0
10000 2270 2092.0
20000 2222 4184.0
50000 2260 10460.0
100000 2282 20920.0
200000 2297 41839.9
500000 2228 104599.8
1000000 2221 209199.6
2000000 2296 418399.2
5000000 2298 1045997.9
10000000 2299 2091995.8

real 0m32.210s
user 0m31.654s
sys 0m0.500s
Re: Test Brzine procesora - "besposlen pop jarice krsti" 11.11.2008. u 06:07 · pre 218 meseci
izmenjeno 2 puta, poslednji put Branimir Maksimovic 11.11.2008. u 09:21
  1. Branimir Maksimovic11.11.2008. u 09:21zapis iz teksta poruke
  2. Branimir Maksimovic11.11.2008. u 06:25zapis iz teksta poruke
#100
Evo malo preradjeni test, detektuje broj procesora i dize broj threadova po tome,
ali i alocira paralelno i setuje afinitet po procesoru tako da ako je malloc numa aware
ovo bi trebalo da sljaka ok i kad je numa. Nisam bas hteo da koristim libnuma,
to bi bilo preterivanje za ovo ;)

Code:

#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>

#define BLCK_SIZE 16777216

sem_t sema,sema1;
typedef struct Data{ int blck_size,cpu; } Data_t;

void* tf(void* p)
{
  Data_t* dt = (Data_t*)p;
  int *mem=NULL;
  cpu_set_t set;
  CPU_ZERO(&set);
  CPU_SET(dt->cpu,&set);
  if(sched_setaffinity(0,sizeof(cpu_set_t),&set)<0)
    printf("set affinity failed cpu %d\n",dt->cpu);

  printf("set affinity cpu %d\n",dt->cpu);

  mem = malloc(dt->blck_size*sizeof(int));
  if(!mem)return 0;

  int j = 80;
  while(j--)
  {
    int i = 0;
    unsigned long long sum=0;
    for(;i<dt->blck_size;++i)
    {
      *(mem+i) = i;
    }
    for(i=0;i<dt->blck_size;++i)
    {
      sum += mem[i];
    }
    if(j%20==0)
    {
      printf("thread %lu, sum %llu\n",(unsigned long)pthread_self(),sum);
      sem_post(&sema);
      sem_wait(&sema1);
    }
  }
  free(mem);
  return 0;
}

static void waitT(int count)
{
  while(count--)
  {
    sem_wait(&sema);
  }
}

static void postT(int count)
{
  while(count--)
  {
    sem_post(&sema1);
  }
}

int main (int argc,char* argv[])
{
  int single=0;
  
  int numcpus=0,i;
  pthread_t* tid=NULL;
  cpu_set_t set;

  if(argc>1)single=1;

  sem_init(&sema,0,0);
  sem_init(&sema1,0,0);

  CPU_ZERO(&set);
  CPU_SET(0,&set);
  
  while(sched_setaffinity(0,sizeof(cpu_set_t),&set)==0)
  {
    ++numcpus;
    CPU_ZERO(&set);
    CPU_SET(numcpus,&set);
  }
  printf("numcpus %d\n",numcpus);  
  tid = calloc(numcpus,sizeof(pthread_t));
  Data_t dt[numcpus];
  if(single)numcpus=1;
  for(i=0;i<numcpus;++i)
  {
      dt[i].blck_size = BLCK_SIZE*4/numcpus;
      dt[i].cpu = i;
      pthread_create(tid+i,NULL,tf,dt+i);
  }
  
  waitT(numcpus);
  printf ("25 percent done:\n");
  postT(numcpus);  

  waitT(numcpus);
  printf("50 percent done:\n");
  postT(numcpus);  

  waitT(numcpus);
  printf("75 percent done:\n");
  postT(numcpus);  

  waitT(numcpus);
  printf("100 percent done - Test completed!\n");
  postT(numcpus);  

  for(i=0;i<numcpus;++i)
    pthread_join(tid[i],NULL);

  free(tid);
  sem_destroy(&sema);
  sem_destroy(&sema1);

  return 0;
}



Kompajlira se sa:
gcc -Wall -O2 -D_GNU_SOURCE -lpthread ime.c -o ime

mora _GNU_SOURCE zbog afinitija, ako nekome treba moze dodati i #include <sched.h>
mada meni nije bilo potrebno


bmaxa@maxa:~$ time ./omp 1
numcpus 2
set affinity cpu 0
thread 1092589904, sum 2251799780130816
25 percent done:
thread 1092589904, sum 2251799780130816
50 percent done:
thread 1092589904, sum 2251799780130816
75 percent done:
thread 1092589904, sum 2251799780130816
100 percent done - Test completed!

real 0m9.828s
user 0m9.641s
sys 0m0.144s
bmaxa@maxa:~$ time ./omp
numcpus 2
set affinity cpu 0
set affinity cpu 1
thread 1106848080, sum 562949936644096
thread 1115240784, sum 562949936644096
25 percent done:
thread 1106848080, sum 562949936644096
thread 1115240784, sum 562949936644096
50 percent done:
thread 1115240784, sum 562949936644096
thread 1106848080, sum 562949936644096
75 percent done:
thread 1115240784, sum 562949936644096
thread 1106848080, sum 562949936644096
100 percent done - Test completed!

real 0m8.669s
user 0m15.941s
sys 0m0.160s


edit: Dodao sam i memory read test osim samo write-a a ko hoce moze modifikovati da radi i sa
razlicitim velicinama blokova, stavio sam da se velicina rasporedi po threadovima itd
edit2: potkrala mi se greska morao sam da bacim razilicite data strukture za svaki thread ;)
dodao sam i mogucnost ako se baci neki parametar onda program racuna u samo jednom threadu.

Pozdrav!
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme