// Get the number of locales from the environment variable or if that is not // set just use sinfo to get the number of cpus. static int getCoresPerLocale(void) { int numCores = -1; const int buflen = 1024; char buf[buflen]; char* argv[7]; char* numCoresString = getenv("CHPL_LAUNCHER_CORES_PER_LOCALE"); if (numCoresString) { numCores = atoi(numCoresString); if (numCores > 0) return numCores; chpl_warning("CHPL_LAUNCHER_CORES_PER_LOCALE must be > 0.", 0, 0); } argv[0] = (char *) "sinfo"; // use sinfo to get num cpus argv[1] = (char *) "--exact"; // get exact otherwise you get 16+, etc argv[2] = (char *) "--format=%c"; // format to get num cpu per node (%c) argv[3] = (char *) "--sort=+=#c"; // sort by num cpu (lower to higher) argv[4] = (char *) "--noheader"; // don't show header (hide "CPU" header) argv[5] = (char *) "--responding"; // only care about online nodes argv[6] = NULL; memset(buf, 0, buflen); if (chpl_run_utility1K("sinfo", argv, buf, buflen) <= 0) chpl_error("Error trying to determine number of cores per node", 0, 0); if (sscanf(buf, "%d", &numCores) != 1) chpl_error("unable to determine number of cores per locale; " "please set CHPL_LAUNCHER_CORES_PER_LOCALE", 0, 0); return numCores; }
static qsubVersion determineQsubVersion(void) { const int buflen = 256; char version[buflen]; char whichMoab[buflen]; FILE *whichOutput; int fileError = 1; char *argv[3]; argv[0] = (char *) "qsub"; argv[1] = (char *) "--version"; argv[2] = NULL; memset(version, 0, buflen); if (chpl_run_utility1K("qsub", argv, version, buflen) <= 0) { chpl_error("Error trying to determine qsub version", 0, 0); } if (strstr(version, "NCCS")||strstr(version, "OLCF")) { return nccs; } else if (strstr(version, "PBSPro")) { return pbspro; } else { memset(whichMoab, 0, buflen); whichOutput = popen("which moab 2>&1 >/dev/null", "r"); if (whichOutput != NULL ) { fgets(whichMoab, buflen, whichOutput); fileError = ferror(whichOutput); pclose(whichOutput); if (strlen(whichMoab) == 0 && !fileError) { return moab; } } return unknown; } }
// // This function retrieves the list of attributes available from cnselect // void initAprunAttributes() { char* argv[3]; argv[0] = (char *) "cnselect"; argv[1] = (char *) "-l"; argv[2] = NULL; memset(CNA, 0, CNAbuflen); // We assume here that 'cnselect -l' will always return something meaningful if (chpl_run_utility1K("cnselect", argv, CNA, CNAbuflen) <= 0) { chpl_error("Error trying to run 'cnselect'", 0, 0); } }
static qsubVersion determineQsubVersion(void) { const int buflen = 256; char version[buflen]; char *argv[3]; argv[0] = (char *) "qsub"; argv[1] = (char *) "--version"; argv[2] = NULL; memset(version, 0, buflen); if (chpl_run_utility1K("qsub", argv, version, buflen) <= 0) { chpl_error("Error trying to determine qsub version", 0, 0); } if (strstr(version, "NCCS")) { return nccs; } else if (strstr(version, "PBSPro")) { return pbspro; } else { return unknown; } }
// Check what version of slurm is on the system static sbatchVersion determineSlurmVersion(void) { const int buflen = 256; char version[buflen]; char *argv[3]; argv[0] = (char *) "sbatch"; argv[1] = (char *) "--version"; argv[2] = NULL; memset(version, 0, buflen); if (chpl_run_utility1K("sbatch", argv, version, buflen) <= 0) { chpl_error("Error trying to determine slurm version", 0, 0); } if (strstr(version, "SBATCHPro")) { return slurmpro; } else if (strstr(version, "wrapper sbatch SBATCH UMA 1.0")) { return uma; } else if (strstr(version, "slurm")) { return slurm; } else { return unknown; } }
int getCoresPerLocale() { int numCores = -1; char* numCoresString = getenv("CHPL_LAUNCHER_CORES_PER_LOCALE"); if (numCoresString) { numCores = atoi(numCoresString); if (numCores <= 0) chpl_warning("CHPL_LAUNCHER_CORES_PER_LOCALE set to invalid value.", 0, 0); } if (numCores > 0) return numCores; if (strstr(CNA, "numcores") != NULL) { const int buflen = 1024; char buf[buflen]; char* argv[3]; argv[0] = (char *) "cnselect"; argv[1] = (char *) "-Lnumcores"; argv[2] = NULL; memset(buf, 0, buflen); if (chpl_run_utility1K("cnselect", argv, buf, buflen) <= 0) chpl_error("Error trying to determine number of cores per node", 0, 0); if (sscanf(buf, "%d", &numCores) != 1) chpl_error("unable to determine number of cores per locale; " "please set CHPL_LAUNCHER_CORES_PER_LOCALE", 0, 0); return numCores; } if (strstr(CNA, "coremask") != NULL) { const int buflen = 1024; char buf[buflen]; char* argv[3]; argv[0] = (char *) "cnselect"; argv[1] = (char *) "-Lcoremask"; argv[2] = NULL; memset(buf, 0, buflen); if (chpl_run_utility1K("cnselect", argv, buf, buflen) <= 0) chpl_error("Error trying to determine number coremask on node", 0, 0); { int coreMask; int bitMask = 0x1; if (sscanf(buf, "%d", &coreMask) != 1) chpl_error("unable to determine coremask for locale; " "please set CHPL_LAUNCHER_CORES_PER_LOCALE", 0, 0); coreMask >>= 1; numCores = 1; while (coreMask & bitMask) { coreMask >>= 1; numCores += 1; } } return numCores; } // neither numcores nor coremask is available in this version chpl_error("Error trying to determine number of cores per node", 0, 0); return 0; }