Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Objective-C Availability support #527

Merged
merged 3 commits into from
Feb 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ KernelAbstractions = "0.9.1"
LLVM = "7.2, 8, 9"
LLVMDowngrader_jll = "0.6"
LinearAlgebra = "1"
ObjectiveC = "3.3"
ObjectiveC = "3.4"
PrecompileTools = "1"
Preferences = "1"
Printf = "1"
Expand Down
57 changes: 21 additions & 36 deletions lib/mps/libmps.jl
Original file line number Diff line number Diff line change
Expand Up @@ -384,9 +384,7 @@ end
@objcproperties MPSNDArrayDescriptor begin
@autoproperty dataType::MPSDataType setter = setDataType
@autoproperty numberOfDimensions::UInt64 setter = setNumberOfDimensions
@static if Metal.is_macos(v"15.0.0")
@autoproperty preferPackedRows::Bool setter = setPreferPackedRows
end
@autoproperty preferPackedRows::Bool setter = setPreferPackedRows availability = macos(v"15.0.0")
end

@objcwrapper immutable = true MPSNDArrayAllocator <: NSObject
Expand Down Expand Up @@ -2541,56 +2539,43 @@ end

@objcwrapper immutable = true MPSNDArrayGatherGradient <: MPSNDArrayBinaryPrimaryGradientKernel

@static if Metal.is_macos(v"15.0.0")
@objcwrapper immutable = true MPSNDArrayIdentity <: MPSNDArrayUnaryKernel
end
@objcwrapper immutable = true availability = macos(v"15.0.0") MPSNDArrayIdentity <: MPSNDArrayUnaryKernel

@cenum MPSNDArrayQuantizationScheme::UInt64 begin
MPSNDArrayQuantizationTypeNone = 0x0000000000000000
MPSNDArrayQuantizationTypeAffine = 0x0000000000000001
MPSNDArrayQuantizationTypeLUT = 0x0000000000000002
end

@static if Metal.is_macos(v"15.0.0")
@objcwrapper immutable = true MPSNDArrayQuantizationDescriptor <: NSObject
@objcproperties MPSNDArrayQuantizationDescriptor begin
@autoproperty quantizationDataType::MPSDataType
@autoproperty quantizationScheme::MPSNDArrayQuantizationScheme
end
end
@objcwrapper immutable = true availability = macos(v"15.0.0") MPSNDArrayQuantizationDescriptor <: NSObject

@static if Metal.is_macos(v"15.0.0")
@objcwrapper immutable = true MPSNDArrayAffineQuantizationDescriptor <: MPSNDArrayQuantizationDescriptor
@objcproperties MPSNDArrayAffineQuantizationDescriptor begin
@autoproperty hasZeroPoint::Bool setter = setHasZeroPoint
@autoproperty hasMinValue::Bool setter = setHasMinValue
@autoproperty implicitZeroPoint::Bool setter = setImplicitZeroPoint
end
@objcproperties MPSNDArrayQuantizationDescriptor begin
@autoproperty quantizationDataType::MPSDataType
@autoproperty quantizationScheme::MPSNDArrayQuantizationScheme
end

@static if Metal.is_macos(v"15.0.0")
@objcwrapper immutable = true MPSNDArrayLUTQuantizationDescriptor <: MPSNDArrayQuantizationDescriptor
end
@objcwrapper immutable = true availability = macos(v"15.0.0") MPSNDArrayAffineQuantizationDescriptor <: MPSNDArrayQuantizationDescriptor

@static if Metal.is_macos(v"15.0.0")
@objcwrapper immutable = true MPSNDArrayQuantizedMatrixMultiplication <: MPSNDArrayMatrixMultiplication
@objcproperties MPSNDArrayAffineQuantizationDescriptor begin
@autoproperty hasZeroPoint::Bool setter = setHasZeroPoint
@autoproperty hasMinValue::Bool setter = setHasMinValue
@autoproperty implicitZeroPoint::Bool setter = setImplicitZeroPoint
end

@static if Metal.is_macos(v"15.0.0")
@objcwrapper immutable = true MPSNDArrayLUTDequantize <: MPSNDArrayMultiaryKernel
end
@objcwrapper immutable = true availability = macos(v"15.0.0") MPSNDArrayLUTQuantizationDescriptor <: MPSNDArrayQuantizationDescriptor

@static if Metal.is_macos(v"15.0.0")
@objcwrapper immutable = true MPSNDArrayVectorLUTDequantize <: MPSNDArrayMultiaryKernel
@objcproperties MPSNDArrayVectorLUTDequantize begin
@autoproperty vectorAxis::UInt64 setter = setVectorAxis
end
end
@objcwrapper immutable = true availability = macos(v"15.0.0") MPSNDArrayQuantizedMatrixMultiplication <: MPSNDArrayMatrixMultiplication

@objcwrapper immutable = true availability = macos(v"15.0.0") MPSNDArrayLUTDequantize <: MPSNDArrayMultiaryKernel

