aboutsummaryrefslogtreecommitdiffstats
path: root/threadet.c
diff options
context:
space:
mode:
authorGalin Simeonov <gts@volconst.com>2021-09-27 13:31:04 +0300
committerGalin Simeonov <gts@volconst.com>2021-09-27 13:31:04 +0300
commitabe121ae704208c0c32689f59afcdaa043447421 (patch)
treede558d2b14c0bb7dd27199acf9ce74540584a367 /threadet.c
parent6d6b540f5821dfa4fcf15680ae50e6a4056def25 (diff)
downloaddethread-abe121ae704208c0c32689f59afcdaa043447421.tar.gz
Seems to work nowHEADmaster
Diffstat (limited to 'threadet.c')
-rw-r--r--threadet.c102
1 files changed, 0 insertions, 102 deletions
diff --git a/threadet.c b/threadet.c
index f1cdfd2..d413ff1 100644
--- a/threadet.c
+++ b/threadet.c
@@ -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
*/