Skip to content

Commit 043dbed

Browse files
Add argument intrinsics (#725)
1 parent 0b6e28c commit 043dbed

File tree

2 files changed

+77
-15
lines changed

2 files changed

+77
-15
lines changed

src/device/intrinsics/arguments.jl

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,16 @@ const nodim_intr = [
1717
]
1818

1919
for (intr, offset) in nodim_intr
20-
# XXX: these are also available as UInt16 (ushort)
20+
intr_i16 = Symbol(intr, :_i16)
21+
intr = Symbol(intr)
2122
@eval begin
22-
export $(Symbol(intr))
23+
# UInt32
24+
export $(intr)
25+
@device_function $(intr)() = ccall($"extern julia.air.$intr.i32", llvmcall, UInt32, ()) + UInt32($offset)
2326

24-
@device_function $(Symbol(intr))() = ccall($"extern julia.air.$intr.i32", llvmcall, UInt32, ()) + UInt32($offset)
27+
# UInt16
28+
export $(intr_i16)
29+
@device_function $(intr_i16)() = ccall($"extern julia.air.$intr.i16", llvmcall, UInt16, ()) + UInt16($offset)
2530
end
2631
end
2732

@@ -39,36 +44,47 @@ const dim_intr = [
3944
]
4045

4146
for (intr, offset) in dim_intr
42-
# XXX: these are also available as UInt16 (ushort)
47+
intr_i16 = Symbol(intr, :_i16)
48+
intr = Symbol(intr)
4349
@eval begin
44-
export $(Symbol(intr))
45-
46-
@device_function function $(Symbol(intr))()
50+
# UInt32
51+
export $(intr)
52+
@device_function function $(intr)()
4753
vec = ccall($"extern julia.air.$intr.v3i32", llvmcall,
4854
NTuple{3, VecElement{UInt32}}, ())
4955
(x = vec[1].value + UInt32($offset),
5056
y = vec[2].value + UInt32($offset),
5157
z = vec[3].value + UInt32($offset))
5258
end
59+
60+
# UInt16
61+
export $(intr_i16)
62+
@device_function function $(intr_i16)()
63+
vec = ccall($"extern julia.air.$intr.v3i16", llvmcall,
64+
NTuple{3, VecElement{UInt16}}, ())
65+
(x = vec[1].value + UInt16($offset),
66+
y = vec[2].value + UInt16($offset),
67+
z = vec[3].value + UInt16($offset))
68+
end
5369
end
5470

5571
# deprecated aliases
5672
@eval begin
57-
export $(Symbol(intr * "_1d"))
58-
export $(Symbol(intr * "_2d"))
59-
export $(Symbol(intr * "_3d"))
73+
export $(Symbol(intr, "_1d"))
74+
export $(Symbol(intr, "_2d"))
75+
export $(Symbol(intr, "_3d"))
6076

61-
function $(Symbol(intr * "_1d"))()
62-
$(Symbol(intr))().x
77+
function $(Symbol(intr, "_1d"))()
78+
$(intr)().x
6379
end
6480

65-
function $(Symbol(intr * "_2d"))()
66-
vec = $(Symbol(intr))()
81+
function $(Symbol(intr, "_2d"))()
82+
vec = $(intr)()
6783
(x = vec.x,
6884
y = vec.y)
6985
end
7086

71-
$(Symbol(intr * "_3d"))() = $(Symbol(intr))()
87+
$(Symbol(intr, "_3d"))() = $(intr)()
7288
end
7389
end
7490

test/device/intrinsics/arguments.jl

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,29 @@
5656
@on_device threads_per_threadgroup_2d()
5757
@on_device threads_per_threadgroup_3d()
5858

59+
# UInt16
60+
@on_device dispatch_quadgroups_per_threadgroup_i16()
61+
@on_device dispatch_simdgroups_per_threadgroup_i16()
62+
@on_device quadgroup_index_in_threadgroup_i16()
63+
@on_device quadgroups_per_threadgroup_i16()
64+
@on_device simdgroup_index_in_threadgroup_i16()
65+
@on_device simdgroups_per_threadgroup_i16()
66+
@on_device thread_index_in_quadgroup_i16()
67+
@on_device thread_index_in_simdgroup_i16()
68+
@on_device thread_index_in_threadgroup_i16()
69+
@on_device thread_execution_width_i16()
70+
@on_device threads_per_simdgroup_i16()
71+
72+
@on_device dispatch_threads_per_threadgroup_i16()
73+
@on_device grid_origin_i16()
74+
@on_device grid_size_i16()
75+
@on_device thread_position_in_grid_i16()
76+
@on_device thread_position_in_threadgroup_i16()
77+
@on_device threadgroup_position_in_grid_i16()
78+
@on_device threadgroups_per_grid_i16()
79+
@on_device threads_per_grid_i16()
80+
@on_device threads_per_threadgroup_i16()
81+
5982
global const CPU_ONLY_ERR = "This function is not intended for use on the CPU"
6083

6184
@test_throws CPU_ONLY_ERR dispatch_quadgroups_per_threadgroup()
@@ -114,4 +137,27 @@
114137
@test_throws CPU_ONLY_ERR threads_per_threadgroup_1d()
115138
@test_throws CPU_ONLY_ERR threads_per_threadgroup_2d()
116139
@test_throws CPU_ONLY_ERR threads_per_threadgroup_3d()
140+
141+
# UInt16
142+
@test_throws CPU_ONLY_ERR dispatch_quadgroups_per_threadgroup_i16()
143+
@test_throws CPU_ONLY_ERR dispatch_simdgroups_per_threadgroup_i16()
144+
@test_throws CPU_ONLY_ERR quadgroup_index_in_threadgroup_i16()
145+
@test_throws CPU_ONLY_ERR quadgroups_per_threadgroup_i16()
146+
@test_throws CPU_ONLY_ERR simdgroup_index_in_threadgroup_i16()
147+
@test_throws CPU_ONLY_ERR simdgroups_per_threadgroup_i16()
148+
@test_throws CPU_ONLY_ERR thread_index_in_quadgroup()
149+
@test_throws CPU_ONLY_ERR thread_index_in_simdgroup_i16()
150+
@test_throws CPU_ONLY_ERR thread_index_in_threadgroup_i16()
151+
@test_throws CPU_ONLY_ERR thread_execution_width_i16()
152+
@test_throws CPU_ONLY_ERR threads_per_simdgroup_i16()
153+
154+
@test_throws CPU_ONLY_ERR dispatch_threads_per_threadgroup_i16()
155+
@test_throws CPU_ONLY_ERR grid_origin_i16()
156+
@test_throws CPU_ONLY_ERR grid_size_i16()
157+
@test_throws CPU_ONLY_ERR thread_position_in_grid_i16()
158+
@test_throws CPU_ONLY_ERR thread_position_in_threadgroup_i16()
159+
@test_throws CPU_ONLY_ERR threadgroup_position_in_grid_i16()
160+
@test_throws CPU_ONLY_ERR threadgroups_per_grid_i16()
161+
@test_throws CPU_ONLY_ERR threads_per_grid_i16()
162+
@test_throws CPU_ONLY_ERR threads_per_threadgroup_i16()
117163
end

0 commit comments

Comments
 (0)