diff options
author | Galin Simeonov <gts@volconst.com> | 2021-09-27 13:31:04 +0300 |
---|---|---|
committer | Galin Simeonov <gts@volconst.com> | 2021-09-27 13:31:04 +0300 |
commit | abe121ae704208c0c32689f59afcdaa043447421 (patch) | |
tree | de558d2b14c0bb7dd27199acf9ce74540584a367 /threadet.c | |
parent | 6d6b540f5821dfa4fcf15680ae50e6a4056def25 (diff) | |
download | dethread-abe121ae704208c0c32689f59afcdaa043447421.tar.gz |
Diffstat (limited to 'threadet.c')
-rw-r--r-- | threadet.c | 102 |
1 files changed, 0 insertions, 102 deletions
@@ -15,108 +15,6 @@ 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 */ |