|
107 | 107 | MATH_INTR_FUNCS_1_ARG = [ |
108 | 108 | # Common functions |
109 | 109 | # saturate, # T saturate(T x) Clamp between 0.0 and 1.0 |
110 | | - # sign, # T sign(T x) returns 0.0 if x is NaN. Not tested because intrinsic not yet defined |
| 110 | + sign, # T sign(T x) returns 0.0 if x is NaN |
111 | 111 |
|
112 | 112 | # float math |
113 | 113 | acos, # T acos(T x) |
@@ -166,7 +166,6 @@ MATH_INTR_FUNCS_2_ARG = [ |
166 | 166 |
|
167 | 167 | MATH_INTR_FUNCS_3_ARG = [ |
168 | 168 | # Common functions |
169 | | - # clamp, # T clamp(T x, T minval, T maxval). Not tested because intrinsic not yet defined |
170 | 169 | # mix, # T mix(T x, T y, T a) # x+(y-x)*a |
171 | 170 | # smoothstep, # T smoothstep(T edge0, T edge1, T x) |
172 | 171 | fma, # T fma(T a, T b, T c) |
|
268 | 267 | end |
269 | 268 | end |
270 | 269 |
|
| 270 | + let # clamp |
| 271 | + N = 4 |
| 272 | + in = randn(T, N) |
| 273 | + minval = fill(T(-0.6), N) |
| 274 | + maxval = fill(T(0.6), N) |
| 275 | + |
| 276 | + mtlin = MtlArray(in) |
| 277 | + mtlminval = MtlArray(minval) |
| 278 | + mtlmaxval = MtlArray(maxval) |
| 279 | + |
| 280 | + mtlout = fill!(similar(mtlin), 0) |
| 281 | + |
| 282 | + function kernel(res, x, y, z) |
| 283 | + idx = thread_position_in_grid_1d() |
| 284 | + res[idx] = clamp(x[idx], y[idx], z[idx]) |
| 285 | + return nothing |
| 286 | + end |
| 287 | + Metal.@sync @metal threads = N kernel(mtlout, mtlin, mtlminval, mtlmaxval) |
| 288 | + @test Array(mtlout) == clamp.(in, minval, maxval) |
| 289 | + end |
| 290 | + |
271 | 291 | let #pow |
272 | 292 | N = 4 |
273 | 293 | arr1 = rand(T, N) |
|
0 commit comments