Evo i ja malo da modifikujem benchmark. Ovaj przi 256 mega rama i radi u 4 threada.
Radi korektno na izlazu, tj ispisuje 25,50,75, 100 kako zavrsi deo po deo ;)
Probajte posto se sada testira i brzina memorije.
Code:
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
#define BLCK_SIZE 16777216
sem_t sema,sema1;
void* tf(void* p)
{
int j = 80;
while(j--)
{
int i = 0;
for(;i<BLCK_SIZE;++i)
{
*((int*)p+i) = i;
}
if(j%20==0)
{
sem_post(&sema);
sem_wait(&sema1);
}
}
return 0;
}
int main ()
{
sem_init(&sema,0,0);
sem_init(&sema1,0,0);
int* mem = calloc(4,BLCK_SIZE*sizeof(int));
if(!mem)
{
printf("not enough memory\n");
return 0;
}
pthread_t tid[4];
pthread_create(tid+0,0,tf,mem+0*BLCK_SIZE);
pthread_create(tid+1,0,tf,mem+1*BLCK_SIZE);
pthread_create(tid+2,0,tf,mem+2*BLCK_SIZE);
pthread_create(tid+3,0,tf,mem+3*BLCK_SIZE);
sem_wait(&sema);
sem_wait(&sema);
sem_wait(&sema);
sem_wait(&sema);
printf ("25 percent done:\n");
sem_post(&sema1);
sem_post(&sema1);
sem_post(&sema1);
sem_post(&sema1);
sem_wait(&sema);
sem_wait(&sema);
sem_wait(&sema);
sem_wait(&sema);
printf("50 percent done:\n");
sem_post(&sema1);
sem_post(&sema1);
sem_post(&sema1);
sem_post(&sema1);
sem_wait(&sema);
sem_wait(&sema);
sem_wait(&sema);
sem_wait(&sema);
printf("75 percent done:\n");
sem_post(&sema1);
sem_post(&sema1);
sem_post(&sema1);
sem_post(&sema1);
sem_wait(&sema);
sem_wait(&sema);
sem_wait(&sema);
sem_wait(&sema);
printf("100 percent done - Test completed!\n");
sem_post(&sema1);
sem_post(&sema1);
sem_post(&sema1);
sem_post(&sema1);
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
pthread_join(tid[2],NULL);
pthread_join(tid[3],NULL);
free(mem);
sem_destroy(&sema);
sem_destroy(&sema1);
return 0;
}
Kompajlira se sa
Code:
gcc -Wall -lpthread -O2 ime.c -o ime
bmaxa@maxa:~$ gcc -Wall -lpthread -O2 omp.c -o omp
bmaxa@maxa:~$ time ./omp
25 percent done:
50 percent done:
75 percent done:
100 percent done - Test completed!
real 0m6.677s
user 0m11.761s
sys 0m0.132s
Sad bi quadovi trebali da budu najbrzi.
Pozdrav!