-
Notifications
You must be signed in to change notification settings - Fork 238
/
Copy pathversion.jl
66 lines (48 loc) · 1.78 KB
/
version.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# device intrinsics for querying the compute SimpleVersion and PTX ISA version
## a GPU-compatible version number
export SimpleVersion, @sv_str
struct SimpleVersion
major::UInt32
minor::UInt32
SimpleVersion(major, minor=0) = new(major, minor)
end
function Base.tryparse(::Type{SimpleVersion}, v::AbstractString)
parts = split(v, ".")
1 <= length(parts) <= 2 || return nothing
int_parts = map(parts) do part
tryparse(Int, part)
end
any(isnothing, int_parts) && return nothing
SimpleVersion(int_parts...)
end
function Base.parse(::Type{SimpleVersion}, v::AbstractString)
ver = tryparse(SimpleVersion, v)
ver === nothing && throw(ArgumentError("invalid SimpleVersion string: '$v'"))
return ver
end
SimpleVersion(v::AbstractString) = parse(SimpleVersion, v)
@inline function Base.isless(a::SimpleVersion, b::SimpleVersion)
(a.major < b.major) && return true
(a.major > b.major) && return false
(a.minor < b.minor) && return true
(a.minor > b.minor) && return false
return false
end
macro sv_str(str)
SimpleVersion(str)
end
## accessors for the compute SimpleVersion and PTX ISA version
export compute_capability, ptx_isa_version
for var in ["sm_major", "sm_minor", "ptx_major", "ptx_minor"]
@eval @device_function @inline $(Symbol(var))() =
Base.llvmcall(
$("""@$var = external global i32
define i32 @entry() #0 {
%val = load i32, i32* @$var
ret i32 %val
}
attributes #0 = { alwaysinline }
""", "entry"), UInt32, Tuple{})
end
@device_function @inline compute_capability() = SimpleVersion(sm_major(), sm_minor())
@device_function @inline ptx_isa_version() = SimpleVersion(ptx_major(), ptx_minor())