One example of this for me is that you don't need special drivers for making your program run on a CPU; that would sound quite strange to most developers I think.
But many high-end systems have full blown GPUs on them that we basically never use unless they're specifically interfaced with for video purposes, scientific computing, etc.
Even then, you still have to use specific interfaces to access that hardware. It's not intrinsic to the language.
But say I wanted to run some generic routines across CUDA cores/Stream Processors, I have to explicitly move into the realm of GPGPU programming to do that, and then you have to write "compute kernel" code. It's not just... programming. It's fully terminology'd, it's own thing.
There's no standard library for any programming languages that automatically sends your routines to the GPU.
I don't know how all of this should be approached. I've been exposed to all of these systems, but they're all clearly isolated.
All I know is that it doesn't feel right. I fully engage development efforts feeling like I'm not using the full compute power I have available to me, and a part of that I think is that today we just don't think like developers did 50 years ago.
We have so much compute resource available to us, I think in some very fundamental ways--industry wide--we no longer understand how to use these systems. I know I don't.
I'm consistently asking myself why certain operations I write take milliseconds for some reason instead of microseconds. That's tremendously concerning to me.