Кіріспе

Орталық процессордың аппараттық кэші – компьютердің орталық процессоры (CPU) негізгі жадтан деректерге қол жеткізудің орташа құнын (уақыт немесе энергия) төмендету үшін пайдаланатын кэш. Кэш – процессор ядросына жақын орналасқан, жиі қолданылатын негізгі жадтың орналасқан жерлерінен деректердің көшірмелерін сақтайтын кішкентай, жылдам жад. Көптеген CPU-да бірнеше кэш деңгейлерінің иерархиясы болады (L1, L2, көбінесе L3, сирек жағдайда тіпті L4), ал 1-деңгейде әртүрлі нұсқауларға және деректерге арналған кэштер болады. Кэш жады әдетте статикалық кездейсоқ сұраныс жадымен (SRAM) іске асырылады, қазіргі заманғы CPU-да чиптік ауданның ең үлкен бөлігі осыған толады, бірақ SRAM әрқашан барлық деңгейлерде (I немесе D кэш) немесе тіпті кез келген деңгейде қолданылмайды, кейде кейбір соңғы немесе барлық деңгейлер eDRAM арқылы іске асырылады. Басқа да кэш түрлері бар (олар жоғарыда аталған ең маңызды кэштердің "кэш көлеміне" кірмейді), мысалы, көптеген процессорларда бар жад басқару блогының (MMU) құрамына кіретін аудармалық іздеу буфері (TLB).

Тарих

CPU кэшіне алғашқы мысалдар 1960 жылдары Atlas 2 және IBM System/360 Model 85 процессорларын қамтиды. Кэшті пайдаланған алғашқы процессорлар кэштен тек бір деңгейге ие болды; кейінгі 1-деңгейлі кэштен айырмашылығы, ол L1d (деректер үшін) және L1i (нұсқаулар үшін) деп бөлінбеді. L1 кэшін бөлу 1976 жылы IBM 801 CPU-мен басталды, 1980 жылдардың соңында кең таралды және 1997 жылы ARMv5TE процессорларымен кіріктірілген CPU нарығына енді. 2015 жылы тіпті бір доллардан кем SoC-тер L1 кэшін бөліп пайдаланды. Олар сондай-ақ L2 кэштеріне және үлкен процессорлар үшін L3 кэштеріне де ие. L2 кэші әдетте бөлінбейді және бұрын бөлінген L1 кэш үшін ортақ репозиторий ретінде қызмет етеді. Көп ядролы процессордың әрбір ядросы жеке L1 кэшке ие және әдетте ядролар арасында бөліспейді. L2 кэші және жоғары деңгейлі кэштер ядролар арасында бөлісуі мүмкін. L4 кэші қазіргі уақытта сирек кездеседі және әдетте статикалық кездейсоқ сүйемелдеу жадынан (SRAM) гөрі бөлек микросхемадағы немесе чиптегі динамикалық кездейсоқ сүйемелдеу жадынан (DRAM) тұрады. Бұған ерекшелік – eDRAM кэштің барлық деңгейлері үшін, L1-ге дейін қолданылуы. Тарихи түрде L1 де жеке микросхемада болған, бірақ үлкен микросхема өлшемдері оны және басқа кэш деңгейлерін интеграциялауға мүмкіндік берді, соңғы деңгейден басқа. Кэштің әрбір қосымша деңгейі көбірек сыйымдылыққа ие болып, әртүрлі оңтайландырылған. Кэштер (RAM үшін тарихи түрде) әдетте 2, 4, 8, 16 және т.б. KiB өлшемдерінде өлшенді; MiB өлшемдеріне дейін (яғни L1 емес, үлкендер үшін) бұл үлгі өте ерте бұзылды, өлшемді екі есеге көбейту қағидасын міндетті етпей, үлкен кэштерге мүмкіндік беру үшін, мысалы, 2008 жылдың сәуірінде 3 MiB L2 кэші бар Intel Core 2 Duo. Бұл L1 кэштері үшін әлдеқайда кейінірек болды, өйткені олардың көлемі әдетте шағын KiB шамасында болады. Дегенмен, 2012 жылғы IBM zEC12 процессоры өз уақыты үшін ерекше үлкен 96 KiB L1 деректер кэшіне ие болды, мысалы, IBM z13 96 KiB L1 нұсқаулар кэшіне (және 128 KiB L1 деректер кэшіне) және 2018 жылдан бастап Intel Ice Lake негізіндегі процессорлар 48 KiB L1 деректер кэшіне және 48 KiB L1 нұсқаулар кэшіне ие. 2020 жылы кейбір Intel Atom процессорлары (24 ядроға дейін) 4.5 MiB және 15 MiB кэш өлшемдеріне ие.

Кэш жазулары

Деректер жад пен кэш арасында кэш жолдары немесе кэш блоктары деп аталатын, белгілі бір өлшемдегі блоктар түрінде тасымалданады. Кэшке жадтан дерек көшірілген кезде, кэш жазбасы құрылады. Кэш жазбасы көшірілген деректерді, сондай-ақ сұралған жад орнын (тег деп аталады) қамтиды. Процессор жадтағы бір орынды оқу немесе жазу қажет болғанда, ол ең алдымен кэште сәйкес жазба бар ма екенін тексереді. Кэш, сұралған жад орнының мазмұнын, сол адресті қамтуы мүмкін кез келген кэш жолдарында іздейді. Егер процессор жад орны кэште табылып, оқуға немесе жазуға болатын болса, кэш сәйкестігі орын алды. Әйтпесе, егер процессор жад орнын кэште таба алмаса, кэш қатесі болады. Кэш сәйкестігі болған жағдайда процессор дереу кэш жолындағы деректерді оқиды немесе жазады. Кэш қатесі болған жағдайда, кэш жаңа жазбаны бөліп, деректерді негізгі жадтан көшіреді, содан кейін сұрау кэш мазмұнынан орындалады.

Ауыстыру саясаты

Кэш жаңа жазбаға орын ашу үшін, қазіргі жазбалардың біреуін шығаруға тура келуі мүмкін. Шығарылатын жазбаны таңдау үшін қолданылатын тәсіл алмастыру саясаты деп аталады. Кез келген алмастыру саясатының басты мәселесі – болашақта қай жазбаның ең аз қолданылатынын болжауы керек. Болашақты болжау қиын болғандықтан, қолданыстағы алмастыру саясаттарының ішінде таңдауға ең дұрыс әдіс жоқ. Ең көп қолданылған алмастыру саясатының бірі – ең соңғы пайдаланылған (LRU), ол ең соңғы қол жеткізілген жазбаны алмастырады. Жадтың кейбір бөліктерін кэште сақтауға жарамсыз деп белгілеу өнімділікті арттыруға көмектеседі, себебі сирек қайта қолданылатын жад аймақтарын кэштеуден аулақ болуға болады. Бұл, кэшке бірде-бір рет пайдаланбастан ақ жүктеудің артық шығындарынан құтылуға мүмкіндік береді. Кэш жазбалары контекстке байланысты өшірілуі немесе құлыпталуы мүмкін.

Саясаттарды жазу

Егер деректер кэшке жазылса, белгілі бір сәтте олар негізгі жадқа да жазылуы керек; осы жазудың уақыты жазу саясаты деп аталады. Жай жазу кэшінде кэшке жазылған әрбір жазу негізгі жадқа жазуды тудырады. Керісінше, кері жазу немесе көшіру кэшінде жазулар бірден негізгі жадқа көшірілмейді, оның орнына кэш қай орынға жазылғанын қадағалап, оларды «ластанған» деп белгілейді. Бұл орындардағы деректер тек олар кэштен шығарылғанда ғана негізгі жадқа жазылады. Сондықтан, кері жазу кэшіндегі оқу қатесі кейде қызмет көрсету үшін екі жадқа кіруді қажет етуі мүмкін: біріншісі – ластанған орынды негізгі жадқа жазу үшін, содан кейін екіншісі – жадтан жаңа орынды оқу үшін. Сондай-ақ, кері жазу кэшінде әлі бейнеленбеген негізгі жад орнына жазу, бұрыннан ластанған орынды шығарып тастауы мүмкін, осылайша жаңа жад орны үшін кэш орнын босатады. Орталық саясаттар да бар. Кэшке жазулар тікелей жазылуы мүмкін, бірақ жазулар уақытша сақтау деректерінің кезегінде сақталуы мүмкін, әдетте бірнеше жазуды бірге өңдеу үшін (бұл шина айналымдарын азайтып, шинаны пайдалануды жақсарта алады). Негізгі жадтан кэштелген деректерді басқа құрылғылар (мысалы, тікелей жадқа қол жеткізуді (DMA) пайдаланатын немесе көп ядролы процессордағы басқа ядро) өзгерте алады, бұл жағдайда кэштегі көшірме ескі немесе тозығы жеткен болуы мүмкін. Сонымен қатар, көп процессорлы жүйедегі процессор кэштегі деректерді жаңартқанда, басқа процессорлармен байланысты кэштегі деректердің көшірмелері ескіреді. Деректерді үйлесімді ұстайтын кэш менеджерлері арасындағы байланыс протоколдары кэш үйлесімділік протоколдары деп аталады.

