Skip to content

Commit d124132

Browse files
accumulated improvements
1 parent b8941e2 commit d124132

9 files changed

Lines changed: 113 additions & 65 deletions

File tree

src/PlatformAware.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export
5757
@just,
5858
@unlimited,
5959
@api,
60-
PlatformFeature,
60+
PlatformType,
6161
QuantifierFeature,
6262
QualifierFeature,
6363
Query,

src/features/default/Platform.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
[node]
99

10-
node_count = 1
1110
node_provider = "OnPremise"
1211
node_virtual = "No"
1312
node_dedicated = "Yes"

src/features/detection.jl

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -484,9 +484,9 @@ function identifyProcessor()
484484
get!(cdict,c[:id],c[:value])
485485
end
486486
processor_core_count = parse(Int64,cdict["enabledcores"])
487-
processor_core_threadscount = parse(Int64,cdict["threads"])
487+
processor_core_threads_count = parse(Int64,cdict["threads"])
488488
489-
push!(l,(p["product"],processor_core_count, processor_core_threadscount,lc))
489+
push!(l,(p["product"],processor_core_count, processor_core_threads_count,lc))
490490
491491
end
492492
@@ -784,17 +784,17 @@ function identifyNode()
784784
println(stderr, "=> Note: detection of node features (cluster and cloud computing) not yet implemented. Using default features.")
785785
println(stderr, " You can setup node features manually.")
786786

787-
interconnection_features = Dict()
787+
node_features = Dict()
788788

789-
interconnection_features["node_count"] = 1
790-
interconnection_features["node_provider"] = "OnPremise"
791-
interconnection_features["node_virtual"] = "No"
792-
interconnection_features["node_dedicated"] = "No"
793-
interconnection_features["node_machinefamily"] = "unset"
794-
interconnection_features["node_machinetype"] = "unset"
795-
interconnection_features["node_vcpus_count"] = "unset"
789+
node_features["node_count"] = 1
790+
node_features["node_provider"] = "OnPremise"
791+
node_features["node_virtual"] = "No"
792+
node_features["node_dedicated"] = "No"
793+
node_features["node_machinefamily"] = "unset"
794+
node_features["node_machinetype"] = "unset"
795+
node_features["node_vcpus_count"] = "unset"
796796

797-
return interconnection_features
797+
return node_features
798798
end
799799

800800
function addNodeFeatures!(platform_features, node_features)

src/features/features.jl

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
# Licensed under the MIT License. See LICENCE in the project root.
33
# ------------------------------------------------------------------
44

5-
abstract type PlatformFeature end
5+
abstract type PlatformType end
66

7-
abstract type QuantifierFeature <: PlatformFeature end
8-
abstract type QualifierFeature <: PlatformFeature end
7+
abstract type QuantifierFeature <: PlatformType end
8+
abstract type QualifierFeature <: PlatformType end
99

1010
@enum FeatureType qualifier=1 api_qualifier quantifier
1111

@@ -22,6 +22,7 @@ global feature_type = Dict(
2222
:node_memory_bandwidth => quantifier,
2323
:node_memory_type => qualifier,
2424
:node_memory_frequency => quantifier,
25+
:node_coworker_count => qualifier,
2526
:processor_count => quantifier,
2627
:processor_manufacturer => qualifier,
2728
:processor_microarchitecture => qualifier,
@@ -165,15 +166,15 @@ function get_qualifier(feature)
165166
getfield(@__MODULE__, Meta.parse(feature))
166167
end
167168

168-
function check_blank_feature(parameter_id, feature, default_platform_types)
169+
function check_blank_feature(parameter_id, feature, platform_feature_default)
169170
if (feature == "na")
170-
default_platform_types[parameter_id]
171+
platform_feature_default[parameter_id]
171172
elseif (feature == "unset")
172-
default_platform_types[parameter_id]
173+
platform_feature_default[parameter_id]
173174
elseif (feature == "unknown")
174-
default_platform_types[parameter_id]
175+
platform_feature_default[parameter_id]
175176
elseif (feature == "ignore")
176-
default_platform_types[parameter_id]
177+
platform_feature_default[parameter_id]
177178
else
178179
nothing
179180
end
@@ -203,7 +204,7 @@ function identifyAPI_oldversion(api_string)
203204

204205
end
205206

206-
function get_api_qualifier(api_string, default_platform_types)
207+
function get_api_qualifier(api_string, platform_feature_default)
207208

208209
apis = split(api_string,';')
209210

@@ -224,27 +225,27 @@ function get_api_qualifier(api_string, default_platform_types)
224225

225226
end
226227

227-
function loadFeaturesSection!(dict, actual_platform_arguments, default_platform_types)
228+
function loadFeaturesSection!(dict, platform_feature, platform_feature_default)
228229

229230
if ("0" in keys(dict))
230231
dict = dict["0"]
231232
end
232233

233234
for (parameter_id, feature) in dict
234235
p = Meta.parse(parameter_id)
235-
v0 = check_blank_feature(p, feature, default_platform_types)
236+
v0 = check_blank_feature(p, feature, platform_feature_default)
236237
v = if (isnothing(v0))
237-
feature_type[p] == qualifier ? get_qualifier(feature) : feature_type[p] == api_qualifier ? get_api_qualifier(feature, default_platform_types) : get_quantifier(feature)
238+
feature_type[p] == qualifier ? get_qualifier(feature) : feature_type[p] == api_qualifier ? get_api_qualifier(feature, platform_feature_default) : get_quantifier(feature)
238239
else
239240
v0
240241
end
241-
actual_platform_arguments[p]= v
242+
platform_feature[p]= v
242243
end
243244
end
244245

245-
function loadFeatures!(dict, default_platform_types, actual_platform_arguments)
246+
function loadFeatures!(dict, platform_feature_default, platform_feature)
246247
loadDBs!()
247248
for key in ["node", "processor", "accelerator", "memory", "storage", "interconnection"]
248-
loadFeaturesSection!(dict[key], actual_platform_arguments, default_platform_types)
249+
loadFeaturesSection!(dict[key], platform_feature, platform_feature_default)
249250
end
250251
end

src/features/qualifiers/amd/db-processors.AMD.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
,,processor_core_count,processor_clock,processor_core_threadscount,processor_isa,processor_simd,processor_microarchitecture,processor,processor_manufacturer,processor_tdp,processor_core_L1_size,processor_core_L2_size,processor_L3_size,node_memory_bandwidth,node_memory_type
1+
,,processor_core_count,processor_clock,processor_core_threads_count,processor_isa,processor_simd,processor_microarchitecture,processor,processor_manufacturer,processor_tdp,processor_core_L1_size,processor_core_L2_size,processor_L3_size,node_memory_bandwidth,node_memory_type
22
AMD;Turion,TL64,2,2.2G,2,64-bit,MMX;Now3Dx;SSE;SSE2;SSE3,unset,AMDTurion_TL64,AMD,35,unset,1MB,unset,667M,DDR2
33
AMD;Turion,TL60,2,2.0G,2,64-bit,MMX;Now3Dx;SSE;SSE2;SSE3,unset,AMDTurion_TL60,AMD,31,unset,1MB,unset,667M,DDR2
44
AMD;Turion,TL56,2,1.8G,2,64-bit,MMX;Now3Dx;SSE;SSE2;SSE3,unset,AMDTurion_TL56,AMD,31,unset,unset,unset,unset,unset

src/features/qualifiers/common.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,16 @@ abstract type ISA_x86_64_v4 <: ISA_x86_64_v3 end
113113

114114
abstract type ISA_IA_64 <: ProcessorISA end
115115

116-
117116
export ISA_x86_32, ISA_x86, ISA_x86_64, ISA_AMD_64, ISA_x86_64_v1, ISA_x86_64_v2, ISA_x86_64_v3, ISA_x86_64_v4, ISA_IA_64
118117

119118

119+
abstract type WorkerCount end
120+
abstract type NoCoworkers <: WorkerCount end
121+
abstract type PerNode <: WorkerCount end
122+
abstract type PerProcessor <: WorkerCount end
123+
abstract type PerCore <: WorkerCount end
124+
abstract type PerThread <: WorkerCount end
125+
abstract type PerVCPU <: WorkerCount end
126+
abstract type Unmapped <: WorkerCount end
127+
128+
export PerNode, PerProcessor, PerCore, PerThread, PerVCPU

src/features/qualifiers/ec2/ec2.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ abstract type EC2Family_Memory <: EC2Family end
1919
abstract type EC2Family_Storage <: EC2Family end
2020

2121
# machine type types and sizes
22-
22+
2323
abstract type EC2Type <: MachineType end
2424

2525

src/features/qualifiers/intel/db-processors.Intel.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
,,processor_core_count,processor_clock,processor_core_threadscount,processor_isa,processor_simd,processor_microarchitecture,processor,processor_manufacturer,processor_tdp,processor_core_L1_size,processor_core_L2_size,processor_L3_size
1+
,,processor_core_count,processor_clock,processor_core_threads_count,processor_isa,processor_simd,processor_microarchitecture,processor,processor_manufacturer,processor_tdp,processor_core_L1_size,processor_core_L2_size,processor_L3_size
22
Intel;Xeon;W,3275M,28,2.50G,56,64-bit,AVX-512,CascadeLake,IntelXeon_W_3275M,Intel,205,unset,unset,unset
33
Intel;Xeon;W,3265M,24,2.70G,48,64-bit,AVX-512,CascadeLake,IntelXeon_W_3265M,Intel,205,unset,unset,unset
44
Intel;Xeon;W,3245M,16,3.20G,32,64-bit,AVX-512,CascadeLake,IntelXeon_W_3245M,Intel,205,unset,unset,unset

src/platform.jl

Lines changed: 72 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
# ------------------------------------------------------------------
44

55
mutable struct PlatformFeatures
6-
default_platform_types_all
7-
default_platform_types
8-
actual_platform_arguments_all
9-
actual_platform_arguments
6+
platform_feature_default_all
7+
platform_feature_default
8+
platform_feature_all
9+
platform_feature
1010
function PlatformFeatures()
1111
new(Dict(),Dict(),Dict(),Dict())
1212
end
@@ -28,6 +28,7 @@ defT =[
2828
:node_memory_bandwidth => Tuple{AtLeast0,AtMostInf},
2929
:node_memory_type => MemoryType,
3030
:node_memory_frequency => Tuple{AtLeast1,AtMostInf},
31+
:node_coworker_count => WorkerCount, # number of worker processes (i.e., julia -p N)
3132
:processor_count => Tuple{AtLeast1,AtMostInf},
3233
:processor_manufacturer => Manufacturer,
3334
:processor_microarchitecture => ProcessorMicroarchitecture,
@@ -78,63 +79,101 @@ defT =[
7879
:storage_interface => StorageInterface
7980
]
8081

81-
state.default_platform_types_all = Dict(defT...)
82-
state.default_platform_types = copy(state.default_platform_types_all)
82+
state.platform_feature_default_all = Dict(defT...)
83+
state.platform_feature_default = copy(state.platform_feature_default_all)
84+
85+
function setupWorkers(platform_description_dict, platform_feature)
86+
try
87+
colocated_procs = procs(myid())
88+
89+
node_coworker_count = if (1 in colocated_procs)
90+
length(colocated_procs) - 1
91+
else
92+
length(colocated_procs)
93+
end
94+
95+
vcount = platform_description_dict[:node_vcpus_count]
96+
pcount = platform_description_dict[:processor_count]
97+
ccount = pcount * platform_description_dict[:processor_core_count]
98+
tcount = ccount * platform_description_dict[:processor_core_threads_count]
99+
100+
if vcount == node_coworker_count && platform_description_dict[:maintainer] == CloudProvider
101+
platform_feature[:node_coworker_count] = PerVCPU
102+
elseif (node_coworker_count = 0)
103+
platform_feature[:node_coworker_count] = NoCoworkers
104+
elseif node_coworker_count == 1
105+
platform_feature[:node_coworker_count] = PerNode
106+
elseif pcount == node_coworker_count
107+
platform_feature[:node_coworker_count] = PerProcessor
108+
elseif ccount == node_coworker_count
109+
platform_feature[:node_coworker_count] = PerCore
110+
elseif tcount == node_coworker_count
111+
platform_feature[:node_coworker_count] = PerThread
112+
else
113+
platform_feature[:node_coworker_count] = Unmapped
114+
end
115+
catch _
116+
platform_feature[:node_coworker_count] = NoCoworkers
117+
end
118+
end
83119

84120
function load!()
85-
empty!(state.actual_platform_arguments_all)
121+
empty!(state.platform_feature_all)
86122
platform_description_dict = readPlatormDescription()
87-
loadFeatures!(platform_description_dict, state.default_platform_types_all, state.actual_platform_arguments_all)
123+
platform_description_dict["node"]["node_count"] = try Distributed.nworkers() catch _ 1 end
124+
loadFeatures!(platform_description_dict, state.platform_feature_default_all, state.platform_feature_all)
125+
126+
setupWorkers(platform_description_dict, state.platform_feature_all)
88127

89-
empty!(state.actual_platform_arguments)
90-
for (k,v) in state.actual_platform_arguments_all
91-
state.actual_platform_arguments[k] = v
128+
empty!(state.platform_feature)
129+
for (k,v) in state.platform_feature_all
130+
state.platform_feature[k] = v
92131
end
93132
end
94133

95134
# load!()
96135

97136
function setplatform!(parameter_id, actual_type)
98-
state.actual_platform_arguments[parameter_id] = actual_type
137+
state.platform_feature[parameter_id] = actual_type
99138
(parameter_id,actual_type)
100139
end
101140

102141
function getplatform(parameter_id)
103-
state.actual_platform_arguments[parameter_id]
142+
state.platform_feature[parameter_id]
104143
end
105144

106145
function getplatform()
107-
state.actual_platform_arguments
146+
state.platform_feature
108147
end
109148

110-
function empty_actual_platform_arguments!()
111-
empty!(state.actual_platform_arguments)
112-
empty!(state.default_platform_types)
149+
function empty_platform_feature!()
150+
empty!(state.platform_feature)
151+
empty!(state.platform_feature_default)
113152
end
114153

115-
function reset_actual_platform_arguments!()
116-
for (k,v) in state.actual_platform_arguments_all
117-
state.actual_platform_arguments[k] = v
154+
function reset_platform_feature!()
155+
for (k,v) in state.platform_feature_all
156+
state.platform_feature[k] = v
118157
end
119158
for (k,v) in platform_types_all
120-
state.default_platform_types[k] = v
159+
state.platform_feature_default[k] = v
121160
end
122-
keys(state.actual_platform_arguments)
161+
keys(state.platform_feature)
123162
end
124163

125164
function include_actual_platform_argument!(f)
126-
state.actual_platform_arguments[f] = state.actual_platform_arguments_all[f]
127-
state.default_platform_types[f] = state.default_platform_types_all[f]
128-
keys(state.actual_platform_arguments)
165+
state.platform_feature[f] = state.platform_feature_all[f]
166+
state.platform_feature_default[f] = state.platform_feature_default_all[f]
167+
keys(state.platform_feature)
129168
end
130169

131170

132171
function platform_parameter_macro!(f)
133172

134173
if (f == :clear)
135-
empty_actual_platform_arguments!()
174+
empty_platform_feature!()
136175
elseif (f == :all)
137-
reset_actual_platform_arguments!()
176+
reset_platform_feature!()
138177
else
139178
check_all(f)
140179
include_actual_platform_argument!(f)
@@ -149,24 +188,24 @@ function platform_parameters_kernel(p_list)
149188

150189
# replace default types to required types in kernel platform parameters
151190
r = []
152-
for k in keys(state.actual_platform_arguments)
191+
for k in keys(state.platform_feature)
153192
found = get(p_dict, k, nothing)
154-
v = state.default_platform_types[k]
193+
v = state.platform_feature_default[k]
155194
push!(r, isnothing(found) ? :(::Type{<:$v}) : :(::Type{<:$found}))
156195
end
157196

158197
return r
159198
end
160199

161200
function check_all(parameter_id)
162-
if (!haskey(state.actual_platform_arguments_all,parameter_id))
201+
if (!haskey(state.platform_feature_all,parameter_id))
163202
throw(parameter_id)
164203
end
165204
parameter_id
166205
end
167206

168207
function check(parameter_id)
169-
if (!haskey(state.actual_platform_arguments,parameter_id))
208+
if (!haskey(state.platform_feature,parameter_id))
170209
throw(parameter_id)
171210
end
172211
parameter_id
@@ -225,7 +264,7 @@ function build_entry_signature(fsign::Expr)
225264
keyword_parameters = length(call_node_args) > 1 && typeof(call_node_args[1]) == Expr && call_node_args[1].head == :parameters ? popfirst!(call_node_args).args : []
226265
# takes a dictionary mapping par->actual_type and returns an expression :(par::actual_type)
227266
# the remaining elements in call_node_args are the kernel parameters.
228-
platform_parameters = map(p->Expr(:kw,Expr(:(::),p[1],Type{<:state.default_platform_types[p[1]]}),p[2]), collect(state.actual_platform_arguments))
267+
platform_parameters = map(p->Expr(:kw,Expr(:(::),p[1],Type{<:state.platform_feature_default[p[1]]}),p[2]), collect(state.platform_feature))
229268
# rebuild the keyword parameters node for the entry function, including the platform_parameters
230269
keyword_parameters_node = Expr(:parameters, platform_parameters..., keyword_parameters...)
231270
# collect the identifiers of the kernel parameters
@@ -239,7 +278,7 @@ end
239278

240279
function build_entry_body(fname, fargs, kargs)
241280
# takes the identifiers of the platform parameters
242-
pargs = keys(state.actual_platform_arguments)
281+
pargs = keys(state.platform_feature)
243282
# builds the :parameters node for the keyword arguments of the kernel invocation (kargs), since the identifiers must be refferenced.
244283
kargs = Expr(:parameters, map(p -> Expr(:kw, p, p), kargs)...)
245284
# returns the :call node for the kernel invocation (note that platform arguments comes before kernel arguments)

0 commit comments

Comments
 (0)