11f480b34SSatish Balay 21f480b34SSatish Balay #include "petsc.h" 3e090d566SSatish Balay #include "petscsys.h" 41f480b34SSatish Balay 55a655dc6SBarry Smith extern int BlastCache(void); 65a655dc6SBarry Smith extern int test1(void); 75a655dc6SBarry Smith extern int test2(void); 877c4ece6SBarry Smith 94a2ae208SSatish Balay #undef __FUNCT__ 104a2ae208SSatish Balay #define __FUNCT__ "main" 111f480b34SSatish Balay int main(int argc,char **argv) 121f480b34SSatish Balay { 13dfbe8321SBarry Smith PetscErrorCode ierr; 14d3093643SSatish Balay 1577c4ece6SBarry Smith PetscInitialize(&argc,&argv,0,0); 161f480b34SSatish Balay 17ac355199SBarry Smith ierr = test1();CHKERRQ(ierr); 18ac355199SBarry Smith ierr = test2();CHKERRQ(ierr); 1977c4ece6SBarry Smith 202b7fea2aSSatish Balay ierr = PetscFinalize();CHKERRQ(ierr); 213a40ed3dSBarry Smith PetscFunctionReturn(0); 2277c4ece6SBarry Smith } 2377c4ece6SBarry Smith 244a2ae208SSatish Balay #undef __FUNCT__ 254a2ae208SSatish Balay #define __FUNCT__ "test1" 26cf256101SBarry Smith int test1(void) 2777c4ece6SBarry Smith { 28b0a32e0cSBarry Smith PetscLogDouble t1,t2; 2947794344SBarry Smith double value; 302758efb8SSatish Balay int i,ierr,*z,*zi,intval; 31ea709b57SSatish Balay PetscScalar *x,*y; 3277c4ece6SBarry Smith PetscRandom r; 3377c4ece6SBarry Smith 34*c77d6671SHong Zhang ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr); 35*c77d6671SHong Zhang ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr); 3687828ca2SBarry Smith ierr = PetscMalloc(20000*sizeof(PetscScalar),&x);CHKERRQ(ierr); 3787828ca2SBarry Smith ierr = PetscMalloc(20000*sizeof(PetscScalar),&y);CHKERRQ(ierr); 3877c4ece6SBarry Smith 39ac355199SBarry Smith ierr = PetscMalloc(2000*sizeof(int),&z);CHKERRQ(ierr); 40ac355199SBarry Smith ierr = PetscMalloc(2000*sizeof(int),&zi);CHKERRQ(ierr); 4177c4ece6SBarry Smith 4277c4ece6SBarry Smith 431f480b34SSatish Balay 441f480b34SSatish Balay /* Take care of paging effects */ 45d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 461f480b34SSatish Balay 471f480b34SSatish Balay /* Form the random set of integers */ 4877c4ece6SBarry Smith for (i=0; i<2000; i++) { 4977c4ece6SBarry Smith ierr = PetscRandomGetValue(r,&value);CHKERRQ(ierr); 5077c4ece6SBarry Smith intval = (int)(value*20000.0); 51c9a02da4SSatish Balay z[i] = intval; 521f480b34SSatish Balay } 531f480b34SSatish Balay 5477c4ece6SBarry Smith for (i=0; i<2000; i++) { 5577c4ece6SBarry Smith ierr = PetscRandomGetValue(r,&value);CHKERRQ(ierr); 5677c4ece6SBarry Smith intval = (int)(value*20000.0); 57ba8edd79SBarry Smith zi[i] = intval; 5877c4ece6SBarry Smith } 59b4d8b9abSSatish Balay /* fprintf(stdout,"Done setup\n"); */ 6077c4ece6SBarry Smith 61d3093643SSatish Balay ierr = BlastCache();CHKERRQ(ierr); 621f480b34SSatish Balay 63d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 6477c4ece6SBarry Smith for (i=0; i<2000; i++) { x[i] = y[i]; } 65d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 66b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 671f480b34SSatish Balay 68d3093643SSatish Balay ierr = BlastCache();CHKERRQ(ierr); 691f480b34SSatish Balay 70d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 71608f96ebSSatish Balay for (i=0; i<500; i+=4) { 72608f96ebSSatish Balay x[i] = y[z[i]]; 73608f96ebSSatish Balay x[1+i] = y[z[1+i]]; 74608f96ebSSatish Balay x[2+i] = y[z[2+i]]; 75608f96ebSSatish Balay x[3+i] = y[z[3+i]]; 76608f96ebSSatish Balay } 77d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 78b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0); 79608f96ebSSatish Balay 80d3093643SSatish Balay ierr = BlastCache();CHKERRQ(ierr); 81608f96ebSSatish Balay 82d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr) 8377c4ece6SBarry Smith for (i=0; i<2000; i++) { x[i] = y[z[i]]; } 84d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 85b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 8677c4ece6SBarry Smith 87d3093643SSatish Balay ierr = BlastCache();CHKERRQ(ierr); 881f480b34SSatish Balay 89d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 90608f96ebSSatish Balay for (i=0; i<1000; i+=2) { x[i] = y[z[i]]; x[1+i] = y[z[1+i]]; } 91d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 92b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0); 93608f96ebSSatish Balay 94d3093643SSatish Balay ierr = BlastCache();CHKERRQ(ierr); 95608f96ebSSatish Balay 96d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 9777c4ece6SBarry Smith for (i=0; i<2000; i++) { x[z[i]] = y[i]; } 98d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 99b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 1001f480b34SSatish Balay 101d3093643SSatish Balay ierr = BlastCache();CHKERRQ(ierr); 10277c4ece6SBarry Smith 103d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 10477c4ece6SBarry Smith for (i=0; i<2000; i++) { x[z[i]] = y[zi[i]]; } 105d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 106b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 10777c4ece6SBarry Smith 108549d3d68SSatish Balay ierr = PetscMemcpy(x,y,10);CHKERRQ(ierr); 109549d3d68SSatish Balay ierr = PetscMemcpy(z,zi,10);CHKERRQ(ierr); 110606d414cSSatish Balay ierr = PetscFree(z);CHKERRQ(ierr); 111606d414cSSatish Balay ierr = PetscFree(zi);CHKERRQ(ierr); 112606d414cSSatish Balay ierr = PetscFree(x);CHKERRQ(ierr); 113606d414cSSatish Balay ierr = PetscFree(y);CHKERRQ(ierr); 11477c4ece6SBarry Smith PetscRandomDestroy(r); 1153a40ed3dSBarry Smith PetscFunctionReturn(0); 11677c4ece6SBarry Smith } 11777c4ece6SBarry Smith 1184a2ae208SSatish Balay #undef __FUNCT__ 1194a2ae208SSatish Balay #define __FUNCT__ "test2" 120cf256101SBarry Smith int test2(void) 12177c4ece6SBarry Smith { 122b0a32e0cSBarry Smith PetscLogDouble t1,t2; 12347794344SBarry Smith double value; 124d3093643SSatish Balay int i,ierr,z[20000],zi[20000],intval,tmp; 125ea709b57SSatish Balay PetscScalar x[20000],y[20000]; 12677c4ece6SBarry Smith PetscRandom r; 12777c4ece6SBarry Smith 128*c77d6671SHong Zhang ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr); 129*c77d6671SHong Zhang ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr); 13077c4ece6SBarry Smith 13177c4ece6SBarry Smith /* Take care of paging effects */ 132d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 13377c4ece6SBarry Smith 13477c4ece6SBarry Smith for (i=0; i<20000; i++) { 13577c4ece6SBarry Smith x[i] = i; 13677c4ece6SBarry Smith y[i] = i; 137d3093643SSatish Balay z[i] = i; 138d3093643SSatish Balay zi[i] = i; 13977c4ece6SBarry Smith } 14077c4ece6SBarry Smith 14177c4ece6SBarry Smith /* Form the random set of integers */ 142d3093643SSatish Balay for (i=0; i<20000; i++) { 14377c4ece6SBarry Smith ierr = PetscRandomGetValue(r,&value);CHKERRQ(ierr); 14477c4ece6SBarry Smith intval = (int)(value*20000.0); 14577c4ece6SBarry Smith tmp = z[i]; 14677c4ece6SBarry Smith z[i] = z[intval]; 14777c4ece6SBarry Smith z[intval] = tmp; 14877c4ece6SBarry Smith } 14977c4ece6SBarry Smith 150d3093643SSatish Balay for (i=0; i<20000; i++) { 15177c4ece6SBarry Smith ierr = PetscRandomGetValue(r,&value);CHKERRQ(ierr); 15277c4ece6SBarry Smith intval = (int)(value*20000.0); 15377c4ece6SBarry Smith tmp = zi[i]; 15477c4ece6SBarry Smith zi[i] = zi[intval]; 15577c4ece6SBarry Smith zi[intval] = tmp; 15677c4ece6SBarry Smith } 157b4d8b9abSSatish Balay /* fprintf(stdout,"Done setup\n"); */ 15877c4ece6SBarry Smith 159d3093643SSatish Balay /* ierr = BlastCache();CHKERRQ(ierr); */ 16077c4ece6SBarry Smith 161d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 16277c4ece6SBarry Smith for (i=0; i<2000; i++) { x[i] = y[i]; } 163d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 164b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 16577c4ece6SBarry Smith 166d3093643SSatish Balay /* ierr = BlastCache();CHKERRQ(ierr); */ 16777c4ece6SBarry Smith 168d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 16977c4ece6SBarry Smith for (i=0; i<2000; i++) { y[i] = x[z[i]]; } 170d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 171b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 17277c4ece6SBarry Smith 173d3093643SSatish Balay /* ierr = BlastCache();CHKERRQ(ierr); */ 17477c4ece6SBarry Smith 175d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 17677c4ece6SBarry Smith for (i=0; i<2000; i++) { x[z[i]] = y[i]; } 177d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 178b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 17977c4ece6SBarry Smith 180d3093643SSatish Balay /* ierr = BlastCache();CHKERRQ(ierr); */ 18177c4ece6SBarry Smith 182d3093643SSatish Balay ierr = PetscGetTime(&t1);CHKERRQ(ierr); 18377c4ece6SBarry Smith for (i=0; i<2000; i++) { y[z[i]] = x[zi[i]]; } 184d3093643SSatish Balay ierr = PetscGetTime(&t2);CHKERRQ(ierr); 185b4d8b9abSSatish Balay fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 18677c4ece6SBarry Smith 18777c4ece6SBarry Smith 18877c4ece6SBarry Smith PetscRandomDestroy(r); 1893a40ed3dSBarry Smith PetscFunctionReturn(0); 19077c4ece6SBarry Smith } 19177c4ece6SBarry Smith 1924a2ae208SSatish Balay #undef __FUNCT__ 1934a2ae208SSatish Balay #define __FUNCT__ "BlastCache" 194465d0859SSatish Balay int BlastCache(void) 19577c4ece6SBarry Smith { 1969ae0b57aSSatish Balay int i,ierr,n = 1000000; 197ea709b57SSatish Balay PetscScalar *x,*y,*z,*a,*b; 19877c4ece6SBarry Smith 19987828ca2SBarry Smith ierr = PetscMalloc(5*n*sizeof(PetscScalar),&x);CHKERRQ(ierr); 20077c4ece6SBarry Smith y = x + n; 20177c4ece6SBarry Smith z = y + n; 20277c4ece6SBarry Smith a = z + n; 20377c4ece6SBarry Smith b = a + n; 20477c4ece6SBarry Smith 20577c4ece6SBarry Smith for (i=0; i<n; i++) { 20687828ca2SBarry Smith a[i] = (PetscScalar) i; 20787828ca2SBarry Smith y[i] = (PetscScalar) i; 20887828ca2SBarry Smith z[i] = (PetscScalar) i; 20987828ca2SBarry Smith b[i] = (PetscScalar) i; 21087828ca2SBarry Smith x[i] = (PetscScalar) i; 211ba8edd79SBarry Smith } 212ba8edd79SBarry Smith 213ba8edd79SBarry Smith for (i=0; i<n; i++) { 21477c4ece6SBarry Smith a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i]; 21577c4ece6SBarry Smith } 21677c4ece6SBarry Smith for (i=0; i<n; i++) { 21777c4ece6SBarry Smith b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i]; 21877c4ece6SBarry Smith } 21977c4ece6SBarry Smith for (i=0; i<n; i++) { 22077c4ece6SBarry Smith z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i]; 22177c4ece6SBarry Smith } 222606d414cSSatish Balay ierr = PetscFree(x);CHKERRQ(ierr); 2233a40ed3dSBarry Smith PetscFunctionReturn(0); 2241f480b34SSatish Balay } 225