Skip to content
Snippets Groups Projects
test_DistributeMatrixMondriaan.c 3.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "DistributeMat.h"
    
    struct opts Options;
    
    int main(int argc, char **argv) {
    
        struct sparsematrix A;
        long n, neps, nz, i, j, iter, ieps, t,
             maxweight, totweight, weight;
        int P, Pmax, q;
        double eps;
    
        MMSparseMatrixInit( &A );
    
        printf("Test DistributeMatrixMondriaan: ");
        n = 1000; /* n by n symmetric tridiagonal matrix A, n even*/
        neps = 4;  /* number of different epsilons tested */
        A.m = n;
        A.n = n;
        A.NrNzElts = 2*n-1;
        Pmax = 32; /* maximum number of parts */
    
        A.i = (long *) malloc(A.NrNzElts* sizeof(long));
        A.j = (long *) malloc(A.NrNzElts* sizeof(long));
        A.Pstart = (long *) malloc((Pmax+1)* sizeof(long));
        A.RowLambda = (int *)malloc(A.m*sizeof(int));
        A.ColLambda = (int *)malloc(A.n*sizeof(int));
        A.RowMark = (int *)malloc(A.m*sizeof(int));
        A.ColMark = (int *)malloc(A.n*sizeof(int));
        A.dummy = (int *) malloc(n* sizeof(int));
    
        if (A.i == NULL || A.j == NULL || A.Pstart == NULL || A.dummy == NULL) {
            printf("Error\n");
            exit(1);
        }
    
        /* Initialise matrix */
        A.MMTypeCode[3]='S';
        Options.SymmetricMatrix_UseSingleEntry = SingleEntYes;
        A.NrDummies = n/2;
        for (i=0; i<n/2; i++)
            A.dummy[i] = TRUE;
        for (i=n/2; i<n; i++)
            A.dummy[i] = FALSE;
     
        /* Fill matrix with nonzeros */
        t= 0;
        for (i=0; i<n; i++) {
            for (j=MAX(0,i-1); j<=i; j++) {
                A.i[t] = i;
                A.j[t] = j;
                t++;
            }
        }    
        totweight = ComputeWeight(&A, 0, A.NrNzElts-1, NULL, &Options);
    
        /* Main loop for testing different options */
        Options.SplitStrategy = OneDimRow; /* does not matter, but needs a value */
        Options.SplitMethod = Simple;
    
        for (iter=0; iter<6; iter++) {
            if (iter%2 == 0)
                Options.LoadbalanceAdjust = AdjustYes;
            else
                Options.LoadbalanceAdjust = AdjustNo;
            if ((iter%6)/2 == 0)
                Options.LoadbalanceStrategy = Decrease;
            else if ((iter%6)/2 == 1)
                Options.LoadbalanceStrategy = Increase;
            else if ((iter%6)/2 == 2)
                Options.LoadbalanceStrategy = Constant;
    
            for (P=1; P<=Pmax; P++) {
                eps = 2*P*P / (double)totweight;
                for (ieps=0; ieps<neps; ieps++) {
                    A.Pstart[0] = 0;
                    for (q=1; q<=P; q++)
                        A.Pstart[q] = A.NrNzElts;
                    
                    if (!DistributeMatrixMondriaan(&A, P, eps, &Options, 0)) {
                        printf("Error\n");
                        exit(1);
                    }
    
                    /* Check that all parts have weight <= maxweight */
                    maxweight = ((1 + eps) * totweight) / P; /* rounded down */
                    nz= 0;
                    for (q=0; q<P; q++) {
                        weight = ComputeWeight(&A, A.Pstart[q],A.Pstart[q+1]-1,NULL,&Options);
                        if (weight > maxweight || weight < 0) {
                            printf("Error: weight too large\n");
                            exit(1); 
                        }
                        nz += A.Pstart[q+1] - A.Pstart[q];
                    }
                    if (nz != A.NrNzElts) {
                        printf("Error\n"); 
                        exit(1);  
                    }
    
                    /* It is assumed that the simple split method does not
                       move nonzeros. Check this */
                    t= 0;
                    for (i=0; i<n; i++) { 
                        for (j=MAX(0,i-1); j<=i; j++) {
                            if (A.i[t] != i || A.j[t] != j) { 
                                printf("Error\n");  
                                exit(1);     
                            }  
                            t++;
                        }
                    }
                    eps *= 2;
                }
            }
        } 
    
        printf("OK\n");
        exit(0);
    
    } /* end main */