/* PetscHBWMalloc - HBW malloc. Input Parameters: + a - number of bytes to allocate . lineno - line number where used . function - function calling routine - filename - file name where used Returns: double aligned pointer to requested storage, or null if not available. */ static PetscErrorCode PetscHBWMalloc(size_t a,int lineno,const char function[],const char filename[],void **result) { #if !defined(PETSC_HAVE_MEMKIND) return PetscMallocAlign(a,lineno,function,filename,result); #else if (!a) { *result = NULL; return 0; } /* The default policy is if insufficient memory is available from the high bandwidth memory fall back to standard memory. If we use the HBW_POLICY_BIND policy, errno is set to ENOMEM and the allocated pointer is set to NULL if there is not enough HWB memory available. */ { int ierr = hbw_posix_memalign(result,PETSC_MEMALIGN,a); if (ierr || !*result) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MEM,"HBW Memory requested %.0f",(PetscLogDouble)a); } return 0; #endif }
PetscErrorCode PETScParseFortranArgs_Private(int *argc,char ***argv) { #if defined(PETSC_USE_NARGS) short i,flg; #else int i; #endif PetscErrorCode ierr; int warg = 256; PetscMPIInt rank; char *p; ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); if (!rank) { #if defined(PETSC_HAVE_IARG_COUNT_PROGNAME) *argc = iargc_(); #else /* most compilers do not count the program name for argv[0] */ *argc = 1 + iargc_(); #endif } ierr = MPI_Bcast(argc,1,MPI_INT,0,PETSC_COMM_WORLD);CHKERRQ(ierr); /* PetscTrMalloc() not yet set, so don't use PetscMalloc() */ ierr = PetscMallocAlign((*argc+1)*(warg*sizeof(char)+sizeof(char*)),0,0,0,(void**)argv);CHKERRQ(ierr); (*argv)[0] = (char*)(*argv + *argc + 1); if (!rank) { ierr = PetscMemzero((*argv)[0],(*argc)*warg*sizeof(char));CHKERRQ(ierr); for (i=0; i<*argc; i++) { (*argv)[i+1] = (*argv)[i] + warg; #if defined (PETSC_HAVE_FORTRAN_GET_COMMAND_ARGUMENT) /* same as 'else' case */ getarg_(&i,(*argv)[i],warg); #elif defined(PETSC_HAVE_PXFGETARG_NEW) {char *tmp = (*argv)[i]; int ilen; getarg_(&i,tmp,&ilen,&ierr,warg);CHKERRQ(ierr); tmp[ilen] = 0;} #elif defined(PETSC_USE_NARGS) GETARG(&i,(*argv)[i],warg,&flg); #else /* Because the stupid #defines above define all kinds of things to getarg_ we cannot do this test #elif defined(PETSC_HAVE_GETARG) getarg_(&i,(*argv)[i],warg); #else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get Fortran command line arguments"); */ getarg_(&i,(*argv)[i],warg); #endif /* zero out garbage at end of each argument */ p = (*argv)[i] + warg-1; while (p > (*argv)[i]) { if (*p == ' ') *p = 0; p--; } } } ierr = MPI_Bcast((*argv)[0],*argc*warg,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); if (rank) { for (i=0; i<*argc; i++) (*argv)[i+1] = (*argv)[i] + warg; } return 0; }
/* PetscTrMallocDefault - Malloc with tracing. Input Parameters: + a - number of bytes to allocate . lineno - line number where used. Use __LINE__ for this . function - function calling routine. Use __FUNCT__ for this - filename - file name where used. Use __FILE__ for this Returns: double aligned pointer to requested storage, or null if not available. */ PetscErrorCode PetscTrMallocDefault(size_t a,int lineno,const char function[],const char filename[],void **result) { TRSPACE *head; char *inew; size_t nsize; PetscErrorCode ierr; PetscFunctionBegin; if (TRdebugLevel) { ierr = PetscMallocValidate(lineno,function,filename); if (ierr) PetscFunctionReturn(ierr); } nsize = (a + (PETSC_MEMALIGN-1)) & ~(PETSC_MEMALIGN-1); ierr = PetscMallocAlign(nsize+sizeof(TrSPACE)+sizeof(PetscClassId),lineno,function,filename,(void**)&inew);CHKERRQ(ierr); head = (TRSPACE*)inew; inew += sizeof(TrSPACE); if (TRhead) TRhead->prev = head; head->next = TRhead; TRhead = head; head->prev = 0; head->size = nsize; head->id = TRid; head->lineno = lineno; head->filename = filename; head->functionname = function; head->classid = CLASSID_VALUE; *(PetscClassId*)(inew + nsize) = CLASSID_VALUE; TRallocated += nsize; if (TRallocated > TRMaxMem) TRMaxMem = TRallocated; TRfrags++; #if defined(PETSC_USE_DEBUG) if (PetscStackActive()) { ierr = PetscStackCopy((PetscStack*)PetscThreadLocalGetValue(petscstack),&head->stack);CHKERRQ(ierr); /* fix the line number to where the malloc() was called, not the PetscFunctionBegin; */ head->stack.line[head->stack.currentsize-2] = lineno; } #endif /* Allow logging of all mallocs made */ if (PetscLogMalloc > -1 && PetscLogMalloc < PetscLogMallocMax && a >= PetscLogMallocThreshold) { if (!PetscLogMalloc) { PetscLogMallocLength = (size_t*)malloc(PetscLogMallocMax*sizeof(size_t)); if (!PetscLogMallocLength) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM," "); PetscLogMallocFile = (const char**)malloc(PetscLogMallocMax*sizeof(char*)); if (!PetscLogMallocFile) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM," "); PetscLogMallocFunction = (const char**)malloc(PetscLogMallocMax*sizeof(char*)); if (!PetscLogMallocFunction) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM," "); } PetscLogMallocLength[PetscLogMalloc] = nsize; PetscLogMallocFile[PetscLogMalloc] = filename; PetscLogMallocFunction[PetscLogMalloc++] = function; } *result = (void*)inew; PetscFunctionReturn(0); }