Cache coherence tradeoffs in shared-memory MPSoCs