(Note: currently I work at AMD so whilst I don’t speak from them, I should be considered biased)
CUDA is good, it was early and due to it being able to focus on just working well on one architecture its generally been ahead of other cross platform architectures like OpenCL and DirectCompute.
But we have to ask ourselves what the point of specific GPU languages are anymore? When CUDA and other early GPGPU adopter languages appeared it was because the idea of running ‘standard’ CPU languages was out of the question. CUDA sub-tag was original for C for GPUs, as we were still largely at the ASM level when it came out.
However modern GPU can now run standard C/C++ code (even if you have to still think what to code and possible use special pragma/libraries). The first to really demonstrate this was ironically on mobile, with Metal. Metal is pure C99 (iirc) it adds some attributes to pass additional graphics information but Metal’s GPU language is just C.
The latest editions of CUDA are very C++ like with only a few things not supported (and I expect they will be handled very soon, prehaps by Volta?)
On AMD side we have HCC which is Clang based GPU language. C++14/17 just compiles out the box and runs on the GPUs.
So ironically the question isn’t whats the alternative to CUDA but why are we still using GPU specific language like CUDA? There are two related answers, ecosystem and momentum. NVIDIA and other third parties have used CUDA in the past and as such there is a nice ecosystem of functionality that you can get easily for a CUDA based project, also NVIDIA provides some very high quality libraries tuned for there hardware.
Its for this reason AMD created an open source system known as HIP, it lets you compile CUDA/C++ code using HCC on AMD and CUDA on NVIDIA HW. However HIP is a rocky solution, for obvious reasons being 100% CUDA compatible isn’t possible with it being an proprietary language and it will always laging CUDA to some extent. Also it requires source, so binary only libraries can’t be used with HIP/HCC.
If your starting a new project for GPUs, I’d advise using C++ like syntax with perhaps a few preprocessing tricks or HIP to make it look like CUDA for the NV Compiler. Best of multiple worlds, runs fast (via CUDA CC) on NV GPUs, runs fast (via HCC) on AMD and also will run on CPU for validation and forward compatibility after the Zombie apocalypse!