Кэштің орындалуы

Кэштің өнімділігін өлшеу соңғы уақыттарда маңыздырақ болды, себебі жадтың және процессордың өнімділігі арасындағы жылдамдық айырмасы экспоненциалды түрде өсуде. Кэш осы жылдамдық айырмасын азайту үшін жасалды. Сондықтан, кэш процессор мен жадтың жылдамдығындағы айырманы қаншалықты тиімді түрде жабатынын білу, әсіресе жоғары өнімді жүйелерде маңызды. Кэш сәйкестігінің (hit) және кэш сәйкессіздігінің (miss) деңгейі осы өнімділікті анықтауда маңызды рөл атқарады. Кэштің өнімділігін жақсарту үшін, сәйкессіздік деңгейін азайту қажетті қадамдардың бірі болып табылады. Сондай-ақ, кэшке қол жеткізу уақытын қысқарту оның өнімділігін арттырып, оңтайландыруға көмектеседі.

Процесордың тоқтауы

Кэш желісін жадтан алуға кететін уақыт (кэштен қате түскендегі оқудың кешігуі) маңызды, себебі CPU кэш желісі күтіп тұрғанда жұмысын тоқтатады. CPU осы жағдайға жеткенде, ол тоқтауға түседі деп айтылады. CPU-лар негізгі жадтан гөрі жылдам болғандықтан, кэштен қате туындаған тоқтаулар көптеген есептеу мүмкіндіктерін жояды; қазіргі заманғы CPU-лар негізгі жадтан бір кэш желісін алуға кеткен уақытта жүздеген командаларды орындай алады. Осы уақытта CPU-ды жұмыспен қамту үшін түрлі техникалар қолданылады, соның ішінде командаларды реті келмей орындау, онда CPU кэштен қате деректерді күтіп тұрған командадан кейін тәуелсіз командаларды орындауға тырысады. Көптеген процессорлар қолданатын тағы бір технология – бір уақытта көп тізбектілікті (SMT) пайдалану, ол бірінші тізбек қажетті CPU ресурстарын күтіп тұрғанда, CPU ядросын екінші тізбекке пайдалануға мүмкіндік береді.

Тікелей карталанған кэш

Бұл кэштік ұйымда негізгі жадтағы әрбір орын кэшке тек бір жазуға ғана кіре алады. Сондықтан, тікелей сәйкестендірілген кэшті "бір жолды жиынтық ассоциативтік кэш" деп те атауға болады. Оның нақты орналастыру саясаты жоқ, себебі кэш жазуын шығарып тастауға таңдау жасау қажеттілігі туындамайды. Бұл, егер екі орын бір жазуға сәйкес келсе, олар бір-бірін үнемі алмастырып отыруы мүмкін дегенді білдіреді. Қарапайым болғанымен, тікелей сәйкестендірілген кэштің салыстырмалы өнімділік көрсетуі үшін ассоциативтік кэштен әлдеқайда үлкен болуы керек, сондай-ақ ол көбірек болжаусыздыққа бейім. Егер x – кэштегі блок нөмірі, y – жад блоктарының нөмірі, ал n – кэштегі блоктар саны болса, онда сәйкестендіру теңдеу арқылы жүзеге асырылады.

Екі жақты жиынтық ассоциативтік кэш

Егер негізгі жадтағы әрбір орналасу кэште екі орынның бірінде сақталуы мүмкін болса, туындайтын логикалық сұрақ: қайсысы екені? Ең қарапайым және кеңінен қолданылатын схема, жоғарыдағы оң жақ суретте көрсетілгендей, жад орналасуының индексінің ең кіші маңызды биттерін кэш жадының индексі ретінде пайдалану және әрбір индекс үшін екі жазбаны ұстау болып табылады. Бұл схеманың бір артықшылығы – кэште сақталатын тегтер кэш жадының индексімен анықталатын негізгі жад адресінің бөлігін қамтуы қажет емес. Кэш тегтеріндегі биттердің саны азайғандықтан, аз транзисторлар қажет, процессордың схемалық тақтасында немесе микропроцессор чипінде аз орын алады, сондай-ақ оларды жылдам оқуға және салыстыруға болады. Сонымен қатар, LRU алгоритмі ерекше қарапайым, себебі әрбір жұп үшін тек бір бит сақтау жеткілікті.

Спекулятивті орындау

Тікелей карталанған кэштің бір артықшылығы – ол қарапайым және жылдам болжауға мүмкіндік береді. Адрес есептелгеннен кейін, жадыда сол орналасудың көшірмесі болуы мүмкін жалғыз кэш индексі белгілі болады. Осы кэш жазбасын оқуға болады, ал процессор тегтің сұралған мекенжайға сәйкес келетінін тексеруді аяқтамас бұрын осы деректермен жұмыс істеуді жалғастыра алады. Процессордың кэштелген деректерді тег сәйкестігі аяқталмас бұрын пайдалану идеясы ассоциативтік кэштерге де қолданылуы мүмкін. Тегтің бір бөлігі, «нұсқау» деп аталатын, сұралған мекенжайға сәйкестендірілген кэш жазбаларының тек біреуін таңдау үшін пайдаланылуы мүмкін. Нұсқау арқылы таңдалған жазбаны толық тегті тексерумен бірге қолдануға болады. Нұсқау әдісі адресті аудару контекстінде ең жақсы жұмыс істейді, төменде түсіндірілгендей.

Екі жақты ауытқуы бар ассоциативтік кэш

Басқа схемалар ұсынылды, мысалы, қисайған кэш. Сонымен қатар, жаңа жол жүктеу және ескі жолды жою қажет болғанда, қайдағы қолданыстағы жол ең соңғы қолданылғанын анықтау қиын болуы мүмкін, себебі жаңа жол әр түрлі индексердегі деректермен қақтығысады. Қисайтылмаған кэштер үшін LRU (ең соңғы қолданылған) бақылау әдетте жиын негізінде жүргізіледі. Дегенмен, қисайған ассоциативтік кэштердің дәстүрлі жиынтық ассоциативтік кэштерге қарағанда маңызды артықшылықтары бар.

Псевдоассоциативтік кэш

Шынайы жиынтық ассоциативтік кэш мазмұндық адрестелетін жад сияқты нәрсені пайдаланып, барлық мүмкін жолдарды бірден тексереді. Псевдоассоциативтік кэш әрбір мүмкін жолды бірінен кейін бірін тексереді. Хаш қайта жаңарту кэші және бағандық ассоциативтік кэш – псевдоассоциативтік кэштің мысалдары. Егер бірінші тексерілген жолда сәйкестік табылса, псевдоассоциативтік кэш тікелей бейнеленген кэш сияқты жылдам жұмыс істейді, бірақ тікелей бейнеленген кэшке қарағанда қақтығысқа байланысты сәтсіздіктердің көрсеткіші әлдеқайда төмен, толық ассоциативтік кэштің көрсеткішіне жақын. Бұл жиынтық индексін дәстүрлі жиынтық ассоциативтік кэш сияқты кэш жиынтығына бейнелеу үшін пайдалану және қосылған тег биттерін жиынтықтағы жолды индекстеу үшін қолдану болып табылады. Мысалы, 4 жолды жиынтық ассоциативтік кэште екі бит тиісінше 00, 01, 10 және 11 жолдарын индекстеу үшін қолданылады. Бұл екі рет кэш индекстеуді "негізгі орналасу бейнелеуі" деп атайды, ал оның кідірісі тікелей бейнеленген кэшке кіруге тең. Көп бағанды кэш дизайнындағы кең ауқымды тәжірибелер Intel-дің жол болжау кэш жады, IBM-нің қайта конфигурацияланатын көп жолды ассоциативтік кэш жады және Oracle-дің адрестік тег биттеріне негізделген динамикалық кэш алмастыру жолын зерттеу.

Мысал

Pentium 4 процессорының бастапқыда төрт жолды L1 ассоциативтік деректер кэшін орнату мүмкіндігі болды, оның көлемі 8 КиБ, 64 байттық кэш блоктары бар. Сондықтан, 8 КиБ / 64 = 128 кэш блогы бар. Жинақтар саны кэш блоктарының санына, ассоциативтілік жолдарының санына бөлінгенге тең, яғни 128 / 4 = 32 жиынтық, демек 25 = 32 түрлі индекс. 26 = 64 мүмкін смещение бар. CPU адресі 32 биттік ені бар болғандықтан, бұл 32 – 5 – 6 = 21 битті таңбалау өрісі үшін білдіреді. Pentium 4 процессорының бастапқы сегіз жолды L2 интегралды кэші 256 КиБ көлемінде, 128 байттық кэш блоктары бар. Бұл 32 – 8 – 7 = 17 битті таңбалау өрісі үшін білдіреді. Бірінші беттеу машинасы, Ferranti Atlas стандартты үйлесімділік протоколдары үшін жұмыс істемейді. Тағы бір мәселе – гомонимдер, онда бір виртуалды мекен-жай бірнеше түрлі физикалық мекен-жайларға шартады. Бұл шартауларды виртуалды индексті қарастыру арқылы ғана ажырату мүмкін емес, бірақ мүмкін болатын шешімдерге мыналар жатады: контексттік ауысудан кейін кэшті тазалау, адрес кеңістіктерін бір-біріне жабыспауға мәжбүрлеу, виртуалды мекенжайды адрес кеңістігі идентификаторымен (ASID) таңбалау. Сонымен қатар, виртуалды-физикалық шартаулар өзгеруі мүмкін, бұл кэш желілерін тазалауды талап етеді, өйткені виртуалды мекенжайлар енді жарамды болмайды. Егер таңбалар физикалық мекенжайларды (VIPT) қолданса, бұл мәселелердің барлығы жоқ. Виртуалды индекстелген, физикалық таңбаланған (VIPT) кэштер индексте виртуалды мекенжайды және таңбада физикалық мекенжайды пайдаланады. PIPT-ке қарағанда артықшылығы – кешіктірудің төмендеуі, өйткені кэш желісін TLB аудармасымен қатар іздеуге болады, алайда физикалық мекенжай қолжетімді болғанша таңбаны салыстыру мүмкін емес. VIVT-ге қарағанда артықшылығы – таңбада физикалық мекенжай болғандықтан, кэш гомонимдерді анықтай алады. Теориялық тұрғыдан алғанда, VIPT-ге көбірек таңба биттері қажет, өйткені кейбір индекс биттері виртуалды және физикалық мекенжайлар арасында айырмашылық болуы мүмкін (мысалы, 4 КиБ беттер үшін 12 биттен жоғары) және оларды виртуалды индекске де, физикалық таңбаға да қосу керек. Іс жүзінде бұл мәселе емес, өйткені үйлесімділік проблемаларын болдырмау үшін VIPT кэштері мұндай индекс биттері болмауы үшін жасалған (мысалы, индекс пен блок смещениесі үшін биттердің жалпы санын 4 КиБ беттер үшін 12 дейін шектеу арқылы); бұл VIPT кэштерінің көлемін беттің көлеміне, кэштің қауымдастықтығына дейін шектейді. Физикалық индекстелген, виртуалды таңбаланған (PIVT) кэштер әдебиетте жиі пайдасыз және жоқ деп мәлімделеді. Алайда, MIPS R6000 бұл кэш түрін жалғыз белгілі іске асыру ретінде пайдаланады. R6000 эмитерлік логикамен іске асырылады, бұл өте жылдам технология, ол TLB сияқты үлкен жадтар үшін жарамсыз. R6000 бұл мәселені TLB жадын екінші деңгейлі кэштің кішкентай, жоғары жылдамдықты TLB "кесімі" бар чиптің арнайы бөлігіне орналастыру арқылы шешеді. Кэш TLB кесімінен алынған физикалық мекенжаймен индекстеледі. Алайда, TLB кесімі тек кэшті индекстеу үшін қажетті виртуалды адрес биттерін аударатындықтан және ешқандай таңбаларды қолданбағандықтан, жалған кэш сәйкестіктері болуы мүмкін, бұл виртуалды адреспен таңбалау арқылы шешіледі. Бұл қайталану жылдамдығы (жүктеу кешіктіруі) CPU өнімділігі үшін өте маңызды, сондықтан қазіргі заманғы 1-деңгейлі кэштер іс жүзінде индекстеледі, бұл кем дегенде MMU-ның TLB іздеуін кэш RAM-нан деректерді алумен қатар жүргізуге мүмкіндік береді. Бірақ виртуалды индекстеу барлық кэш деңгейлері үшін ең жақсы таңдау емес. Виртуалды алиастармен жұмыс істеу құны кэштің көлемімен бірге өседі, нәтижесінде 2-деңгейлі және одан үлкен кэштер физикалық индекстеледі. Кэштер кэш таңбалары үшін тарихи түрде виртуалды және физикалық адрестерді қолданған, бірақ виртуалды таңбалар қазір жиі кездеспейді. Егер TLB іздеуі кэш RAM іздеуінен бұрын аяқталса, онда физикалық мекенжай таңбаны салыстыру үшін уақытында қолжетімді болады және виртуалды таңбалаудың қажеті жоқ. Сонымен, үлкен кэштер физикалық түрде таңбаланады, ал кішкентай, өте аз кешіктіруі бар кэштер виртуалды таңбаланады. Соңғы уақытта жалпы мақсаттағы процессорларда виртуалды таңбалау төмендегідей vhints арқылы ауыстырылды.

Омонимдер мен синонимдер проблемалары

Виртуалды индекстеу және таңбалауға негізделген кэш, бір виртуалды мекенжай әртүрлі физикалық мекенжайларға (гомоним) шамаланғаннан кейін дұрыс емес күйге түседі, бұл физикалық мекенжайды таңбалау үшін пайдалану арқылы немесе кэш жолында мекенжай кеңістігінің идентификаторын сақтау арқылы шешіледі. Дегенмен, соңғы тәсіл синоним мәселесіне қарсы көмектеспейді, онда бірнеше кэш жолдары бірдей физикалық мекенжай үшін деректерді сақтайды. Мұндай жерлерге жазу кэштегі бір ғана жерді жаңартуы мүмкін, ал қалғандары дұрыс емес деректермен қалады. Бұл мәселені әртүрлі мекенжай кеңістіктері үшін жадтың бір-біріне қабаттаспайтын орналасуларын пайдалану арқылы шешуге болады, немесе карталау өзгерген кезде кэштің (немесе оның бір бөлігін) тазарту қажет.

Виртуалды тегтер мен винттер

Виртуалды тегтердің басты артықшылығы – ассоциативтік кэш үшін олар тегтердің сәйкес келуін виртуалды-физикалық түрлендіру аяқталмас бұрын жүргізуге мүмкіндік береді. Дегенмен, үйлесімділік сауалдары мен кэштен шығару операциялары үшін физикалық мекенжай қажет болады. Аппараттық құрал физикалық мекенжайларды кэш индексіне түрлендіруге қабілетті болуы керек, әдетте физикалық тегтерді, сондай-ақ виртуалды тегтерді сақтап. Салыстыру үшін, физикалық тегтелген кэш виртуалды тегтерді сақтау қажеттілігін жояды, бұл оны қарапайым етеді. Виртуалды-физикалық бейнелеу TLB-ден жойылғанда, сол виртуалды мекенжайларға ие кэш жазбаларын бір жолмен тазарту қажет. Егер кэш жазбалары TLB-де бейнеленбеген беттерге рұқсат етілсе, онда беттер кестесіндегі қатынасу құқықтары өзгерген кезде оларды тазарту қажет. Операциялық жүйе кэшке бір уақытта виртуалды псевдонимдердің қатысуын болдырмауға да кепілдік бере алады. Операциялық жүйе бұл кепілдікті беттерді түстің әртүрлі түрлеріне бөлу арқылы қамтамасыз етеді, бұл төменде сипатталған. Кейбір ерте RISC процессорлары (SPARC, RS/6000) осы тәсілді қолданды. Бұл қазіргі уақытта кеңінен қолданылмайды, себебі виртуалды псевдонимдерді анықтау және шығарудың аппараттық құны төмендеді, ал бағдарламалық жасақтаманың күрделілігі мен өнімділігі артты. Ассоциативтік кэште тегтердің екі функциясын ажырату пайдалы: олар кэш жазбалары жиынтығының қай жолын таңдауға және кэш сәттілікке жетті ме, жоқ па, анықтауға қолданылады. Екінші функция әрқашан дұрыс болуы керек, бірақ бірінші функция үшін болжауға болады және кейде қате жауап алуға рұқсат етіледі. Кейбір процессорларда (мысалы, ерте SPARC процессорларында) виртуалды және физикалық тегтер бар кэштер бар. Виртуалды тегтер жолды таңдау үшін, ал физикалық тегтер сәттілікке жетті ме, жоқ па, анықтау үшін қолданылады. Бұл кэш виртуалды тегтелген кэштің жылдамдығының артықшылығына және физикалық тегтелген кэштің қарапайым бағдарламалық интерфейсіне ие. Дегенмен, ол дубликатталған тегтердің қосымша шығынына түседі. Сонымен қатар, қателерді өңдеу кезінде кэш жолының индекстелген баламалы жолдары виртуалды псевдонимдерге тексерілуі керек және кез келген сәйкессіздіктер шығарылуы керек. Виртуалды тегтердің орнына әр кэш жазбасымен виртуалды меңзеулерді сақтау арқылы қосымша аумақты (және кейбір кідіріс уақытын) азайтуға болады. Бұл меңзеулер виртуалды тегтің кіші жиынтығы немесе хэші болып табылады және деректерді және физикалық тегті алу үшін кэштің жолын таңдау үшін қолданылады. Виртуалды тегтелген кэш сияқты, виртуалды меңзеу сәйкес келуі мүмкін, бірақ физикалық тег сәйкес келмеуі мүмкін, бұл жағдайда сәйкес келетін меңзеуі бар кэш жазбасын жою керек, сондықтан кэш толтырылғаннан кейін осы мекенжайға кэш кіруде бір ғана меңзеу сәйкес келеді. Виртуалды меңзеулер виртуалды тегтерге қарағанда аз биттермен ерекшеленетін болғандықтан, виртуалды меңзеулі кэш виртуалды тегтелген кэшке қарағанда көбірек қақтығысқа ұшырайды. Виртуалды меңзеулерді ең соңғы азайтуға Pentium 4 (Willamette және Northwood ядролары) процессорларында қол жеткізілген. Бұл процессорларда виртуалды меңзеу тиімді түрде екі биттен тұрады, ал кэш төрт жолды ассоциативті. Аппараттық құрал виртуалды мекенжайдан кэш индексіне қарапайым реттеуді сақтайды, сондықтан төрт жолдың ішінен дұрыс біреуін таңдау үшін мазмұнды адрестейтін жад (CAM) қажет емес.

Беттің түсі

Үлкен физикалық индекстелген кэштер (әдетте екінші деңгейлі кэштер) бір мәселеге тап болады: кэште қай беттердің қақтығысатынын операциялық жүйе бақылайды, емес қолданба. Бағдарламадан бағдарламаға жад беттерін бөлудегі айырмашылықтар кэш қақтығысу үлгілерінің өзгеруіне алып келеді, бұл бағдарламаның өнімділігінде үлкен айырмашылықтарға себеп болуы мүмкін. Осы айырмашылықтардан туындаған қиындықтар эталондық тесттерді тұрақты және қайталанатын уақыт өлшемдерімен жүргізуді қиындатады. Мәселені түсіну үшін 1 МиБ физикалық индекстелген, тікелей карталанған 2-деңгейлі кэш және 4 КиБ виртуалды жад беттері бар процессорды қарастырайық. Бір-бірінен кейін келетін физикалық беттер кэштегі бір-бірінен кейін келетін орындарға карталанады, ал 256 беттен кейін үлгі қайталана бастайды. Әр физикалық бетті 0-ден 255-ке дейінгі түспен белгілеуге болады, бұл оның кэште қай жерге орналасатынын көрсетеді. Әртүрлі түстердегі физикалық беттердің ішіндегі орындар кэште қақтығыспайды. Кэштің мүмкіндігін барынша пайдалануға тырысатын бағдарламашылар өз бағдарламаларының жадқа қатынасу үлгілерін осылай етіп құрастыра алады, кез келген уақытта тек 1 МиБ дерек кэште сақталады, осылайша сыйымдылықтың жетіспеушілігін болдырмайды. Бірақ олар жадқа қатынасу үлгілерінде қақтығыс болмауын да қамтамасыз етуі керек. Бұл мәселені шешудің бір жолы – бағдарлама пайдаланатын виртуалды беттерді бөліп, оларға физикалық беттерге бұрын тағайындалғандай виртуалды түстерді беру. Бағдарламашылар кодтың жадқа қатынасу үлгілерін бір уақытта бірдей виртуалды түстегі екі бет те пайдаланылмауы үшін құрастыра алады. Мұндай оңтайландырулар туралы көптеген зерттеулер бар (мысалы, циклдарды оңтайландыру), олар негізінен жоғары өнімді есептеу (HPC) қауымдастығынан шыққан. Мәселе мынада: кез келген уақытта пайдаланылатын барлық беттердің әртүрлі виртуалды түстері болуы мүмкін, бірақ кейбіреулерінің физикалық түстері бірдей болуы мүмкін. Егер операциялық жүйе физикалық беттерді виртуалды беттерге кездейсоқ және теңдей үлестірсе, кейбір беттердің физикалық түсінің бірдей болуы ықтимал, содан кейін осы беттердің жад орындары кэште қақтығысады (бұл туған күн парадоксы). Шешім – операциялық жүйенің әртүрлі физикалық түсті беттерді әртүрлі виртуалды түстерге тағайындауға тырысуы, бұл әдіс беттерді түске бояу деп аталады. Виртуалды түстен физикалық түске нақты сәйкестік жүйе өнімділігіне әсер етпесе де, күрделі сәйкестіктерді қадағалау қиын және пайдасы аз, сондықтан беттерді түске бояу әдістері физикалық және виртуалды беттердің түстерін бірдей ұстауға тырысады. Егер операциялық жүйе әрбір физикалық беттің тек бір виртуалды түске сәйкес келетінін кепілдік бере алса, онда виртуалды беттердің қайталануы болмайды және процессор қателерді өңдеу кезінде қосымша виртуалды беттерді тексерудің қажеті жоқ, виртуалды индекстелген кэштерді пайдалана алады. Басқаша айтқанда, операциялық жүйе виртуалды түстен екіншісіне ауысқанда кэштен бетті тазалай алады. Жоғарыда айтылғандай, бұл әдіс алғашқы SPARC және RS/6000 жүйелерінде қолданылған. Бағдарламалық түске бояу әдісі көп ядролы процессорларда ортақ соңғы деңгейлі кэшті (LLC) тиімді бөлу үшін пайдаланылды. Бұл операциялық жүйеге негізделген LLC басқаруды Intel қабылдады.

Қазіргі заманғы процессордағы кэш иерархиясы

Қазіргі заманғы процессорлар бірнеше өзара әрекеттесетін чиптегі кэштерге ие. Нақты бір кэштің жұмысы кэштің көлемі, кэш блогының көлемі, жиынтықтағы блоктардың саны, кэш жиынтығын алмастыру саясаты және кэш жазу саясаты (тікелей жазу немесе кері жазу) арқылы толықтай анықталады. Intel компаниясының Haswell процессорларының Crystalwell нұсқасы 128 МиБ eDRAM 4-деңгейлі кэшін қосты, ол процессорлардың 3-деңгейлі кэші үшін құрбандық кэш ретінде қызмет етеді. Skylake микроархитектурасында 4-деңгейлі кэш енді құрбандық кэш ретінде жұмыс істемейді.

Трек кэш

Кэшке мамандандырудың ең экстремалды мысалдарының бірі – Intel Pentium 4 микропроцессорларында кездесетін із кэші (сонымен қатар орындалу із кэші деп те аталады). Із кэші – бұрын алынған және декодталған нұсқаулардың іздерін сақтау арқылы нұсқауларды алу енілігін арттыру және қуат тұтынуды азайту (Pentium 4 жағдайында) механизмі. Із кэші нұсқауларды декодталғаннан кейін немесе олар орындалғаннан кейін сақтайды. Әдетте нұсқаулар із кэшіне жеке негізгі блоктар немесе динамикалық нұсқаулар іздерін білдіретін топтарда қосылады. Pentium 4-тің із кэші x86 нұсқауларын декодтау нәтижесінде алынған микрооперацияларды сақтайды, сонымен қатар микрооперация кэшінің функционалдығын да қамтамасыз етеді. Осының арқасында келесі рет нұсқау қажет болғанда, оны қайтадан микрооперацияларға декодтаудың қажеті болмайды. AMD Bulldozer микроархитектурасындағы L2 кэшінің бір бөлігі болып табылатын арнайы кэш. Модульдегі екі L1D кэшінен келетін деректер WCC арқылы өтеді, онда олар буферде сақталады және біріктіріледі. WCC-нің міндеті – L2 кэшіне жазылатын деректердің санын азайту.

Микрооперациялық (μop немесе uop) кэш

Микрооперациялық кэш (μop кэш, uop кэш немесе UC) – тікелей нұсқаулық декодерлерінен немесе нұсқаулық кэшінен алынған, декодталған нұсқаулардың микрооперацияларын сақтайтын арнайы кэш. Нұсқаулықты декодтау қажет болған кезде, μop кэші оның декодталған түрін тексереді, егер ол кэште сақталса, қайта пайдаланылады; егер қолжетімді болмаса, нұсқаулық декодталады және кэште сақталады. Intel P6 процессорлар отбасы үшін μop кэшін баламалы фронтэнд ретінде сипаттаған алғашқы жұмыстардың бірі – 2001 жылғы «Микрооперациялық кэш: Өзгермелі нұсқау ұзындығы ISA үшін қуатты білетін фронтэнд» атты мақала. Кейін Intel компаниясы μop кэшін Sandy Bridge процессорларына және Ivy Bridge, Haswell сияқты микроархитектураларға енгізді. AMD Zen микроархитектурасында да μop кэшін қолданды. Толық алдын ала декодталған нұсқауларды алу, өзгермелі ұзындықтағы күрделі нұсқауларды қарапайым, тұрақты ұзындықтағы микрооперацияларға қайта-қайта декодтау қажеттілігін жояды және алынған нұсқауларды болжау, алу, айналдыру және сәйкестендіру процесін жеңілдетеді. μop кэші алу және декодтау аппараттық құралдарын тиімді жүктейді, қуат тұтынуды азайтады және декодталған микрооперациялардың фронтэндтік жабдықталуын жақсартады. μop кэші сонымен қатар өнімділікті арттырады, өйткені декодталған микрооперацияларды серверге тұрақты жеткізеді және процессордың алу және декодтау логикасындағы түрлі кедергілерді жояды.

Бранш- тардың мақсатты нұсқаулар кэші

Бранч-мақсат кэш немесе бранч-мақсат нұсқау кэш, ARM микропроцессорларында қолданылатын атау, алынған тармақтың бағытына қарай алғашқы бірнеше нұсқауларын сақтайтын арнайы кэш. Бұл, жад жүйесі CPU-ны кэшсіз қанағаттандыруға жеткілікті жылдамдықпен нұсқауларды жеткізе алатын, төмен қуатты процессорларда қолданылады. Дегенмен, бұл тек тізбектелген нұсқауларға қатысты; жаңа мекенжайдан нұсқауларды қайта алу үшін бірнеше циклдық кешігу қалады, нәтижесінде басқаруды беруден кейін құбыржолда көпіршік пайда болады. Бранч-мақсат кэш осы циклдар үшін нұсқауларды ұсынады, көптеген тармақтардан кейін туындайтын кешігуді болдырмайды. Бұл, дәстүрлі толық уақытты нұсқаулар кэшінен әлдеқайда кіші кэшпен толық жылдамдықпен жұмыс істеуге мүмкіндік береді.

Ақылды кэш

Smart Cache – Intel компаниясы әзірлеген көп ядролы процессорлардың өріс орындау ядролары үшін 2-ші немесе 3-ші деңгейлі кэштеу әдісі. Smart Cache көп ядролы процессордың ядролары арасында нақты кэш жадын бөліседі. Әрбір ядроға арналған жеке кэшпен салыстырғанда, ядроларға кэш кеңістігінің тең бөлігі қажет болмаған жағдайда, жалпы кэштен қате табу көрсеткіші төмендейді. Осының нәтижесінде, бір ядро 2-ші немесе 3-ші деңгейлі кэшті толыққанды пайдалана алады, ал қалған ядролар белсенді болмауы мүмкін. Бұдан әрі, ортақ кэш әртүрлі өріс орындау ядролары арасында жадты жылдам бөлісуге мүмкіндік береді.

Көп деңгейлі кэштер

Тағы бір мәселе – кэш жадтың жауап беру уақыты мен тиімділігі арасындағы негізгі қақтығыс. Кэш жады көлемі үлкен болса, тиімділігі жоғарырақ, бірақ жауап беру уақыты ұзақ. Бұл мәселені шешу үшін көптеген компьютерлерде кэш жадтың бірнеше деңгейі қолданылады, кішкентай, жылдам кэш жад үлкен, баяу кэш жадпен толықтырылады. Көп деңгейлі кэш жадтар әдетте ең жылдам кэш жад, 1-деңгей (L1) кэшін бірінші кезекте тексереді; егер сұраныс орындалса, процессор жоғары жылдамдықпен жұмыс істейді. Егер кішкентай кэш жад сұранысты орындамаса, келесі жылдам кэш жад, 2-деңгей (L2) кэші тексеріледі, және т.б., сыртқы жадқа жүгінуге дейін. Негізгі жад пен ең жылдам кэш жад арасындағы уақыт айырмашылығы артқан сайын, кейбір процессорлар үш деңгейлі кэш жадты пайдалана бастады. Бағаға сезімтал конструкциялар бүкіл кэш жад иерархиясын чипке орналастыру үшін бұл әдісті қолданды, бірақ 2010 жылдары жоғары өнімділік көрсеткіштері бар конструкциялар төртінші кэш деңгейі ретінде eDRAM-да іске асырылатын және көп чиптік модульге орнатылған үлкен чип кэштеріне қайта оралды. Сирек жағдайларда, мысалы, IBM z15 (2019) процессорында L1-ге дейінгі барлық деңгейлер eDRAM арқылы іске асырылады, SRAM-ды толықтай алмастырады (кэш жад үшін SRAM әлі де тіркелімдер үшін қолданылады). ARM негізіндегі Apple M1 төрт жоғары өнімділік ядросының әрқайсысы үшін 192 КиБ L1 кэш жадына ие, бұл өте үлкен көлем; алайда төрт жоғары тиімділік ядросы тек 128 КиБ кэш жадына ие. L3 және L4 кэш жадтарының артықшылықтары қолданбаның жадқа қатынасу үлгілеріне байланысты. L3 және L4 кэш жадтарын қолданатын өнімдерге мысалдар: Alpha 21164 (1995) 1-ден 64 МиБ дейін L3 кэш жадын чиптен тыс орналастырды. AMD K6 III (1999) аналық платаға негізделген L3 кэш жадына ие болды. IBM POWER4 (2001) бірнеше процессорлар арасында бөлісетін 32 МиБ L3 кэш жадына ие болды. Itanium 2 (2003) 6 МиБ біріктірілген 3-деңгей (L3) кэш жадына ие болды; Itanium 2 (2003) MX 2 модулі екі Itanium 2 процессорын және 64 МиБ L4 кэш жадын көп чиптік модульде біріктірді, бұл Madison процессорымен үйлесімді болды. Intel Xeon MP өнімінің "Tulsa" (2006) кодтық атауы екі процессорлық ядро арасында бөлісетін 16 МиБ L3 кэш жадына ие. AMD Phenom (2007) 2 МиБ L3 кэш жадымен. AMD Phenom II (2008) 6 МиБ дейін біріктірілген L3 кэш жадына ие. Intel Core i7 (2008) барлық ядролармен ортақ, инклюзивті, бірыңғай L3 кэш жадында 8 МиБ көлемге ие. Intel Haswell процессорлары интеграцияланған Intel Iris Pro Graphics 128 МиБ eDRAM-ға ие, ол негізінен L4 кэш жады ретінде әрекет етеді. Соңында, жад иерархиясының екінші шетінде CPU-дың тіркелімдер жиынтығы жүйенің ең кішкентай, ең жылдам кэш жады деп қарастырылуы мүмкін, оның ерекше ерекшелігі – ол бағдарламалық жасақтамада, әдетте компилятор арқылы жоспарланады, өйткені ол негізгі жадтан алынған мәндерді сақтау үшін тіркелімдерді бөледі, мысалы, циклдарды оңтайландыру. Алайда, тіркелімдерді қайта атау арқасында компилятордың көптеген тіркелімдерге тағайындаулары аппараттық құралдармен орындалу кезінде динамикалық түрде тіркелімдер банкіне қайта тағайындалады, бұл процессорға жалған деректерге тәуелділікті жоюға және осылайша құбыржол қауіптерін азайтуға мүмкіндік береді. Тіркелімдер жиынтығы кейде иерархиялық болады: Cray 1 (1976 шамасында) жалпыға қолданылатын сегіз "A" адрестік және сегіз скалярлық дерек "S" тіркеліміне ие болды. Сонымен қатар, кіру уақыты ұзақ болса да, негізгі жадтан жылдам болған 64 адрес "B" және 64 скалярлық дерек "T" тіркелімі де болды. "B" және "T" тіркелімдері берілген, өйткені Cray 1 деректер кэш жадына ие болмаған. (Дегенмен, Cray 1 нұсқаулар кэш жадына ие болды.)

Көп өзекті чиптер

Бірнеше өзекті чипті қарастырғанда, кэштер ортақ болуы керек пе, әлде әр өзектің жеке кэші болуы керек пе деген сұрақ туындайды. Ортақ кэшті іске асыру сөзсіз, қосымша сымдар мен күрделілікті күшейтеді. Бірақ, чипке бір кэш орнату, әр өзектің жеке кэшінен гөрі, қажетті орынды едәуір азайтады, соның салдарынан үлкен көлемді кэш орнатуға болады. Әдетте, L1 кэшін ортақтастыру тиімсіз, себебі туындайтын кешігу уақытының артуы әрбір өзектің жеке өзекті чипке қарағанда айтарлықтай баяу жұмыс істеуіне себеп болады. Дегенмен, ең жоғары деңгейдегі кэш, жадқа жүгіну алдында соңғы рет шақырылатын кэш үшін, жаһандық кэш болуы бірнеше себеппен қажет: бір өзектің бүкіл кэшті пайдалану мүмкіндігі, әртүрлі процестер немесе жіптер кэштелген деректерді бөлісу арқылы деректердің қайталануын азайту, және қолданылатын кэш сәйкестігі протоколдарының күрделілігін төмендету. Мысалы, сегіз өзекті, үш деңгейлі чипке әр өзектің L1 кэші, әр екі өзектің жұбына бір аралық L2 кэш және барлық өзектің арасында ортақ L3 кэш кіруі мүмкін. Жадқа қол жеткізуден бұрын шақырылатын ортақ ең жоғары деңгейлі кэш әдетте соңғы деңгейлі кэш (LLC) деп аталады. LLC бірнеше өзектің арасында бөліскен кезде параллелизм деңгейін арттыру үшін қосымша техникалар қолданылады, соның ішінде оны бірнеше бөлікке бөлу, олар белгілі бір жад адрестерінің диапазонына жауап береді және тәуелсіз түрде қол жеткізуге болады.

Бөлек және біріктірілген

Бөлек кэш құрылымында нұсқаулар мен деректер жеке-жеке кэштеледі, яғни кэш жолы нұсқауларды не деректерді кэштеу үшін қолданылады, бірақ екеуін бірдей емес. Жеке деректер және нұсқаулар трансляциялық буферлерінің артықшылықтары дәлелденген. Бірыңғай құрылымда мұндай шектеу болмайды, ал кэш жолдары нұсқаулар мен деректерді кэштеуге пайдаланылуы мүмкін.

Эксклюзивті және инклюзивті

Көп деңгейлі кэштер жаңа дизайндық шешімдерді қажет етеді. Мысалы, кейбір процессорларда L1 кэштегі барлық дерек L2 кэште де болуы тиіс. Мұндай кэштер қатаң қосымша (strictly inclusive) деп аталады. Басқа процессорлар (мысалы, AMD Athlon) эксклюзивті кэштерге ие: деректер L1 және L2 кэштерінің біреуінде ғана сақталады, екеуінде емес. Тағы да басқа процессорлар (мысалы, Intel Pentium II, III және 4) L1 кэштегі деректердің L2 кэште де болуын міндетті етпейді, бірақ олар көбінесе солай болады. Бұл аралық саясатқа арнайы қабылданған атау жоқ; екі жиі қолданылатын атауы – «қосымша емес» (non-exclusive) және «ішінара қосымша» (partially inclusive). Эксклюзивті кэштердің артықшылығы – олар көбірек дерек сақтай алады. Бұл артықшылық L1 кэшін L2 кэшімен салыстыруға болатын жағдайда үлкен, ал L2 кэш L1 кэшінен әлдеқайда үлкен болса, азаяды. L1 кэш сәтсіз болса және L2 кэш сұранысқа тап болса, L2 кэштегі кеш жолы L1 кэштегі жолмен алмастырылады. Бұл алмасу, L2 кэштен L1 кэшке жолды көшіруге қарағанда әлдеқайда күшті жұмысқа талап етеді, осы әрекетті қосымша кэштер орындайды.

Скретчпад жады

Скрачпад жады (SPM), сонымен қатар скрачпад, скрачпад RAM немесе компьютер терминологиясында жергілікті жад деп те аталады, есептеулердің, деректердің және аяқталмай жатқан жұмыстардың уақытша сақталуына арналған жоғары жылдамдықты ішкі жад.

Мысал: K8

Мамандандыруды және көп деңгейлі кэшті көрсету үшін, AMD Athlon 64 процессорындағы K8 өзегінің кэш иерархиясы келтіріледі. K8 төрт арнайы кэшке ие: нұсқау кэші, нұсқау TLB, дерек кэші және дерек TLB. Бұл кэштердің әрқайсысы өз функциясына ие: нұсқау кэші 64 байттық жад жолдарының көшірмелерін сақтайды және әр циклда 16 байттан алады. Бұл кэштегі әрбір байт сегіз емес, он битте сақталады, ал қосымша биттер нұсқаулардың шекараларын көрсетеді (бұл алдын ала кодтаудың мысалы). Кэш ECC емес, тек теңдікпен қорғалады, себебі теңдік аз орын алады және зақымдалған деректер жадтан алынған жаңа деректермен алмастырылуы мүмкін (онда нұсқаулардың жаңартылған көшірмесі болады). Нұсқау TLB беттер кестесіне (PTE) енгізілген жазбалардың көшірмелерін сақтайды. Әр циклдағы нұсқауды алу кезінде виртуалды мекен-жай осы TLB арқылы физикалық мекен-жайға түрлендіріледі. Әр жазба жадында төрт немесе сегіз байтты құрайды. K8 өзгермелі бет өлшеміне ие болғандықтан, әр TLB екі бөлімге бөлінеді: біреуі 4 КБ беттерді карталайтын PTE-ді, ал екіншісі 4 МБ немесе 2 МБ беттерді карталайтын PTE-ді сақтауға арналған. Бұл бөлу әр бөлімдегі толық ассоциативті сәйкес схеманы қарапайым етуге мүмкіндік береді. Операциялық жүйе виртуалды мекен-жай кеңістігінің әртүрлі бөліктерін әртүрлі өлшемдегі PTE-мен карталайды. Дерек TLB-да бірдей жазбаларды сақтайтын екі көшірме бар. Екі көшірме виртуалды мекен-жайларды физикалық мекен-жайларға түрлендіру үшін әр циклда екі дерекке қол жеткізуге мүмкіндік береді. Нұсқау TLB сияқты, бұл TLB да екі түрге бөлінеді. Дерек кэші 64 байттық жад жолдарының көшірмелерін сақтайды. Ол 8 банкке бөлінген (әрқайсысы 8 КБ дерек сақтайды) және әр циклда екі 8 байттық деректерді алуға мүмкіндік береді, егер бұл деректер әртүрлі банктерде болса. Әрбір 64 байттық жол сегіз банк арасында таратылғандықтан, тегтердің екі көшірмесі бар. Әрбір тег көшірмесі цикл бойынша екі қолжетімділіктің біреуін қамтамасыз етеді. K8 бірнеше деңгейлі кэштерге де ие. Екінші деңгейдегі нұсқаулар мен дерек TLB бар, олар тек 4 КБ беттерді карталайтын PTE-ді сақтайды. Нұсқаулар мен дерек кэштері, сондай-ақ әртүрлі TLB-лер үлкен біріктірілген L2 кэшінен толтырылуы мүмкін. Бұл кэш L1 нұсқаулар және дерек кэштеріне ғана тән, яғни кез келген 8 байттық жол L1 нұсқау кэшінің, L1 дерек кэшінің немесе L2 кэшінің бірінде ғана болуы мүмкін. Алайда, дерек кэшіндегі жолдың TLB-ның бірінде PTE-сі болуы мүмкін – опералық жүйе TLB-ның дұрыстығын сақтау үшін жадыдағы беттер кестесі жаңартылғанда олардың бөліктерін тазалау арқылы жауапты. K8 сондай-ақ жадыда сақталмайтын ақпаратты – болжам ақпаратын да кэштейді. Бұл кэштер жоғарыдағы схемада көрсетілмеген. Бұл процессор класы үшін қалыпты жағдай бойынша, K8 тармақтарды болжауда өте күрделі, тармақтардың орындалуын болжауға көмектесетін кестелер және тармақтар мен секірулердің мақсаттарын болжайтын басқа кестелер бар. Бұл ақпараттың бір бөлігі 1-деңгейлі нұсқау кэшінде және біріктірілген екінші деңгейлі кэште нұсқаулармен байланысты. K8 екінші деңгейлі кэште нұсқаулармен бірге болжам ақпаратын сақтау үшін ерекше тәсіл қолданады. Екінші деңгейлі кэштегі жолдар деректердің кездейсоқ зақымдануынан (мысалы, альфа бөлшектерінің соққысынан) ECC немесе теңдікпен қорғалады, бұл жолдар деректердің немесе нұсқаулардың бірінші деңгейлі кэштерінен шығарылған-шығарылмағанына байланысты. Теңдік коды ECC кодына қарағанда аз бит алады, сондықтан нұсқау кэшіндегі жолдарда бірнеше бос бит болады. Бұл биттер осы нұсқаулармен байланысты тармақтарды болжау ақпаратын кэшке сақтау үшін пайдаланылады. Нәтижесінде тармақ болжаушының тиімді тарих кестесі үлкеніп, дәлдігі артады.

Қосымша иерархиялар

Басқа процессорларда басқа типтегі болжаушылар бар (мысалы, DEC Alpha 21264 жүктеуді айырып жіберу болжаушысы), және болашақ процессорларда әртүрлі мамандырылған болжаушылар дамуы мүмкін. Бұл болжаушылар кэш сияқты, себебі олар есептеуге қиын ақпаратты сақтайды. Болжаушылар туралы әңгімелескенде қолданылатын кейбір терминология кэштерге ұқсас (біреулер тармақ болжаушысында «жетістік» туралы айтады), бірақ болжаушылар көбінесе кэш иерархиясының бір бөлігі деп есептелмейді. K8 нұсқаулар мен деректер кэштерін аппараттық деңгейде үйлесімді ұстайды, яғни дерек сақтау нұсқаулығынан кейін келетін нұсқаулық сол дерек сақтау нұсқаулығының нәтижесіне байланысты өзгеруі мүмкін. Басқа процессорлар, мысалы, Alpha және MIPS отбасы процессорлары, нұсқаулар кэшін үйлесімді ұстау үшін бағдарламалық жасақтамаға сенеді. Егер бағдарлама операциялық жүйе функциясын шақырып, үйлесімділікті қамтамасыз етпесе, деректер ағынында сақтау орнының көрінуіне кепілдік жоқ.

RAM белгісі

Компьютерлік инженерияда тегтік жад (tag RAM) процессордың кэшінде қазіргі уақытта қандай жад орны сақталғанын көрсету үшін қолданылады. Ең қарапайым, тікелей бейнеленген жүйе үшін жылдам SRAM қолданылуы мүмкін. Күрделі ассоциативтік кэштер көбінесе контенттік адресті жадты (content addressable memory) пайдаланады.

Іске асыру

Кэш оқу – бір циклден асып түсетін ең көп кездесетін CPU операциясы. Бағдарлама орындалу уақыты 1-деңгейлі кэштен дерек алудың кешігуіне өте сезімтал. Кэштерді мүмкіндігінше жылдам ету үшін көп еңбек, қуат және кремнийлік аумақ жұмсалады. Ең қарапайым кэш – тікелей бейнеленген кэш. Виртуалды мекенжай қосымшамен есептеледі, мекенжайдың қажетті бөлігі индекстеу үшін қолданылады, ол жүктелген деректерді қайтарады. Деректер байттық ауыстырғышта байтқа сәйкестендіріледі, содан кейін келесі операцияға жіберіледі. Ішкі циклде тегті тексерудің қажеті жоқ, тіпті тегтерді оқудың да қажеті жоқ. Бірақ жүктеу командасы орындалғаннан кейін, жүктелген деректердің тегі оқылып, кэш сәйкестігін анықтау үшін виртуалды мекенжаймен салыстырылуы керек. Егер сәйкестік болмаса, кэш сұралған кэш жолымен жаңартылады және командалар тізбегі қайта басталады. Ассоциативтік кэш күрделірек, себебі кэштің қай бөлігін таңдау үшін тегтің қандай да бір түрін оқу қажет. N жолды жиынтық ассоциативтік 1-деңгейлі кэш әдетте барлық N мүмкін тег пен N деректі бірдей оқиды, содан кейін сәйкес тегке байланысты деректі таңдайды. 2-деңгейлі кэш кейде энергияны үнемдеу үшін алдымен тегтерді оқиды, сонда ғана деректерді оқиды. Суретте мекенжайдың әртүрлі өрістері қалай қолданылатыны көрсетілген. 31-бет ең маңызды, ал 0-бет ең маңызды емес. Суретте SRAM, индекстеу және мультиплекстеу 4 КиБ, 2 жолды жиынтық ассоциативтік, 64 байттық (B) жолдары бар, 32 биттік оқу ені және 32 биттік виртуалды мекенжайы бар, виртуалды индекстелген және виртуалды тегтелген кэш көрсетілген. Кэш 4 КиБ және 64 B жолдарынан тұрғандықтан, кэште 64 жол бар, және біз 32 қатардан, әрқайсысы 21 биттік тегтен тұратын тегтік SRAM-нан бір уақытта екі жолды оқимыз. Тегтерді және деректерді индекстеу үшін 31-ден 6-ға дейінгі виртуалды мекенжай биттерінің кез келген функциясын қолдануға болады, бірақ ең кіші маңызды биттерді пайдалану оңай. Сол сияқты, кэш 4 КиБ және 4 B оқу жолынан тұрғандықтан, әрбір кіру үшін екі жол оқылады, деректердік SRAM 512 қатардан және 8 байт енінен тұрады. Заманауи кэш 16 КиБ, 4 жолды жиынтық ассоциативтік, виртуалды индекстелген, виртуалды меңзеулі және физикалық тегтелген, 32 B жолдары, 32 биттік оқу ені және 36 биттік физикалық мекенжайы болуы мүмкін. Оқу жолының қайталануы жоғарыдағыға ұқсас. Тегтердің орнына vhint оқылады және виртуалды мекенжайдың кіші жиынтығымен салыстырылады. Кейін командалар тізбегінде виртуалды мекенжай TLB арқылы физикалық мекенжайға аударылады, ал физикалық тег оқылады (бір ғана, себебі vhint кэштің қай жолын оқу керектігін көрсетеді). Соңында физикалық мекенжай физикалық тегпен салыстырылады, сәйкестік анықталады. SPARC дизайндарының кейбіреулері L1 кэштерінің жылдамдығын SRAM декодерлеріне виртуалды мекенжай қосымшасын біріктіру арқылы бірнеше логикалық есіктердің кешігуін азайту арқылы жақсартты. Қараңыз: қосымша декодер.

Тарих

Кэш технологиясының алғашқы тарихы виртуалды жадының ойдағыдай жұмыс істеуімен тығыз байланысты. Жартылай өткізгіш жадтың тапшылығы мен жоғары құнына байланысты, 1960 жылдардағы алғашқы эВМ-дер физикалық жадтың күрделі иерархиясын қолданды, ол бағдарламалар пайдаланатын тегіс виртуалды жад кеңістігіне бейімделді. Жад технологиялары жартылай өткізгіш, магниттік ядро, барабан және дискіні қамтыды. Бағдарламалар көретін және пайдаланатын виртуалды жад тегіс болды, ал кэштелген деректер мен нұсқаулар процессордың қол жеткізуінен бұрын ең жылдам жадқа алынды. Кэш өлшемдерін оңтайландыру үшін жан-жақты зерттеулер жүргізілді. Оптималды мәндер бағдарламалау тіліне байланысты екені анықталды, Algol ең кішкентай, ал Fortran және Cobol ең үлкен кэш өлшемін қажет етті. Микрокомпьютер технологиясының алғашқы кезеңдерінде жадқа қол жеткізу, тіркелімге қол жеткізуден аздап ғана баяу болды. Бірақ 1980 жылдан бері процессор мен жад арасындағы өнімділік айырмашылығы артып келеді. Микропроцессорлар, әсіресе олардың жұмыс жиілігі тұрғысынан, жадтан әлдеқайда жылдам дамыды, сондықтан жад өнімділіктің шектеуші факторына айналды. Негізгі жадтың барлығын процессор сияқты жылдам ету техникалық тұрғыдан мүмкін болғанымен, экономикалық тұрғыдан тиімді жол таңдалды: көп мөлшерде төмен жылдамдықты жадты пайдалану, сонымен қатар өнімділік айырмашылығын азайту үшін шағын, жоғары жылдамдықты кэш жадын енгізу. Бұл бірдей бағамен бірнеше есе артық сыйымдылықты қамтамасыз етті, бірақ жалпы өнімділік сәл төмендеді.

TLB-нің алғашқы іске асырулары

ТЛБ-ның алғашқы жазбада көрсетілген қолданылуы GE 645 және IBM 360/67 жүйелерінде болды, екеуі де ТЛБ ретінде ассоциативтік жадты пайдаланды.

Бірінші нұсқау кэші

Инструкциялық кэштің алғашқы құжатталған қолданылуы CDC 6600 компьютерінде болды.

Бірінші деректер кэшін

IBM System/360 Model 85 компьютерінде деректер кэші алғаш рет қолданылған.

68k микропроцессорларда

1982 жылы шыққан 68010 процессорда "loop mode" режимі бар, оны екі ғана нұсқаудан тұратын циклдарды жылдамдататын кішкентай және ерекше жағдай нұсқаулар кэші деп қарастыруға болады. 1984 жылы шыққан 68020 процессор бұл мүмкіндікті 256 байттық стандартты нұсқаулар кэшімен алмастырды, ол чиптегі жад кэшіне ие болған алғашқы 68k сериялы процессор болды. 1987 жылы шыққан 68030 процессор негізінен 68020 өзегіне қосымша 256 байттық деректер кэші, чиптегі жад басқару блогы (MMU), процессордің өндірістік технологиясының жақсартуы және кэштер үшін жарылыс режимі қосылған нұсқасы болып табылады. 1990 жылы шыққан 68040 процессорда әрқайсысы төрт килобайттан бөлінген нұсқаулар және деректер кэштері бар. 1994 жылы шыққан 68060 процессорда келесі мүмкіндіктер бар: 8 КиБ дерек кэші (төрт жолдық ассоциативтік), 8 КиБ нұсқау кэші (төрт жолдық ассоциативтік), 96 байттық FIFO нұсқау буфері, 256 жазбалы тармақ кэші және 64 жазбалы адрестік аударма кэші MMU буфері (төрт жолдық ассоциативтік).

x86 микропроцессорларында

386-дағы x86 микропроцессорлары 20 МГц және одан жоғары сағат жылдамдығына жеткенде, өнімділікті арттыру үшін жүйелерде шағын жылдам кэш жады пайда бола бастады. Бұл негізгі жад ретінде қолданылатын DRAM-ның 120 нс-қа дейінгі айтарлықтай кешігуі, сондай-ақ жаңару циклдарының болуына байланысты болды. Кэш қымбат, бірақ едәуір жылдам SRAM жад ұяшықтарынан құралды, ол кезде 10–25 нс шамасында кешігуі болды. Алғашқы кэш процессордан тыс орналасты және әдетте аналық платада сегіз немесе тоғыз DIP құрылғысы түрінде орналасқан, кэшті қосымша мүмкіндік немесе жаңарту ретінде қосуға мүмкіндік беретін ұяларда орналастырылды. Intel 386 процессорларының кейбір нұсқалары 16-дан 256 КиБ-қа дейін сыртқы кэшті қолдай алды. 486 процессорымен 8 КиБ кэш тікелей CPU кристаллына енгізілді. Бұл кэш 1-деңгейлі немесе L1 кэш деп аталды, ол аналық платадағы баяу, 2-деңгейлі (L2) кэштен ерекшеленді. Аналық платадағы кэштер әлдеқайда үлкен болды, ең көп таралған көлемі 256 КиБ құрады. Intel 485Turbocache дочерная картасына арналған ұялары бар кейбір жүйелік платалар болды, олар 64 немесе 128 Кбайт кэш жадына ие болды. Аналық платадағы кэштің танымалдылығы Pentium MMX дәуірінде жалғасты, бірақ SDRAM енгізілгеннен кейін және шина сағаты мен CPU сағаты арасындағы айырмашылықтың өсуіне байланысты ескірді, бұл аналық платадағы кэшті негізгі жадтан сәл ғана жылдам етті. x86 микропроцессорларындағы кэштің дамуындағы келесі қадам Pentium Pro-дан басталды, ол екінші кэшті микропроцессормен бірдей жиілікте, микропроцессормен бірге пакетке енгізді. Аналық платадағы кэштер AMD K6 2 және AMD K6 III процессорларының арқасында ұзақ уақыт бойы танымал болды, олар бұрын Intel аналық платадағы кэштермен қолданған Socket 7 ұясын пайдаланды. K6 III 256 КиБ L2 кэшін қамтыды және L3 деп аталатын үшінші деңгейлі кэш ретінде борттағы кэштің артықшылықтарын пайдаланды (2 МиБ-қа дейін борттағы кэштің аналық платалары шығарылды). Socket 7 ескіргеннен кейін, x86 жүйелеріндегі аналық платадағы кэш жойылды. Үш деңгейлі кэштер көппроцессорлық ядролардың енгізілуімен қайта қолданылды, онда L3 кэші CPU кристаллына қосылды. Жаңа процессор буындарындағы жалпы кэш көлемінің үнемі ұлғаюы қалыпты жағдайға айналды және соңғы кезде (2011 жылға қарай) ондаған мегабайттық 3-деңгейлі кэш көлемін табу сирек емес. Intel Haswell микроархитектурасымен 4-деңгейлі пакеттік кэш енгізілді. Crystalwell.

Компьютерлік архитекторларға кэш циклінің уақыты, энергиясы және ауданы арасындағы компромисті зерттеуге көмектесетін бірнеше құралдар бар; CACTI кэш симуляторы және SimpleScalar нұсқаулар жиынтығы симуляторы – екі ашық бастапқы нұсқа.

Көп портты кэш

Көп портты кэш – бір уақытта бірнеше сұранымды өңдей алатын кэш. Дәстүрлі кэшке қол жеткенде біз әдетте бір жад адресін пайдаланамыз, ал көп портты кэш жағдайында процессор мен кэш арқылы қосылған порттардың саны N болғанда, бір уақытта N адреске сұраныс жіберуге болады. Бұл құбырлы процессордың өз құбырындағы әртүрлі кезеңдерден жадқа қол жеткізуіне мүмкіндік береді. Сонымен қатар, бұл әртүрлі кэш деңгейлері арқылы суперскалярлық процессорлар концепциясын іске асыруға жағдай жасайды.