⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cs072.c

📁 This code can use to multiply two matrices in Parallel computer enviroment.c
💻 C
字号:
//Run the programme with Number of threads as a parameter ex : ./test 4 
 


#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>

#define MAX_THREAD 20

#define NDIM 512

double          a[NDIM][NDIM];
double          b[NDIM][NDIM];
double          c[NDIM][NDIM];

typedef struct
{
        int             id;
        int             noproc;
        int             dim;
        double  (*a)[NDIM][NDIM],(*b)[NDIM][NDIM],(*c)[NDIM][NDIM];
}       parm;



void multiply(int me_no, int noproc, int n, double a[NDIM][NDIM], double b[NDIM][NDIM], double c[NDIM][NDIM])
{

        int             i,j,k;
        double sum;
        i=me_no;
        while (i<n) {

                for (j = 0; j < n; j++) {
                        sum = 0.0;
                        for (k = 0; k < n; k++) {
                                sum = sum + a[i][k] * b[k][j];
                        }
                        c[i][j] = sum;

                }
                i+=noproc;
        }
}

void * slave(void *arg)
{
        parm           *p = (parm *) arg;
        multiply(p->id, p->noproc, p->dim, *(p->a), *(p->b), *(p->c));
}

double gettime() {
        struct timeval t;
        gettimeofday(&t, NULL);
        return (double)t.tv_sec+t.tv_usec*0.000001;
}


int main(int argc, char *argv[])
{
        int             j, k, noproc, me_no;
        double          sum;
        double          t1, t2;

        pthread_t      *threads;

        parm           *arg;
        int             n, i;

        n = atoi(argv[1]);
        if(argc != 2)
        {
                printf("Usage: %s n\n  where n is no. of thread\n", argv[0]);
                exit(1);
        }
        for (i = 0; i < NDIM; i++)
                for (j = 0; j < NDIM; j++)
                {
                        a[i][j] = i + j;
                        b[i][j] = i + j;
                }



        if ((n < 1) || (n > MAX_THREAD))
        {
                printf("The no of thread should between 1 and %d.\n", MAX_THREAD);
                exit(1);
        }
        threads = (pthread_t *) malloc(n * sizeof(pthread_t));

        arg=(parm *)malloc(sizeof(parm)*n);
        t1 = gettime();
        /* setup barrier */

        /* Start up thread */

        /* Spawn thread */
        printf("Threads creating.....\n");
        for (i = 0; i < n; i++)
        {
                arg[i].id = i;
                arg[i].noproc = n;
                arg[i].dim = NDIM;
                arg[i].a = &a;
                arg[i].b = &b;
                arg[i].c = &c;
                pthread_create(&threads[i], NULL,slave, (void *)(arg+i));
        }

        printf("Threads created..\n");
        printf("Threads joining....\n");
        for (i = 0; i < n; i++)
        {
                pthread_join(threads[i], NULL);


        }
        printf("Threads joined...\n");
        t2 = gettime();
        // print_matrix(NDIM); 
        check_matrix(NDIM);
        free(arg);
        printf("Matrix Multiplication takes %4f seconds\n",t2-t1);
        return 0;
}

print_matrix(dim)
int dim;
{
        int i,j;

        printf("The %d * %d matrix is\n", dim,dim);
        for(i=0;i<dim;i++){
                for(j=0;j<dim;j++)
                        printf("%lf ",  c[i][j]);
                printf("\n");
        }
}

check_matrix(dim)
int dim;
{
        int i,j,k;
        int error=0;

        //printf("Now checking the results\n");
        for(i=0;i<dim;i++)
                for(j=0;j<dim;j++) {
                        double e=0.0;

                        for (k=0;k<dim;k++)
                                e+=a[i][k]*b[k][j];

                        if (e!=c[i][j]) {
                                printf("(%d,%d) error\n",i,j);
                                error++;
                        }
                }
        if (error)
                printf("%d elements error\n",error);
                else
                printf("success\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -