1+ use anyhow:: bail;
12use std:: path:: PathBuf ;
23use std:: time:: Duration ;
34
4- use tako:: resources:: ResourceDescriptor ;
5+ use tako:: resources:: { ResourceDescriptor , ResourceDescriptorItem , CPU_RESOURCE_NAME } ;
56use tako:: worker:: { ServerLostPolicy , WorkerConfiguration } ;
67use tako:: Map ;
78
@@ -22,8 +23,8 @@ use crate::transfer::messages::{
2223use crate :: worker:: bootstrap:: {
2324 finalize_configuration, initialize_worker, try_get_pbs_info, try_get_slurm_info,
2425} ;
25- use crate :: worker:: hwdetect:: { detect_cpus , detect_cpus_no_ht , detect_generic_resources } ;
26- use crate :: worker:: parser:: { ArgCpuDefinition , ArgGenericResourceDef , CpuDefinition } ;
26+ use crate :: worker:: hwdetect:: { detect_additional_resources , detect_cpus , prune_hyper_threading } ;
27+ use crate :: worker:: parser:: { ArgCpuDefinition , ArgResourceItemDef } ;
2728use crate :: WorkerId ;
2829
2930#[ derive( clap:: ArgEnum , Clone ) ]
@@ -58,17 +59,21 @@ impl From<ArgServerLostPolicy> for ServerLostPolicy {
5859#[ derive( Parser ) ]
5960pub struct WorkerStartOpts {
6061 /// How many cores should be allocated for the worker
61- #[ clap( long, default_value = "auto" ) ]
62- pub cpus : ArgCpuDefinition ,
62+ #[ clap( long) ]
63+ pub cpus : Option < ArgCpuDefinition > ,
6364
6465 /// Resources
6566 #[ clap( long, multiple_occurrences( true ) ) ]
66- pub resource : Vec < ArgGenericResourceDef > ,
67+ pub resource : Vec < ArgResourceItemDef > ,
6768
6869 #[ clap( long = "no-detect-resources" ) ]
6970 /// Disable auto-detection of resources
7071 pub no_detect_resources : bool ,
7172
73+ #[ clap( long = "no-hyper-threading" ) ]
74+ /// Ignore hyper-threading while detecting CPU cores
75+ pub no_hyper_threading : bool ,
76+
7277 /// How often should the worker announce its existence to the server. (default: "8s")
7378 #[ clap( long, default_value = "8s" ) ]
7479 pub heartbeat : ArgDuration ,
@@ -121,24 +126,33 @@ fn gather_configuration(opts: WorkerStartOpts) -> anyhow::Result<WorkerConfigura
121126
122127 let hostname = get_hostname ( opts. hostname ) ;
123128
124- let cpus = match opts. cpus . unpack ( ) {
125- CpuDefinition :: Detect => detect_cpus ( ) ?,
126- CpuDefinition :: DetectNoHyperThreading => detect_cpus_no_ht ( ) ?,
127- CpuDefinition :: Custom ( cpus) => cpus,
128- } ;
129+ let mut resources: Vec < _ > = opts. resource . into_iter ( ) . map ( |x| x. unpack ( ) ) . collect ( ) ;
130+ if !resources. iter ( ) . any ( |x| x. name == CPU_RESOURCE_NAME ) {
131+ resources. push ( ResourceDescriptorItem {
132+ name : CPU_RESOURCE_NAME . to_string ( ) ,
133+ kind : if let Some ( cpus) = opts. cpus {
134+ cpus. unpack ( )
135+ } else {
136+ detect_cpus ( ) ?
137+ } ,
138+ } )
139+ } else if opts. cpus . is_some ( ) {
140+ bail ! ( "Parameters --cpus and --resource cpus=... cannot be combined" ) ;
141+ }
129142
130- let mut generic = if opts. no_detect_resources {
131- Vec :: new ( )
132- } else {
133- detect_generic_resources ( ) ?
134- } ;
135- for def in opts. resource {
136- let descriptor = def. unpack ( ) ;
137- generic. retain ( |desc| desc. name != descriptor. name ) ;
138- generic. push ( descriptor)
143+ if opts. no_hyper_threading {
144+ let cpus = resources
145+ . iter_mut ( )
146+ . find ( |x| x. name == CPU_RESOURCE_NAME )
147+ . unwrap ( ) ;
148+ cpus. kind = prune_hyper_threading ( & cpus. kind ) ?;
149+ }
150+
151+ if !opts. no_detect_resources {
152+ detect_additional_resources ( & mut resources) ?;
139153 }
140154
141- let resources = ResourceDescriptor :: new ( cpus , generic ) ;
155+ let resources = ResourceDescriptor :: new ( resources ) ;
142156 resources. validate ( ) ?;
143157
144158 let ( work_dir, log_dir) = {
0 commit comments