@static if Metal.is_macos(v"15.0.0")
@objcwrapper immutable = true MPSNDArrayAffineInt4Dequantize <: MPSNDArrayMultiaryKernel
@objcwrapper immutable = true availability = macos(v"15.0.0") MPSNDArrayVectorLUTDequantize <: MPSNDArrayMultiaryKernel

@objcproperties MPSNDArrayVectorLUTDequantize begin
@autoproperty vectorAxis::UInt64 setter = setVectorAxis
end

@objcwrapper immutable = true availability = macos(v"15.0.0") MPSNDArrayAffineInt4Dequantize <: MPSNDArrayMultiaryKernel

struct _MPSPackedFloat3
data::NTuple{12, UInt8}
end
Expand Down
340 changes: 125 additions & 215 deletions lib/mtl/libmtl.jl

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions res/wrap/libmps.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ use_ccall_macro = true
always_NUL_terminated_string = true
opaque_as_mutable_struct = true

version_function = "Metal.is_macos"

[codegen.macro]
# it's highly recommended to set this entry to "basic".
# if you'd like to skip all of the macros, please set this entry to "disable".
Expand Down
3 changes: 0 additions & 3 deletions res/wrap/libmtl.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
[general]
library_name = "Symbol(\"/System/Library/Frameworks/Metal.framework/Resources/BridgeSupport/Metal.dylib\")"
output_file_path = "../../lib/mtl/libmtl.jl"
prologue_file_path = "libmtl_prologue.jl"

minimum_macos_supported = "13"

Expand All @@ -23,8 +22,6 @@ use_ccall_macro = true
always_NUL_terminated_string = true
opaque_as_mutable_struct = true

version_function = "Metal.is_macos"

[codegen.macro]
# it's highly recommended to set this entry to "basic".
# if you'd like to skip all of the macros, please set this entry to "disable".
Expand Down
5 changes: 0 additions & 5 deletions res/wrap/libmtl_prologue.jl

This file was deleted.

1 change: 1 addition & 0 deletions src/Metal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import LLVMDowngrader_jll
using Preferences: @load_preference, load_preference
using ExprTools: splitdef, combinedef
using ObjectiveC, .CoreFoundation, .Foundation, .Dispatch, .OS
import ObjectiveC: is_macos, darwin_version, macos_version
import KernelAbstractions

include("version.jl")
Expand Down
75 changes: 0 additions & 75 deletions src/version.jl
Original file line number Diff line number Diff line change
@@ -1,78 +1,3 @@
# version and support queries

@noinline function _syscall_version(name)
size = Ref{Csize_t}()
err = @ccall sysctlbyname(name::Cstring, C_NULL::Ptr{Cvoid}, size::Ptr{Csize_t},
C_NULL::Ptr{Cvoid}, 0::Csize_t)::Cint
Base.systemerror("sysctlbyname", err != 0)

osrelease = Vector{UInt8}(undef, size[])
err = @ccall sysctlbyname(name::Cstring, osrelease::Ptr{Cvoid}, size::Ptr{Csize_t},
C_NULL::Ptr{Cvoid}, 0::Csize_t)::Cint
Base.systemerror("sysctlbyname", err != 0)

verstr = view(String(osrelease), 1:size[]-1)
parse(VersionNumber, verstr)
end

@static if isdefined(Base, :OncePerProcess) # VERSION >= v"1.12.0-DEV.1421"
const darwin_version = OncePerProcess{VersionNumber}() do
_syscall_version("kern.osrelease")
end
const macos_version = OncePerProcess{VersionNumber}() do
_syscall_version("kern.osproductversion")
end
else
const _darwin_version = Ref{VersionNumber}()
function darwin_version()
if !isassigned(_darwin_version)
_darwin_version[] = _syscall_version("kern.osrelease")
end
_darwin_version[]
end

const _macos_version = Ref{VersionNumber}()
function macos_version()
if !isassigned(_macos_version)
_macos_version[] = _syscall_version("kern.osproductversion")
end
_macos_version[]
end
end

@doc """
Metal.darwin_version() -> VersionNumber

Returns the host Darwin kernel version.

See also [`Metal.macos_version`](@ref).
""" darwin_version

@doc """
Metal.macos_version() -> VersionNumber

Returns the host macOS version.

See also [`Metal.darwin_version`](@ref).
""" macos_version

"""
Metal.is_macos([ver::VersionNumber]) -> Bool

Returns whether the OS is macOS with version `ver` or newer.

See also [`Metal.macos_version`](@ref).
"""
function is_macos(ver=nothing)
if !Sys.isapple()
false
elseif ver === nothing
true
else
macos_version() >= ver
end
end


## support queries

Expand Down
11 changes: 11 additions & 0 deletions test/version.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
@testset "Version" begin

@test Metal.darwin_version() isa VersionNumber
@test Metal.macos_version() isa VersionNumber
@test Metal.is_macos(Metal.macos_version())

@test Metal.metallib_support() isa VersionNumber
@test Metal.air_support() isa VersionNumber
@test Metal.metal_support() isa VersionNumber

end # testset "Version"