DETHREAD



LOG | FILES | OVERVIEW


F diff --git a/makefile b/makefile --- a/makefile +++ b/makefile
install:
- gcc -pthread main.c -o main.exe -L. -lgmp -lnuma
+ gcc -pthread main.c -o main.exe -L. -lgmp
gcc make_heavy.c -o make_heavy.exe
clear:
F diff --git a/test/executables/.place_holder b/test/executables/.place_holder new file mode 100644 --- /dev/null +++ b/test/executables/.place_holder
F diff --git a/test/inputs/.place_holder b/test/inputs/.place_holder new file mode 100644 --- /dev/null +++ b/test/inputs/.place_holder
F diff --git a/test/outputs/.place_holder b/test/outputs/.place_holder new file mode 100644 --- /dev/null +++ b/test/outputs/.place_holder
F diff --git a/test/times/.place_holder b/test/times/.place_holder new file mode 100644 --- /dev/null +++ b/test/times/.place_holder
F diff --git a/test/times/heavy/.place_holder b/test/times/heavy/.place_holder new file mode 100644 --- /dev/null +++ b/test/times/heavy/.place_holder
F diff --git a/test/times/normal/.place_holder b/test/times/normal/.place_holder new file mode 100644 --- /dev/null +++ b/test/times/normal/.place_holder
F diff --git a/threadet.c b/threadet.c --- a/threadet.c +++ b/threadet.c
mpq_t* threadet(mpq_t **matrix,size_t size,size_t number_of_threads,char verbose);
void* dethread(void* thr);
void calc_row(mpq_t **matrix,size_t size,size_t target,size_t source);
- void split_matrix(mpq_t **matrix,mpq_t ***a,mpq_t ***b,size_t size);
-
-
- void split_matrix(mpq_t **matrix,mpq_t ***a,mpq_t ***b,size_t size,size_t number_of_threads,char verbose)
- {
- size_t i;
- size_t j;
- size_t k;
- /* shared thread parameters */
- struct Pair_Dispenser thr;
- /* swap */
- mpq_t *hold;
- /* array of the threads we are executing. We are going to join these every column of the matrix cleaned because it is a very convinient sync.*/
- pthread_t* threds;
- /* result is accumulated here */
- mpq_t *res;
- /* placeholder for thread return values. They all return NULL but join() requires a pointer to store return */
- void **temp;
- /* we can't clean a column with a zero so we swap a impotent column with a column with a non zero value ( if there is such) */
- char sign;
- /* timers REALTIME CLOCK could be fooled by an administrator changing the system time, but is the only guaranteed clock in the posix standart*/
- struct timespec pass_start,pass_finish;
- struct timespec start,finish;
-
- if(verbose==1)
- {
- clock_gettime(CLOCK_REALTIME,&start);
- }
-
-
-
- threds=malloc(sizeof(pthread_t*) * number_of_threads);
- res=malloc(sizeof(mpq_t));
- temp = malloc(sizeof(void*));
-
- Pair_Dispenser_Init(&thr,size,matrix,verbose);
- mpq_init(*res);
- thr.current.target_row=1;
- sign=1;
-
- for(i=0;i<size;++i)
- {
- /* if the row can't be used to clean the column search for one that can */
- if(mpq_sgn(matrix[i][i])==0)
- {
- for(j=i+1;j<=size && mpq_sgn(matrix[j][i])==0;++j);
- if(j>size)
- {
- mpq_set_d(*res,0);
-
- free(threds);
- free(temp);
- if(verbose == 1)
- {
- clock_gettime(CLOCK_REALTIME,&finish);
- finish.tv_sec-=start.tv_sec;
- finish.tv_nsec-=start.tv_nsec;
- printf("TIME: %f\n",(double)(finish.tv_sec + 0.000000001*finish.tv_nsec));
- }
- return res;
- }else
- {
- hold = matrix[j];
- matrix[j] = matrix[i];
- matrix[i] = hold;
- /* change the sign approprietly */
- sign = (sign + (j-i)%2)%2;
- }
- }
- if(verbose==1)
- {
- clock_gettime(CLOCK_REALTIME,&pass_start);
- }
- /* clean the i-th row this is one pass*/
-
- k=((number_of_threads<size-i)?number_of_threads:size-i);
- for(j=0;j<k;++j)
- {
- pthread_create(threds+j,NULL,dethread,&thr);
- }
- /* wait for all the threads to finish calculating this is the second 1/2 that could slow down parallel execution*/
-
- /* critical part */
- for(j=0;j<k;++j)
- {
- pthread_join(threds[j],temp);
- }
- /* critical part */
-
- if(verbose == 1)
- {
- clock_gettime(CLOCK_REALTIME,&pass_finish);
- pass_finish.tv_sec-=pass_start.tv_sec;
- pass_finish.tv_nsec-=pass_start.tv_nsec;
- printf("A pass has finished, taking: %f seconds\n\n",(double)(pass_finish.tv_sec + 0.000000001*pass_finish.tv_nsec));
- }
-
- thr.current.target_row = (++thr.current.source_row) + 1;
-
- }
-
- }
/*
* here the process creates and dispatches number_of_threads threads
*/