diff --git a/Project.toml b/Project.toml index 74c6068..8bda5f0 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "PlatformAware" uuid = "e7c50b67-2c03-471e-9cf2-69e515d86ecf" authors = ["Francisco Heron de Carvalho Junior and contributors"] -version = "0.4.0" +version = "0.4.1" [deps] AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" diff --git a/src/PlatformAware.jl b/src/PlatformAware.jl index 1c3f42d..83178cc 100644 --- a/src/PlatformAware.jl +++ b/src/PlatformAware.jl @@ -67,7 +67,7 @@ export Yes, No, Provider, - OnPremise, + OnPremises, CloudProvider, MachineFamily, MachineType, diff --git a/src/features/default/Platform.toml b/src/features/default/Platform.toml index 2aebe61..9b246b0 100644 --- a/src/features/default/Platform.toml +++ b/src/features/default/Platform.toml @@ -7,7 +7,7 @@ [node] -node_provider = "OnPremise" +node_provider = "OnPremises" node_virtual = "No" node_dedicated = "Yes" node_machinefamily = "na" @@ -36,6 +36,7 @@ accelerator = "unset" accelerator_count = 0 accelerator_type = "unset" accelerator_manufacturer = "unset" +accelerator_interconnect = "unset" accelerator_api = "unset" accelerator_architecture = "unset" accelerator_memory_size = "unset" diff --git a/src/features/detection.jl b/src/features/detection.jl index 185314f..2e7a619 100644 --- a/src/features/detection.jl +++ b/src/features/detection.jl @@ -60,13 +60,9 @@ function identifyComponent(idtype) node = dict["list"]["node"] if (typeof(node) == Vector{Any}) for v in enumerate(node) - #if ("product" in keys(v[2])) - # push!(l, v[2]["product"]) - #end push!(l,v[2]) end else - #push!(l,node["product"]) push!(l,node) end return l @@ -455,7 +451,7 @@ function collectAcceleratorFeatures(l) # Return the first display device that is an accelerator. # This is valid only for GPUs. i = 1 - for acc_brand in l + for acc_brand in keys(l) # looking at the database acc_info = identifyAcceleratorModel(replace(acc_brand,"[" => "", "]" => "", "(" => "", ")" => "" )) @@ -466,7 +462,7 @@ function collectAcceleratorFeatures(l) device = Dict() accelerator_features[string(i)] = device - device["accelerator_count"] = 1 + device["accelerator_count"] = l[acc_brand] device["accelerator"] = acc_info[2] device["accelerator_type"] = acc_info[3] device["accelerator_manufacturer"] = acc_info[4] @@ -492,6 +488,7 @@ function collectAcceleratorFeaturesDefault() default_features["accelerator"] = "unset" default_features["accelerator_type"] = "unset" default_features["accelerator_manufacturer"] = "unset" + default_features["accelerator_interconnect"] = "unset" default_features["accelerator_api"] = "unset" default_features["accelerator_architecture"] = "unset" default_features["accelerator_memory_size"] = "unset" @@ -506,9 +503,10 @@ end function identifyAccelerator() try - l = Vector() + l = Dict() for d in identifyComponent("display") - push!(l,d["vendor"] * " " * d["product"]) + k = "$(d["vendor"]) $(d["product"])" + l[k] = haskey(l,k) ? l[k] + 1 : 1 end accelerator_features = collectAcceleratorFeatures(l) @@ -731,7 +729,7 @@ function identifyNode() node_features = Dict() node_features["node_count"] = 1 - node_features["node_provider"] = "OnPremise" + node_features["node_provider"] = "OnPremises" node_features["node_virtual"] = "No" node_features["node_dedicated"] = "No" node_features["node_machinefamily"] = "unset" diff --git a/src/features/features.jl b/src/features/features.jl index 859de7e..5bb40f0 100644 --- a/src/features/features.jl +++ b/src/features/features.jl @@ -50,6 +50,7 @@ global feature_type = Dict( :processor => qualifier, :accelerator_count => quantifier, :accelerator_manufacturer => qualifier, + :accelerator_interconnect => qualifier, :accelerator_type => qualifier, :accelerator_architecture => qualifier, :accelerator_api => api_qualifier, @@ -190,8 +191,6 @@ function identifyAPI_oldversion(api_string) dt = AcceleratorBackend api_type = get_qualifier(api_string) - - if (startswith(api_string, "CUDA")) return Tuple{api_type,dt,dt,dt,dt,dt,dt} elseif (startswith(api_string, "OpenCL")) return Tuple{dt,api_type,dt,dt,dt,dt,dt} @@ -202,10 +201,6 @@ function identifyAPI_oldversion(api_string) elseif (startswith(api_string, "DirectX")) return Tuple{dt,dt,dt,dt,dt,dt,api_type} else return Tuple{dt,dt,dt,dt,dt,dt} end - - - #Tuple{Any,Any,Any,Any,Any,Any,Any} - end @@ -226,14 +221,13 @@ function get_api_qualifier(api_string, platform_feature_default) directx_api = get_qualifier(apis[7] in ["na","unset","unknown","ignore"] ? "AcceleratorBackend" : apis[7]) Tuple{cuda_api,opencl_api,openacc_api,oneapi_api,opengl_api,vulkan_api,directx_api} - #Tuple{Any,Any,Any,Any,Any,Any,Any} end function loadFeaturesSection!(dict, platform_feature, platform_feature_default) - if ("0" in keys(dict)) - dict = dict["0"] + if ("1" in keys(dict)) + dict = dict["1"] end for (parameter_id, feature) in dict diff --git a/src/features/qualifiers/common.jl b/src/features/qualifiers/common.jl index d3d2e54..4c38382 100644 --- a/src/features/qualifiers/common.jl +++ b/src/features/qualifiers/common.jl @@ -64,13 +64,33 @@ export Now3D, Now3Dx, MMX, SSE, SSE_2, SSE2, SSE_3, SSE3, SSSE_3, SSSE3, SSE_4, # Memory types abstract type RAM <: MemoryType end -abstract type DDR2 <: RAM end -abstract type DDR3 <: RAM end -abstract type DDR3L <: DDR3 end -abstract type DDR4 <: RAM end -abstract type LPDDR4 <: DDR4 end - -export RAM, DDR2, DDR3, DDR33L, DDR4, LPDDR4 +abstract type SDRAM <: RAM end + +abstract type DDR2 <: SDRAM end +abstract type DDR3 <: SDRAM end +abstract type DDR3L <: SDRAM end +abstract type DDR4 <: SDRAM end +abstract type LPDDR4 <: SDRAM end +abstract type LPDDR4X <: SDRAM end +abstract type DDR5 <: SDRAM end +abstract type LPDDR5 <: SDRAM end + +abstract type DDR_SDRAM <: SDRAM end +abstract type GDDR2 <: SDRAM end +abstract type GDDR3 <: SDRAM end +abstract type GDDR4 <: SDRAM end +abstract type GDDR5 <: SDRAM end +abstract type GDDR5X <: SDRAM end +abstract type GDDR6 <: SDRAM end +abstract type GDDR6X <: SDRAM end + +abstract type HBM2 <: SDRAM end +abstract type HBM2e <: SDRAM end +abstract type HBM3 <: SDRAM end +abstract type HBM_PIM <: SDRAM end + +export RAM, DDR2, DDR3, DDR33L, DDR4, LPDDR4, LPDDR4X, DDR5, LPDDR5 +export DDR_SDRAM, GDDR2, GDDR3, GDDR4, GDDR5, GDDR5X, GDDR6, GDDR6X # Storage types abstract type SSD <: StorageType end diff --git a/src/features/qualifiers/ec2/ec2.jl b/src/features/qualifiers/ec2/ec2.jl index 0573ba1..8fb480b 100644 --- a/src/features/qualifiers/ec2/ec2.jl +++ b/src/features/qualifiers/ec2/ec2.jl @@ -778,7 +778,7 @@ abstract type EC2Type_H1_16xLarge <: EC2Type_H1 end ## function get_instance_info(::Type{<:AmazonEC2}) try - global instance_id = JSON.parse(String(HTTP.request("GET", "http://169.254.169.254/latest/dynamic/instance-identity/document").body)) + global instance_id = JSON.parse(String(HTTP.request("GET", "http://169.254.169.254/latest/dynamic/instance-identity/document"; connect_timeout=10, readtimeout=10).body)) # return instance_info["instanceType"], instance_info["region"] catch e return nothing diff --git a/src/features/qualifiers/general.jl b/src/features/qualifiers/general.jl index f13a812..bfc0e89 100644 --- a/src/features/qualifiers/general.jl +++ b/src/features/qualifiers/general.jl @@ -12,7 +12,7 @@ abstract type No <: Query end # maintainer abstract type Provider <: QualifierFeature end -abstract type OnPremise <: Provider end +abstract type OnPremises <: Provider end abstract type CloudProvider <: Provider end # machine @@ -38,6 +38,7 @@ abstract type Processor end # accelerator +abstract type AcceleratorInterconnect <: QualifierFeature end abstract type AcceleratorType <: QualifierFeature end abstract type AcceleratorArchitecture <: QualifierFeature end abstract type AcceleratorBackend <: QualifierFeature end @@ -53,6 +54,15 @@ abstract type FPGA <: AcceleratorType end abstract type MIC <: AcceleratorType end +abstract type PCIe <: AcceleratorInterconnect end +abstract type NVLink <: AcceleratorInterconnect end +abstract type NVLink_V1 <: NVLink end +abstract type NVLink_V2 <: NVLink end +abstract type NVLink_SLI <: NVLink end +abstract type NVSwitch <: AcceleratorInterconnect end +abstract type GPUDirect <: AcceleratorInterconnect end + + #interconnection abstract type InterconnectionTopology <: QualifierFeature end abstract type Interconnection <: QualifierFeature end diff --git a/src/platform.jl b/src/platform.jl index 8fe9e29..77bf145 100644 --- a/src/platform.jl +++ b/src/platform.jl @@ -57,6 +57,7 @@ defT =[ :accelerator_count => Tuple{AtLeast0,AtMostInf,Q} where Q, :accelerator_type => AcceleratorType, :accelerator_manufacturer => Manufacturer, + :accelerator_interconnect => AcceleratorInterconnect, :accelerator_api => Tuple{AcceleratorBackend,AcceleratorBackend,AcceleratorBackend,AcceleratorBackend,AcceleratorBackend,AcceleratorBackend,AcceleratorBackend}, :accelerator_architecture => AcceleratorArchitecture, :accelerator_memory_size => Tuple{AtLeast0,AtMostInf,Q} where Q, @@ -238,6 +239,8 @@ macro platform(t,f) platform_parameter_macro!(f) elseif (t == :parameter && !getaddparameter()) @info "cannot add parameters after including the first kernel method" + elseif (t == :assumption) + return :($f) else @info "usage: platform [default | aware] " @info " platform parameter :()" @@ -303,7 +306,17 @@ function build_kernel_signature(fsign::Expr) fname = popfirst!(call_node_args) keyword_parameters_node = length(call_node_args) > 0 && typeof(call_node_args[1]) == Expr && call_node_args[1].head == :parameters ? popfirst!(call_node_args) : nothing # takes the platform parameters of the kernel - aware_parameters_args = length(call_node_args) > 0 && typeof(call_node_args[1]) == Expr && call_node_args[1].head == :braces ? popfirst!(call_node_args).args : [] + #aware_parameters_args = length(call_node_args) > 0 && typeof(call_node_args[1]) == Expr && call_node_args[1].head == :braces ? popfirst!(call_node_args).args : [] + aware_parameters_args = [] + if length(call_node_args) > 0 + if typeof(call_node_args[1]) == Expr && call_node_args[1].head == :braces + aware_parameters_args = popfirst!(call_node_args).args + #elseif typeof(call_node_args[1]) == Symbol + # arg = popfirst!(call_node_args) + # aware_parameters_args = @eval arg + end + end + # inserts the kernel's platform parameters into the list platform parameters. ppars = platform_parameters_kernel(aware_parameters_args) new_call_node_args = isnothing(keyword_parameters_node) ? [fname, ppars..., call_node_args...] : [fname, keyword_parameters_node, ppars..., call_node_args...]