It is, good going.
One more note on
There’s some subtlety to this that I didn’t explain, partially out of laziness. CT<:AbstractVector does work on GPU, but I presume you ditched it because isbits() was always false. Why does it work on GPU then? That’s because CUDA.jl actually automatically converts CuArrays (not isbits) to CuDeviceArrays (isbits) before passing them to a kernel. This happens behind the scenes so you don’t notice it most of the time, but if you were to @cuprintf typeof(array) in a kernel you would.