Do these protocols work without modification when there's more than one execution context per core (ie. hyperthreaded cores)?
I think they do. The private per-core caches are shared between the execution contexts, so there is no coherence problem with respect to each of the execution contexts on each core. In addition, since all the information needed to convey which state the cache is in is stored in the cache itself, swapping between active execution contexts on the core will not ruin the state of the cache.
I was reading online about the motivation behind MESIF and MOESI protocols. Due to the simplifications we introduced in lecture, the advantages aren't as easy to see.
The issue with MESI protocol is about cache misses. For MESI protocol in production systems, one cache controller would first ask for all other caches (instead of directly the main memory) for the line. Then, all caches with the line would respond with the data, which incurs a lot of unnecessary bandwidth. Thus, the motivation of the MESIF protocol is to denote one single cache as the "forwarder" of the cache line, thereby reducing the bandwidth consumption significantly.
For more background, I found this post useful: http://electronics.stackexchange.com/questions/93069/why-do-we-need-the-moesi-mesif-protocols
@a. Your understanding is correct.
Are there cases of practical interest that favor one protocol vs another?