Guest User

Pthread Matrix Multiplication (broken)

a guest
Sep 15th, 2010
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.83 KB | None | 0 0
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int **x,**y, **z;
  6. int NUM_THREADS;
  7. int SIZE;
  8.  
  9. void error()
  10. {
  11.     fprintf(stderr,"Malloc fail!");
  12.     exit(3);
  13. }
  14.  
  15. void generateMatrix()
  16. {
  17.     int i,j;
  18.     if((x = malloc(sizeof(int*)*SIZE))==NULL)error();
  19.     if((y = malloc(sizeof(int*)*SIZE))==NULL)error();
  20.     if((z = malloc(sizeof(int*)*SIZE))==NULL)error();
  21.    
  22.     for(i=0;i<SIZE;i++)
  23.     {
  24.         if((x[i] = malloc(sizeof(int)*SIZE))==NULL)error();
  25.         if((y[i] = malloc(sizeof(int)*SIZE))==NULL)error();
  26.         if((z[i] = malloc(sizeof(int)*SIZE))==NULL)error();
  27.     }
  28.  
  29.     for(i=0;i<SIZE;i++)
  30.         for(j=0;j<SIZE;j++)
  31.         {
  32.             x[i][j] = 1;
  33.             y[i][j] = 1;
  34.         }
  35. }
  36.  
  37. void *compute(void *arg)
  38. {
  39.     int tid = (int) arg;
  40.     int i,j,k,BOUND;
  41.  
  42.     /* Calculate boundary */
  43.     BOUND = (SIZE/NUM_THREADS)*(tid + 1);
  44.  
  45.     printf("tid:%d\tbound:%d\n",tid,BOUND);
  46.  
  47.     for(i=0;i<SIZE;i++)
  48.     {
  49.         j=tid*(SIZE/NUM_THREADS);
  50.         for(;j<BOUND;j++)
  51.         {
  52.             z[i][j] = 0;
  53.             for(k=0;k<SIZE;k++)
  54.             {
  55.                 z[i][j] += x[i][k] * y[k][j];
  56.                 if(z[i][j] == -7)
  57.                     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]);
  58.             }
  59.         }
  60.     }
  61.  
  62.     pthread_exit((void *)arg);
  63. }
  64.  
  65. int main(int argc, const char *argv[])
  66. {
  67.     int i,j, ret;
  68.     FILE *ofp;
  69.     pthread_t threads[NUM_THREADS];
  70.     pthread_attr_t attr;
  71.     void *status;
  72.  
  73.     if(argc == 3)
  74.     {
  75.         SIZE = atoi(argv[1]);
  76.         NUM_THREADS = atoi(argv[2]);
  77.     }
  78.     else
  79.         exit(-2);
  80.  
  81.     generateMatrix();
  82.  
  83.     pthread_attr_init(&attr);
  84.     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  85.  
  86.     for(i=0;i<NUM_THREADS;i++)
  87.     {
  88.         printf("Thread %d is created\n",i);
  89.         ret = pthread_create(&threads[i], NULL, compute, (void *) i);
  90.         if(ret)
  91.         {
  92.             fprintf(stderr, "Thread creation failed!\n");
  93.             exit(ret);
  94.         }
  95.     }
  96.  
  97.     //pthread_attr_destroy(&attr);
  98.     for(i=0;i<NUM_THREADS;i++)
  99.     {
  100.        ret = pthread_join(threads[i], &status);
  101.        if(ret)
  102.        {
  103.            fprintf(stderr,"Thread join failed! status:%d\n",ret);
  104.            exit(ret);
  105.        }
  106.        printf("Thread %d join with main thread with status=%ld\n",i,(long)status);
  107.     }
  108.  
  109.     ofp = fopen("output.txt","w");
  110.     if(ofp == NULL)
  111.     {
  112.         fprintf(stderr, "Can't open output file");
  113.         exit(1);
  114.     }
  115.  
  116.     for(i=0;i<SIZE;i++)
  117.     {
  118.         for(j=0;j<SIZE;j++)
  119.             fprintf(ofp,"%d ", z[i][j]);
  120.         fprintf(ofp,"\n");
  121.     }
  122.  
  123.     fclose(ofp);
  124.     for(i=0;i<SIZE;i++)
  125.     {
  126.         free(x[i]);
  127.         free(y[i]);
  128.         free(z[i]);
  129.     }
  130.     pthread_exit(NULL);
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment