I can’t disagree with that–nevertheless, for high-performance computing, there are no alternatives. The slow parts of our chip run at 500 GB/s, and we need every byte of that. So it’s very important to use every element of the memory hierarchy: DRAM, L2, L1, “shared memory”, and registers. Knowing how memory addressing works is just the beginning of that.
There’s no way around knowing how memory works at every level. The caches are somewhat automatic, but it’s possible to abuse them. Sometimes we have to intentionally throttle the computation so as not to thrash the caches.
It feels like there’s an increasing divide. It used to be that everyone knew, if not assembler, at least C. Now, Java and Python are more popular. That’s fine–there’s no shortage of demand for coders at that level. And yet, there’s more demand than ever at the lower levels as well. If performance is important, you must know how your machine operates. If you are a game engine developer, or writing neural net libraries, or doing video/image processing, etc., then you have to know this stuff.
The divide is happening everywhere. When my daughter took a computer science 101 class in college the only thing remotely resembling programming was a few lines of JavaScript. More ftp and html than coding. And I discovered that even good hardware designers were so into Verilog and other high level design languages that they didn’t know how to read netlists.
If I ruled CS departments I’d start everyone on bare machines so they really knew what was happening. But we’ll have to accept that those of us who understand the details are a vanishing breed.
I started with machine/assembly (until I could afford an assembler I wrote in pure machine code, all numbers) and it has definitely been valuable to have that base.
Seems like a simplified fictitious assembly with a simulator and a graphical representation of the executing program (e.g. registers, cache, memory, etc.) would be a great thing to start with.