Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <pthread.h>
- #include <stdio.h>
- #include <stdlib.h>
- int **x,**y, **z;
- int NUM_THREADS;
- int SIZE;
- void error()
- {
- fprintf(stderr,"Malloc fail!");
- exit(3);
- }
- void generateMatrix()
- {
- int i,j;
- if((x = malloc(sizeof(int*)*SIZE))==NULL)error();
- if((y = malloc(sizeof(int*)*SIZE))==NULL)error();
- if((z = malloc(sizeof(int*)*SIZE))==NULL)error();
- for(i=0;i<SIZE;i++)
- {
- if((x[i] = malloc(sizeof(int)*SIZE))==NULL)error();
- if((y[i] = malloc(sizeof(int)*SIZE))==NULL)error();
- if((z[i] = malloc(sizeof(int)*SIZE))==NULL)error();
- }
- for(i=0;i<SIZE;i++)
- for(j=0;j<SIZE;j++)
- {
- x[i][j] = 1;
- y[i][j] = 1;
- }
- }
- void *compute(void *arg)
- {
- int tid = (int) arg;
- int i,j,k,BOUND;
- /* Calculate boundary */
- BOUND = (SIZE/NUM_THREADS)*(tid + 1);
- printf("tid:%d\tbound:%d\n",tid,BOUND);
- for(i=0;i<SIZE;i++)
- {
- j=tid*(SIZE/NUM_THREADS);
- for(;j<BOUND;j++)
- {
- z[i][j] = 0;
- for(k=0;k<SIZE;k++)
- {
- z[i][j] += x[i][k] * y[k][j];
- if(z[i][j] == -7)
- printf("z[%d][%d]=%d,x[%d][%d]=%d,y[%d][%d]=%d\n",i,j,z[i][j],i,k,x[i][k],k,j,y[k][j]);
- }
- }
- }
- pthread_exit((void *)arg);
- }
- int main(int argc, const char *argv[])
- {
- int i,j, ret;
- FILE *ofp;
- pthread_t threads[NUM_THREADS];
- pthread_attr_t attr;
- void *status;
- if(argc == 3)
- {
- SIZE = atoi(argv[1]);
- NUM_THREADS = atoi(argv[2]);
- }
- else
- exit(-2);
- generateMatrix();
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
- for(i=0;i<NUM_THREADS;i++)
- {
- printf("Thread %d is created\n",i);
- ret = pthread_create(&threads[i], NULL, compute, (void *) i);
- if(ret)
- {
- fprintf(stderr, "Thread creation failed!\n");
- exit(ret);
- }
- }
- //pthread_attr_destroy(&attr);
- for(i=0;i<NUM_THREADS;i++)
- {
- ret = pthread_join(threads[i], &status);
- if(ret)
- {
- fprintf(stderr,"Thread join failed! status:%d\n",ret);
- exit(ret);
- }
- printf("Thread %d join with main thread with status=%ld\n",i,(long)status);
- }
- ofp = fopen("output.txt","w");
- if(ofp == NULL)
- {
- fprintf(stderr, "Can't open output file");
- exit(1);
- }
- for(i=0;i<SIZE;i++)
- {
- for(j=0;j<SIZE;j++)
- fprintf(ofp,"%d ", z[i][j]);
- fprintf(ofp,"\n");
- }
- fclose(ofp);
- for(i=0;i<SIZE;i++)
- {
- free(x[i]);
- free(y[i]);
- free(z[i]);
- }
- pthread_exit(NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment