Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <time.h>
- #include <pthread.h>
- #include <stdlib.h>
- #include <string.h>
- //#define MAX_SIZE 4096
- #define MAX_SIZE 16
- typedef double matrix[MAX_SIZE][MAX_SIZE];
- matrix A; /*matrix A*/
- int N; /*matrix size*/
- int maxnum; /*max number of element*/
- char *Init; /*matrix init type*/
- int PRINT; /*print or not*/
- double b[MAX_SIZE]; /*vector b*/
- double y[MAX_SIZE]; /*vector y*/
- typedef struct _Data
- {
- int row,col;
- }Data;
- pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- //int Read_Options(int argc, char **argv);
- void Init_Default();
- void *function(void *arg);
- void Init_Matrix();
- void Print_Matrix();
- int Read_Options(int, char**);
- void work(void);
- int main(int argc, char *argv[])
- {
- Init_Default();
- Read_Options(argc, argv);
- Init_Matrix();
- /*
- int NUM_THREADS, i;
- NUM_THREADS=8;
- pthread_t threads[NUM_THREADS];
- int threadsInt[NUM_THREADS];
- Data dat[NUM_THREADS];
- int step;
- step=MAX_SIZE/8;
- for(i=0;i<NUM_THREADS;i++)
- {
- dat[i].col=i*step;
- dat[i].row=i*step;
- threadsInt[i] = pthread_create(&threads[i], NULL, function, &dat[i]);
- if(threadsInt[i])
- {
- fprintf(stderr,"Error - pthread_create() return code: %d\n",threadsInt[i]);
- exit(EXIT_FAILURE);
- }
- }
- int k;
- for(k=0;k<NUM_THREADS;k++)
- {
- pthread_join(threads[k], NULL);
- }
- */
- printf("\nprintInnanWork : %d", PRINT);
- work();
- printf("\nPrintEfterWOrk : %d", PRINT);
- if(PRINT==1)
- Print_Matrix();
- return 0;
- }
- void work(void)
- {
- int i,j,k;
- printf("print i work : %d", PRINT);
- for(k=0;k<N;k++)
- {
- for(j=k+1;j<N;j++)
- A[k][j]=A[k][j]/A[k][k];
- y[k]=b[k]/A[k][k];
- A[k][k]=1.0;
- printf("\nPRint mitt i work : %d\n", PRINT);
- for(i=k+1;i<N;i++)
- for(j=k+1;j<N;j++)
- A[i][j]=A[i][j]-A[i][k]*A[k][j];
- b[i]=b[i]-A[i][k]*y[k];
- A[i][k]=0.0;
- }
- printf("print i slutet utav work : %d", PRINT);
- }
- void *function(void *arg)
- {
- pthread_mutex_lock(&mutex);
- Data *test =(Data*)arg;
- int step;
- step=MAX_SIZE/8;
- int i, j;
- for(i=test->col;i<(test->col+step);i++)
- {
- printf("i: %d\n", i);
- }
- //printf("row & col: %d \t %d\n", test->row, test->col);
- pthread_mutex_unlock(&mutex);
- }
- void Init_Default()
- {
- /* N=2048;
- Init = "rand";
- maxnum=15.0;
- PRINT=0;
- */
- N=16;
- Init="fast";
- maxnum=15.0;
- PRINT=0;
- }
- void Init_Matrix()
- {
- int i,j;
- printf("\nsize = %d,x%d", N, N);
- printf("\nmaxnum = %d\n", maxnum);
- printf("Init =%s\n", Init);
- printf("Initializing matrix..");
- if(strcmp(Init, "rand")==0)
- {
- for(i=0;i<N;i++)
- {
- for(j=0;j<N;j++)
- {
- if(i==j) /*diagonal dominance*/
- A[i][j]=(double)(rand() % maxnum) + 5.0;
- else
- A[i][j]=(double)(rand() % maxnum) +1.0;
- }
- }
- }
- if(strcmp(Init, "fast")==0)
- {
- for(i=0;i<N;i++)
- {
- for(j=0;j<N;j++)
- {
- if(i==j) /*diagonal dominance*/
- A[i][j]=5.0;
- else
- A[i][j]=2.0;
- }
- }
- }
- /*Initialize vector b & y */
- for(i=0;i<N;i++)
- {
- b[i]=2.0;
- y[i]=1.0;
- }
- printf("Done\n\n");
- /*
- if(PRINT==1)
- Print_Matrix();
- */
- }
- void Print_Matrix()
- {
- int i,j;
- printf("\ni print matrix\n");
- printf("Matrix A:\n");
- for(i=0;i<N;i++)
- {
- printf("[");
- for(j=0;j<N;j++)
- {
- printf("%5.2f,", A[i][j]);
- }
- printf("]\n");
- }
- printf("Vector B:\n[");
- for(j=0;j<N;j++)
- printf("%5.2f,",b[j]);
- printf("]\n");
- printf("Vector Y:\n[");
- for(j=0;j<N;j++)
- printf("%5.2f,",y[j]);
- printf("]\n");
- printf("\n\n");
- }
- int Read_Options(int argc, char **argv)
- {
- char *prog;
- prog =*argv;
- while(++argv, --argc > 0)
- if(**argv == '-')
- {
- switch(*++*argv)
- {
- case 'n':
- --argc;
- N = atoi(*++argv);
- break;
- case 'h':
- printf("\nHELP: try sor -u \n\n");
- exit(0);
- break;
- case 'u':
- printf("\nUsage: sor [-n problemsize]\n");
- printf(" [-D] show default values\n");
- printf(" [-h] help \n");
- printf(" [-I init_type] fast/rand\n");
- printf(" [-m maxnum] max random nr\n");
- printf(" [-P print_switch] 0/1\n");
- exit(0);
- break;
- case 'D':
- printf("\nDefault: n =%d", N);
- printf("\n Init =rand");
- printf("\n maxnum =5");
- printf("\n P =0\n\n");
- exit(0);
- break;
- case 'I':
- --argc;
- Init = *++argv;
- break;
- case 'm':
- --argc;
- maxnum=atoi(*++argv);
- break;
- case 'p':
- --argc;
- PRINT=atoi(*++argv);
- break;
- default:
- printf("%s: ignored option: -%s\n", prog, *argv);
- printf("Help: try %s -u \n\n", prog);
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement