Docela dobrá legrace s cachemi je při programování pro víceprocoserové systémy, kdy dva procesory zapisují na stejnou adresu a každý procesor má vlastní verzi dat v cache.
Bylo by možná dobré zmínit, jak se cache synchronizují, jak funguje odposlouchávání sběrnice, atd :-)
Cache v multiprocesorovém systému jsou synchronizované. Čili se nemůže stát, že různé procesory mají ve své cachi různá data. Co není synchronizováno, jsou výkonné jednotky, ty můžou ty přístupy do cache různě přehazovat.
Docela by mě zajímalo, jak funguje ta víceprocesorová synchronizace na Sparc64 s těma jeho cachema indexovanýma virtuálními adresami.
A to tedy prrr, to může. Tedy nevím, jak současný procesory, ale v budoucnu to určitě začne být běžné. Nehledě na to, že s vyšujícím počtem procesorů se paměť sdílí jinak. (nCube, a tak). Nicméně současné procesory umí tzv. memory fence pomocí instrukce LOCK zamknout sběrnici a tím si vynutit většinou operaci READ-MODIFY-WRITE, zároveň se tím ale synchronizuji i cache, protože operace se provede write throw. Používat LOCK má tedy význam i při samotném zápisu (máme jistotu, že data se aktualizují všude) nebo při samotném čtení (čteme skutečný stav paměti, ne cache). Pochopitelně na tom úpí rychlost.
No a novější procesory zavádí protokol Acquire a Release. Vznikl víceméně ze dvou důvodů. První je, že procesor nezaručuje pořadí operací s paměti. Dvě čtecí, či zapisovací operace se mohou stát opačně z hlediska druhého procesoru, než je naprogramováno. No a zároveń zavádí polovční memory fence. Ta zaručí, ze po čtecí operace po Acquire přečte data až po instrukcí čtení a zápisu před Acquire. A naopak data zapsaná před Release se zapíší dřív, než data zapsaná po Release. Ve spolupráci s cache to zaručí, že před Acquire freshnou všechny staré data v cache (pokud tam jsou) a po Release ze flushnou všechny dirty data do paměti. Pakliže oba procesory používají Acquire a Release, a je zaručeno, že jeden procesor udělá Acquire po Release druhého procesoru, je také zaručeno, že data zapsaná před Releasem prvního procesoru budou platná po Acquire druhého procesoru.
I když současné procesory x86 synchronizaci řeší jinak, tahle doba nás v nejbližší době čeká.
Pokud by někdo udělal SMP s nesynchronizovanou cachí, znamenalo by to, že při každém braní spinlocku se cache musí vyprázdnit a těsně před odemčením spinlocku se musí modifikované položky zapsat do paměti. A když se podíváš, kolik spinlocků v tom jádře je, tak taková cache by nezrychlovala, ale zpomalovala (čím větší cache => tím větší čas na braní spinlocku).