예제 #1
0
        private static TaskParalizationSpecification ConvertExtToInt(this TaskParalizationParameterExt taskParalizationSpecification)
        {
            var convert = new TaskParalizationSpecification
            {
                MaxCores      = taskParalizationSpecification.MaxCores,
                MPIProcesses  = taskParalizationSpecification.MPIProcesses,
                OpenMPThreads = taskParalizationSpecification.OpenMPThreads
            };

            return(convert);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }