> So during those 5 instructions, theoretically it could be doing some of the next hundred.
Not if the next iteration of the loop not only branches on the previous result (okay, that one's easy on the predictors), but also depends on the previous iteration :)
--
The basic idea behind these designs is that
a) most software is a fat, ugly blob of shit which sometimes calls into
b) specific functions implementing high-performance algorithms (be it compression, encryption, hashing, ..., image manipulation, ...)
So for b) you want a capable design to have high throughput, and that also plays well with a) because it means that the core can spend most of it's time blocking on memory or executing an instruction or two every couple cycles. It also means that SMT works very, very well, since now you got two fat blobs smearing their shit around, but the core has more than enough resources to deal with that. That's why SMT gives 50++ % speed-ups for many applications. Because they're fat blobs.