[mpich-discuss] Parallel quick sort

Irfan Gul hungu.orakzai at gmail.com
Tue May 17 01:36:53 CDT 2011


#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#define  TRUE 1
#include "math.h"
#include <time.h>
int IncOrder(const void *e1, const void *e2 )
    {
          return (*((int *)e1) - *((int *)e2));
    }

DisplayError(char *str)
{
    printf("Error: %s \n",str);
}

int Partition(int *arr, int left, int right) {
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
/* partition */
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
return j;
}

int PowerOf2(int num)
{
    int i;

    i=1;

    while(num>0)
    {
        num--;
        i=i*2;
    }

    return i;
}


PQuickSort(int *Array,int start,int end,int m,int id,int MyRank)
{
    int j;
    int r;
    int LocalLength;
    int *tmp;
    //int newsize;
    MPI_Status status;
    LocalLength=-1;

    if(m==0)
{
    if(MyRank==id)

    qsort(Array, end-start, sizeof *Array, IncOrder);
    return 0;
}

if(MyRank==id)
{
    r=Partition(Array,start,end);
    LocalLength=end-r;
MPI_Send(&LocalLength,1,MPI_INT,id+PowerOf2(m-1),MyRank,MPI_COMM_WORLD);

if(LocalLength!=0)

MPI_Send(Array+r+1,LocalLength,MPI_INT,id+PowerOf2(m-1),MyRank,MPI_COMM_WORLD);
    }

    if(MyRank==id+PowerOf2(m-1))
    {
        MPI_Recv(&LocalLength,1,MPI_INT,id,id,MPI_COMM_WORLD,&status);

       if(LocalLength!=0)
        {
             tmp=(int *)malloc(LocalLength*sizeof(int));
             if(tmp==0)
                 DisplayError("Malloc memory error!");

MPI_Recv(tmp,LocalLength,MPI_INT,id,id,MPI_COMM_WORLD,&status);
        }
    }

    j=r-1-start;
    MPI_Bcast(&j,1,MPI_INT,id,MPI_COMM_WORLD);
    if(j>0)
        PQuickSort(Array,start,r-1,m-1,id,MyRank);

    j=LocalLength;
    MPI_Bcast(&j,1,MPI_INT,id,MPI_COMM_WORLD);
    if(j>0)
        PQuickSort(tmp,0,LocalLength-1,m-1,id+PowerOf2(m-1),MyRank);

    if((MyRank==id+PowerOf2(m-1)) && (LocalLength!=0))

MPI_Send(tmp,LocalLength,MPI_INT,id,id+PowerOf2(m-1),MPI_COMM_WORLD);

    if((MyRank==id) && (LocalLength!=0))
        MPI_Recv(Array+r+1,LocalLength,MPI_INT,id+PowerOf2(m-1),id+PowerOf2
(m-1),MPI_COMM_WORLD,&status);

}

int LogBase2(int num)
{
    int i, j;

    i=1;
    j=2;

    while(j<num)
    {
        j=j*2;
        i++;
    }

    if(j>num)
        i--;

    return i;
}


main(int argc,char *argv[])
{
    int     ArraySize;
    int     *Array;
    int    MyRank, npes;
    int     i;
    int     m ;
    double     t1,t2,t3;


    //MPI_Status status;
    MPI_Init(&argc,&argv);

    MPI_Comm_rank(MPI_COMM_WORLD,&MyRank);

    MPI_Comm_size(MPI_COMM_WORLD,&npes);

    if(MyRank==0)
    {
        ArraySize=1000000;
        printf("%d\n",ArraySize);
        Array=(int *)malloc(ArraySize*sizeof(int));

        if(Array==0)
            printf("Malloc memory error!");

        srand(396);
        for(i=0;i<ArraySize;i++)
        {
            Array[i]=(int)rand()%1000;
        }
        printf("\n");
    }

    m=LogBase2(npes);

    MPI_Bcast(&ArraySize,1,MPI_INT,0,MPI_COMM_WORLD);
        t1=MPI_Wtime();
    PQuickSort(Array,0,ArraySize-1,m,0,MyRank);
        t2=MPI_Wtime();
        t3=t2-t1;

    if(MyRank==0)
    {
        for(i=0;i<ArraySize;i++)
        {
            printf("%10d",Array[i]);
                printf("\t");
        }
        printf("\n");
    printf("MPI_time :%6.3f\n",t3);

    }

    MPI_Finalize();
    return 0;
}

when I increase the number of process this code take more time. :(
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/mpich-discuss/attachments/20110517/32691af1/attachment.htm>


More information about the mpich-discuss mailing list