Originally Posted by uOpt
It is a great list but it is missing one important point:
Core2 also has speculative prefetch for the L2 data cache.
That means Core2 can fill cache lines in that cache even before it is sure they will be needed. If the code execution later turns out to need other data, then it can discard it. The K8 cannot do this, the K8 can only prefetch when it is sure which cache line will be needed.
That is a huge deal when running code that is not super-optimized. Because in the traditional setup your L2 cache is pretty much never capable of having data that you didn't use before ready, and you will stall until the memory fetch finishes. With speculative prefetch you have a much higher chance of finding the data you want even if it wasn't in the cache from previous operations.
I think that without that feature any CPU cache above 1 MB is probably useless for general-purpose, not superoptimized code.
I haven't had time to confirm, but I think this plays a major role for one performance oddity I see with Core2: while it is normally 20% faster than AMD64 at the same clock, it sometimes goes to 50% and I have seen 90%. And that is code that is known to be totally free of SSE. I think prefetch is the most likely cause of this.