Definitely, with backend agnostic code you can target only a common set of features. It's convenient to use where it makes sense as it reduces the complexity: 1 kernel for all backends.
And you can actually go a long way with this without sacrificing too much of the performance.
But for squeezing maximum performance & using latest features you have to target each device individually.
> May I ask, is there any reason why one would focus themselfves on a single type of graphics card instead of relying on a library that works for other variants too?
AMDGPU.jl is actually one of the backends supported by Julia.
We do support CUDA, Metal, Intel, OpenCL as well to a varying degree: https://github.com/JuliaGPU
Each GPU backend implements a common array interface and a way to compile Julia code for low-level kernels relying on the GPUCompiler infrastructure: https://github.com/JuliaGPU/GPUCompiler.jl
Once that is done, users can write code and low-level kernels (using KernelAbstractions.jl) in a backend-agnostic manner.
Here're some examples of packages that target multiple GPU backends in this way: