I’d like to take the minimum of a scalar field `z`

subject to some mask `d`

. To illustrate, `z`

is a checkerboard pattern and `d`

is a circle centered at `c_xy`

.

```
N = 10
xy = [(i, j) for i=1:N, j=1:N] # coordinates
z = [(i+j)%2 + 7 for i=1:N, j=1:N] # checkerboard
# render z masked by a circle
function render(xy, z)
function d(xy, z)
c_xy = (5,5)
r = (xy[1] - c_xy[1])^2 + (xy[2] - c_xy[2])^2
mask = (sqrt(Float32(r)) < 3.5)
return mask * z
end
return map(d, xy, z)
end
# render z masked by a circle at c_xy
function render_c(xy, z, c_xy)
function d(xy, z)
r = (xy[1] - c_xy[1])^2 + (xy[2] - c_xy[2])^2
mask = (sqrt(Float32(r)) < 3.5)
return mask * z
end
return map(d, xy, z)
end
# get maximum of z within the mask
function query_c(xy, z, c_xy)
function d(xy, z)
r = (xy[1] - c_xy[1])^2 + (xy[2] - c_xy[2])^2
mask = (sqrt(Float32(r)) < 3.5)
return mask * z
end
#return maximum(map(d, xy, z))
return mapreduce(xyz->d(xyz[1], xyz[2]), max, zip(xy, z))
end
```

`render`

runs fine on the GPU with `GPUArrays`

interface of `CLArrays`

. 1. I wish there were a way to avoid constructing `xy`

and just get the indices. 2. I don’t know how to get `render_c`

working, because it relies on `d`

closing over the value `c_xy`

. I could construct an array full of identical `c_xy`

values, but I’m hoping to have a better solution. (For example, setting the stride of some array to 0 in all dimensions).

Do I need to write a custom kernel? I succeeded once upon using https://mikeinnes.github.io/2017/08/24/cudanative.html as a guide for CuArrays. Are there examples of generic kernels for CLArrays?