private static TaskParalizationSpecification ConvertExtToInt(this TaskParalizationParameterExt taskParalizationSpecification) { var convert = new TaskParalizationSpecification { MaxCores = taskParalizationSpecification.MaxCores, MPIProcesses = taskParalizationSpecification.MPIProcesses, OpenMPThreads = taskParalizationSpecification.OpenMPThreads }; return(convert); }
/// <summary> /// Set requested resources for task /// </summary> /// <param name="requestedNodeGroups">Node group names</param> /// <param name="requiredNodes">Node names</param> /// <param name="placementPolicy">Specify placement policy (on same rack, etc.)</param> /// <param name="paralizationSpecs">Task paralization specifications</param> /// <param name="minCores">Task min cores</param> /// <param name="maxCores">Task max cores</param> /// <param name="coresPerNode">Cores per node</param> public void SetRequestedResourceNumber(IEnumerable <string> requestedNodeGroups, ICollection <string> requiredNodes, string placementPolicy, IEnumerable <TaskParalizationSpecification> paralizationSpecs, int minCores, int maxCores, int coresPerNode) { var allocationCmdBuilder = new StringBuilder(" -l select="); //For specific node names if (requiredNodes?.Count > 0) { int requiredNodesMaxCores = coresPerNode * requiredNodes.Count; int remainingCores = maxCores - requiredNodesMaxCores; int cpusPerHost = maxCores > requiredNodesMaxCores ? coresPerNode : (maxCores / requiredNodes.Count); var parSpecsForReqNodes = paralizationSpecs.Where(w => w.MaxCores % coresPerNode == 0 && w.MaxCores / coresPerNode == 1) .ToList(); int i = 0; bool first = true; foreach (var hostname in requiredNodes) { TaskParalizationSpecification parSpec = parSpecsForReqNodes?.ElementAtOrDefault(i); allocationCmdBuilder.Append($"{(first ? string.Empty : "+")}1:host={hostname}:ncpus={coresPerNode}"); if (parSpec != null) { allocationCmdBuilder.Append(parSpec.MPIProcesses.HasValue ? $":mpiprocs={parSpec.MPIProcesses.Value}" : string.Empty); allocationCmdBuilder.Append(parSpec.OpenMPThreads.HasValue ? $":ompthreads={parSpec.OpenMPThreads.Value}" : string.Empty); } allocationCmdBuilder.Append(string.IsNullOrEmpty(placementPolicy) ? string.Empty : $" -l place={placementPolicy}"); i++; if (first) { first = false; } } if (remainingCores > 0) { allocationCmdBuilder.Append('+'); allocationCmdBuilder.Append(GenerateSelectPartForRequestedGroups(requestedNodeGroups, placementPolicy, paralizationSpecs.Except(parSpecsForReqNodes).ToList(), remainingCores, coresPerNode)); } } else { allocationCmdBuilder.Append(GenerateSelectPartForRequestedGroups(requestedNodeGroups, placementPolicy, paralizationSpecs, maxCores, coresPerNode)); } _taskBuilder.Append(allocationCmdBuilder); }
/// <summary> /// Set requested resources for task /// </summary> /// <param name="requestedNodeGroups">Node group names</param> /// <param name="requiredNodes">Node names</param> /// <param name="placementPolicy">Specify placement policy (on same rack, etc.)</param> /// <param name="paralizationSpecs">Task paralization specifications</param> /// <param name="minCores">Task min cores</param> /// <param name="maxCores">Task max cores</param> /// <param name="coresPerNode">Cores per node</param> public void SetRequestedResourceNumber(IEnumerable <string> requestedNodeGroups, ICollection <string> requiredNodes, string placementPolicy, IEnumerable <TaskParalizationSpecification> paralizationSpecs, int minCores, int maxCores, int coresPerNode) { var allocationCmdBuilder = new StringBuilder(); string reqNodeGroupsCmd = PrepareNameOfNodesGroup(requestedNodeGroups); int nodeCount = maxCores / coresPerNode; nodeCount += maxCores % coresPerNode > 0 ? 1 : 0; TaskParalizationSpecification parSpec = paralizationSpecs.FirstOrDefault(); allocationCmdBuilder.Append($" --nodes={nodeCount}{PrepareNameOfNodes(requiredNodes.ToArray(), nodeCount)}{reqNodeGroupsCmd}"); if (parSpec is not null) { allocationCmdBuilder.Append(parSpec.MPIProcesses.HasValue ? $" --ntasks-per-node={parSpec.MPIProcesses.Value}" : string.Empty); allocationCmdBuilder.Append(parSpec.OpenMPThreads.HasValue ? $" --cpus-per-task={parSpec.OpenMPThreads.Value}" : string.Empty); } allocationCmdBuilder.Append(string.IsNullOrEmpty(placementPolicy) ? string.Empty : $" --constraint={placementPolicy}"); _taskBuilder.Append(allocationCmdBuilder); }