GPU Programming: When, Why and How?
Shameless plug for Futhark[0], which you can use to write your computational kernels.  The idea is to use functional constructs like map and reduce to express parallel code and let the compiler handle the generation of low-level OpenCL or CUDA.Disclaimer: I've recently finished a PhD focused on memory optimizations in Futhark.[0]: https://futhark-lang.org/Edit: They do actually mention stuff like Julia and NumPy.