142565d0bSMatthew G. Knepley static char help[] = "Exhaustive memory tracking for DMPlex.\n\n\n"; 242565d0bSMatthew G. Knepley 342565d0bSMatthew G. Knepley #include <petscdmplex.h> 442565d0bSMatthew G. Knepley 542565d0bSMatthew G. Knepley static PetscErrorCode EstimateMemory(DM dm, PetscLogDouble *est) 642565d0bSMatthew G. Knepley { 742565d0bSMatthew G. Knepley DMLabel marker; 842565d0bSMatthew G. Knepley PetscInt cdim, depth, d, pStart, pEnd, p, Nd[4] = {0, 0, 0, 0}, lsize = 0, rmem = 0, imem = 0; 942565d0bSMatthew G. Knepley PetscInt coneSecMem = 0, coneMem = 0, supportSecMem = 0, supportMem = 0, labelMem = 0; 1042565d0bSMatthew G. Knepley PetscErrorCode ierr; 1142565d0bSMatthew G. Knepley 1242565d0bSMatthew G. Knepley PetscFunctionBeginUser; 1342565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_SELF, "Memory Estimates\n");CHKERRQ(ierr); 1442565d0bSMatthew G. Knepley ierr = DMGetCoordinateDim(dm, &cdim);CHKERRQ(ierr); 1542565d0bSMatthew G. Knepley ierr = DMPlexGetDepth(dm, &depth);CHKERRQ(ierr); 1642565d0bSMatthew G. Knepley ierr = DMPlexGetChart(dm, &pStart, &pEnd);CHKERRQ(ierr); 1742565d0bSMatthew G. Knepley for (d = 0; d <= depth; ++d) { 1842565d0bSMatthew G. Knepley PetscInt start, end; 1942565d0bSMatthew G. Knepley 2042565d0bSMatthew G. Knepley ierr = DMPlexGetDepthStratum(dm, d, &start, &end);CHKERRQ(ierr); 2142565d0bSMatthew G. Knepley Nd[d] = end - start; 2242565d0bSMatthew G. Knepley } 2342565d0bSMatthew G. Knepley /* Coordinates: 3 Nv reals + 2*Nv + 2*Nv ints */ 2442565d0bSMatthew G. Knepley rmem += cdim*Nd[0]; 2542565d0bSMatthew G. Knepley imem += 2*Nd[0] + 2*Nd[0]; 2642565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_SELF, " Coordinate mem: %D %D\n", cdim*Nd[0]*sizeof(PetscReal), 4*Nd[0]*sizeof(PetscInt));CHKERRQ(ierr); 2742565d0bSMatthew G. Knepley /* Depth: Nc+Nf+Ne+Nv ints */ 2842565d0bSMatthew G. Knepley for (d = 0; d <= depth; ++d) labelMem += Nd[d]; 2942565d0bSMatthew G. Knepley /* Cell Type: Nc+Nf+Ne+Nv ints */ 3042565d0bSMatthew G. Knepley for (d = 0; d <= depth; ++d) labelMem += Nd[d]; 3142565d0bSMatthew G. Knepley /* Marker */ 3242565d0bSMatthew G. Knepley ierr = DMGetLabel(dm, "marker", &marker);CHKERRQ(ierr); 3342565d0bSMatthew G. Knepley if (marker) {ierr = DMLabelGetStratumSize(marker, 1, &lsize);CHKERRQ(ierr);} 3442565d0bSMatthew G. Knepley labelMem += lsize; 3542565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_SELF, " Label mem: %D\n", labelMem*sizeof(PetscInt));CHKERRQ(ierr); 3642565d0bSMatthew G. Knepley //imem += labelMem; 3742565d0bSMatthew G. Knepley /* Cones and Orientations: 4 Nc + 3 Nf + 2 Ne ints + (Nc+Nf+Ne) ints no separate orientation section */ 3842565d0bSMatthew G. Knepley for (d = 0; d <= depth; ++d) coneSecMem += 2*Nd[d]; 3942565d0bSMatthew G. Knepley for (p = pStart; p < pEnd; ++p) { 4042565d0bSMatthew G. Knepley PetscInt csize; 4142565d0bSMatthew G. Knepley 4242565d0bSMatthew G. Knepley ierr = DMPlexGetConeSize(dm, p, &csize);CHKERRQ(ierr); 4342565d0bSMatthew G. Knepley coneMem += csize; 4442565d0bSMatthew G. Knepley } 4542565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_SELF, " Cone mem: %D %D (%D)\n", coneMem*sizeof(PetscInt), coneSecMem*sizeof(PetscInt), coneMem*sizeof(PetscInt));CHKERRQ(ierr); 4642565d0bSMatthew G. Knepley imem += 2*coneMem + coneSecMem; 4742565d0bSMatthew G. Knepley /* Supports: 4 Nc + 3 Nf + 2 Ne ints + Nc+Nf+Ne ints */ 4842565d0bSMatthew G. Knepley for (d = 0; d <= depth; ++d) supportSecMem += 2*Nd[d]; 4942565d0bSMatthew G. Knepley for (p = pStart; p < pEnd; ++p) { 5042565d0bSMatthew G. Knepley PetscInt ssize; 5142565d0bSMatthew G. Knepley 5242565d0bSMatthew G. Knepley ierr = DMPlexGetSupportSize(dm, p, &ssize);CHKERRQ(ierr); 5342565d0bSMatthew G. Knepley supportMem += ssize; 5442565d0bSMatthew G. Knepley } 5542565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_SELF, " Support mem: %D %D\n", supportMem*sizeof(PetscInt), supportSecMem*sizeof(PetscInt));CHKERRQ(ierr); 5642565d0bSMatthew G. Knepley imem += supportMem + supportSecMem; 5742565d0bSMatthew G. Knepley *est = ((PetscLogDouble) imem)*sizeof(PetscInt) + ((PetscLogDouble) rmem)*sizeof(PetscReal); 5842565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_WORLD, " Estimated memory %D\n", (PetscInt) *est);CHKERRQ(ierr); 5942565d0bSMatthew G. Knepley PetscFunctionReturn(0); 6042565d0bSMatthew G. Knepley } 6142565d0bSMatthew G. Knepley 6242565d0bSMatthew G. Knepley int main(int argc, char **argv) 6342565d0bSMatthew G. Knepley { 6442565d0bSMatthew G. Knepley DM dm; 6542565d0bSMatthew G. Knepley PetscBool trace = PETSC_FALSE, checkMemory = PETSC_TRUE, auxMemory = PETSC_FALSE; 6642565d0bSMatthew G. Knepley PetscLogDouble before, after, est = 0, clean, max; 6742565d0bSMatthew G. Knepley PetscErrorCode ierr; 6842565d0bSMatthew G. Knepley 6942565d0bSMatthew G. Knepley ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr; 7042565d0bSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL, NULL, "-trace", &trace, NULL);CHKERRQ(ierr); 7142565d0bSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL, NULL, "-check_memory", &checkMemory, NULL);CHKERRQ(ierr); 7242565d0bSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL, NULL, "-aux_memory", &auxMemory, NULL);CHKERRQ(ierr); 7342565d0bSMatthew G. Knepley ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 7442565d0bSMatthew G. Knepley ierr = PetscMallocGetCurrentUsage(&before);CHKERRQ(ierr); 7542565d0bSMatthew G. Knepley if (trace) {ierr = PetscMallocTraceSet(NULL, PETSC_TRUE, 5000.);CHKERRQ(ierr);} 7630602db0SMatthew G. Knepley ierr = DMCreate(PETSC_COMM_WORLD, &dm);CHKERRQ(ierr); 7730602db0SMatthew G. Knepley ierr = DMSetType(dm, DMPLEX);CHKERRQ(ierr); 7830602db0SMatthew G. Knepley ierr = DMSetFromOptions(dm);CHKERRQ(ierr); 7942565d0bSMatthew G. Knepley if (trace) {ierr = PetscMallocTraceSet(NULL, PETSC_FALSE, 5000);CHKERRQ(ierr);} 8042565d0bSMatthew G. Knepley ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr); 8142565d0bSMatthew G. Knepley ierr = PetscMallocGetCurrentUsage(&after);CHKERRQ(ierr); 8242565d0bSMatthew G. Knepley ierr = PetscMemoryGetMaximumUsage(&max);CHKERRQ(ierr); 8342565d0bSMatthew G. Knepley ierr = EstimateMemory(dm, &est);CHKERRQ(ierr); 8442565d0bSMatthew G. Knepley ierr = DMDestroy(&dm);CHKERRQ(ierr); 8542565d0bSMatthew G. Knepley ierr = PetscMallocGetCurrentUsage(&clean);CHKERRQ(ierr); 8642565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_WORLD, "Measured Memory\n");CHKERRQ(ierr); 8742565d0bSMatthew G. Knepley if (auxMemory) { 8842565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_WORLD, " Initial memory %D\n Extra memory for build %D\n Memory after destroy %D\n", 8942565d0bSMatthew G. Knepley (PetscInt) before, (PetscInt) (max-after), (PetscInt) clean);CHKERRQ(ierr); 9042565d0bSMatthew G. Knepley } 9142565d0bSMatthew G. Knepley if (checkMemory) { 9242565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_WORLD, " Memory for mesh %D\n", (PetscInt) (after-before));CHKERRQ(ierr); 9342565d0bSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_WORLD, "Discrepancy %D\n", (PetscInt) PetscAbsReal(after-before-est));CHKERRQ(ierr); 9442565d0bSMatthew G. Knepley } 9542565d0bSMatthew G. Knepley ierr = PetscFinalize(); 9642565d0bSMatthew G. Knepley return ierr; 9742565d0bSMatthew G. Knepley } 9842565d0bSMatthew G. Knepley 9942565d0bSMatthew G. Knepley /*TEST 10042565d0bSMatthew G. Knepley build: 101*dfd57a17SPierre Jolivet requires: !defined(PETSC_USE_64BIT_INDICES) double !complex !defined(PETSCTEST_VALGRIND) 10242565d0bSMatthew G. Knepley 10342565d0bSMatthew G. Knepley # Mempry checks cannot be included in tests because the allocated memory differs among environments 10442565d0bSMatthew G. Knepley testset: 10542565d0bSMatthew G. Knepley args: -malloc_requested_size -dm_plex_box_faces 5,5 -check_memory 0 10642565d0bSMatthew G. Knepley test: 10742565d0bSMatthew G. Knepley suffix: tri 10842565d0bSMatthew G. Knepley requires: triangle 10930602db0SMatthew G. Knepley args: -dm_plex_simplex 1 -dm_plex_interpolate 0 11042565d0bSMatthew G. Knepley 11142565d0bSMatthew G. Knepley test: 11242565d0bSMatthew G. Knepley suffix: tri_interp 11342565d0bSMatthew G. Knepley requires: triangle 11430602db0SMatthew G. Knepley args: -dm_plex_simplex 1 -dm_plex_interpolate 1 11542565d0bSMatthew G. Knepley 11642565d0bSMatthew G. Knepley test: 11742565d0bSMatthew G. Knepley suffix: quad 11830602db0SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_interpolate 0 11942565d0bSMatthew G. Knepley 12042565d0bSMatthew G. Knepley test: 12142565d0bSMatthew G. Knepley suffix: quad_interp 12230602db0SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_interpolate 1 12342565d0bSMatthew G. Knepley 12430602db0SMatthew G. Knepley # Memory checks cannot be included in tests because the allocated memory differs among environments 12542565d0bSMatthew G. Knepley testset: 12630602db0SMatthew G. Knepley args: -malloc_requested_size -dm_plex_dim 3 -dm_plex_box_faces 5,5,5 -check_memory 0 12742565d0bSMatthew G. Knepley test: 12842565d0bSMatthew G. Knepley suffix: tet 12942565d0bSMatthew G. Knepley requires: ctetgen 13030602db0SMatthew G. Knepley args: -dm_plex_simplex 1 -dm_plex_interpolate 0 13142565d0bSMatthew G. Knepley 13242565d0bSMatthew G. Knepley test: 13342565d0bSMatthew G. Knepley suffix: tet_interp 13442565d0bSMatthew G. Knepley requires: ctetgen 13530602db0SMatthew G. Knepley args: -dm_plex_simplex 1 -dm_plex_interpolate 1 13642565d0bSMatthew G. Knepley 13742565d0bSMatthew G. Knepley test: 13842565d0bSMatthew G. Knepley suffix: hex 13930602db0SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_interpolate 0 14042565d0bSMatthew G. Knepley 14142565d0bSMatthew G. Knepley test: 14242565d0bSMatthew G. Knepley suffix: hex_interp 14330602db0SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_interpolate 1 14442565d0bSMatthew G. Knepley TEST*/ 145