C Programming Tutorial

 
 
 
 

Image

# include<stdio.h>
# include \"/usr/include/sys/types.h\"
# include \"/usr/include/sys/shm.h\"
# include \"/usr/include/sys/ipc.h\"
# include \"/usr/include/sys/sem.h\"
# include \"sharedlib.h\"
# include \"forkjoin.h\"
# include \"spinlock.h\"
# include \"barrier.h\"
main()
{    
    int MatRows,MatCols;
    int iCount,jCount;    
    int Mat[10][10];
    int Vect[10];

    int shmid1,shmid2,shmid3;    
    int nProc=16,id;

    int *bararr;    // Barrier Array
    int *temp;    // Holding Intermediate Result
    int *resVect;    // Result Vector

    printf(\"Enter Number of Rows :\");
    scanf(\"%d\",&MatRows);

    printf(\"Enter Number of Columns :\");
    scanf(\"%d\",&MatCols);

    printf(\"\\n Enter Matrix Elements ... \\n\");
    for(iCount=0;iCount<MatRows;iCount++)
    {        
        for (jCount=0;jCount<MatCols;jCount++)
        {
            printf(\"Mat[%d][%d] :\",iCount,jCount);
            scanf(\"%d\",&Mat[iCount][jCount]);
        }
    }

    printf(\"\\n Enter Vector Elements ... \\n\");
    for(iCount=0;iCount<MatCols;iCount++)
    {
        printf(\"Vect [%d] :\",iCount);
        scanf(\"%d\",&Vect[iCount]);
    }

    bararr=(int *)sshared(sizeof(int)*nProc,&shmid1);    
    resVect=(int *)sshared(sizeof(int)*MatRows,&shmid2);
    temp=(int *)sshared(sizeof(int)*nProc,&shmid3);

    //Initializing 4 barriers i.e. bar[0],bar[4],bar[8],bar[12] 

    for(iCount=0;iCount<4;iCount++)
    {
        barrier_init(&bararr[4*iCount],4);
    }

    id=process_fork(nProc);

    for(iCount=id/4;iCount<MatRows;iCount+=nProc/4)
    {
        temp[id]=0;
        resVect[iCount]=0;
        for(jCount=id%4;jCount<MatCols;jCount+=4)
        {
            temp[id]+=Mat[iCount][jCount] * Vect[jCount];
        }

        /* 
           Wait For Processes So that,
           they Can Finish Partial Calcuation 
        */        
        barrier(&bararr[(id/4)*4]);

        if (id%4==0)
        {
            resVect[iCount]+=temp[id]+temp[id+1]+temp[id+2]+temp[id+3];
        }

        /* 
           Barrier to Avoid Race Condition, 
           Wait Until all Processes add their 
           Partial Sum to resVect 
        */        
        barrier(&bararr[(id/4)*4]);
    }

    process_join(nProc,id);

    printf(\"\\n Matrix ...\\n\");    
    for(iCount=0;iCount<MatRows;iCount++)
    {
        for(jCount=0;jCount<MatCols;jCount++)
        {
            printf(\"%d\\t\",Mat[iCount][jCount]);
        }
        printf(\"\\n\");
    }

    printf(\"\\n Vector ...\\n\");
    for(iCount=0;iCount<MatCols;iCount++)
    {
        printf(\"%d\\n\",Vect[iCount]);
    }

    printf(\"\\n Result Vector ...\\n\");
    for(iCount=0;iCount<MatRows;iCount++)
    {
        printf(\"%d\\n\",resVect[iCount]);
    }

    cleanup_memory(&shmid1);
    cleanup_memory(&shmid2);
    cleanup_memory(&shmid3);    
}