Кіріспе
Жадты анықтайтын әдістер жиынтығы - бағдарламалық тәртіптен тыс жадқа қол жеткізу нұсқауларын (жүктіліктер мен сақтау орындарын) орындайтын, тәртіптен тыс орындау микропроцессорлары жоғары өнімділікпен пайдаланады. Микропроцессор өзегінің ішінде цифрлық логиканы қолдану арқылы іске асырылған жадты анықтайтын механизмдер орындалу кезінде жад операциялары арасындағы шынайы тәуелділікті анықтайды және тәуелділік бұзылған кезде процессордың қалпына келуіне мүмкіндік береді. Олар жалған жадының тәуелділігін жояды және жүктемелер мен сақтау орындарының қауіпсіз орындалуына мүмкіндік беріп, нұсқаулар деңгейінің параллельділігін арттырады.
Жадты анықтайтын механизмдер
Қазіргі заманғы микропроцессорлар екіжақты тәуелділіктерді шешу және тәуелділік бұзылған кезде қалпына келтіру үшін аппараттық жабдықта іске асырылған келесі механизмдерді қолданады.
ҰОС пен ТІРІСТІКТІҢ тәуелділігін болдырмау
Сақтау нұсқаулықтарының мәндері орындалған кезде жады жүйесіне (заманауи микропроцессорларда, CPU кэш) берілмейді. Оның орнына, сақтау нұсқаулары, оның ішінде жад мекенжайы мен сақтау деректері, олар зейнеткерлікке шыққанға дейін сақтау кезегінде буферде сақталады. Дәмхананың жұмысы тоқтаған кезде оның құндылығы жады жүйесіне жазылады. Бұл жоғарыда көрсетілген кодтың үзіндісінде көрсетілген WAR және WAW тәуелділік проблемаларын болдырмайды, онда бұрынғы жүктеме жады жүйесінен дұрыс емес мән алады, өйткені кейінгі сақтау орнына бұрынғы жүктемеден бұрын орындауға рұқсат етілді. Сонымен қатар, буферлік сақтаулар зейнеткерлікке шыққанға дейін процессорларға ерекшелік тудыруы мүмкін нұсқауларды (мысалы, дұрыс емес мекен-жай жүктемесі, нөлге бөлу және т.б.) орындайтын нұсқауларды орындауға мүмкіндік береді. немесе бағыты (қалыпталған немесе алынбаған) әлі белгісіз шартты тармақ нұсқаулығы. Егер ерекшелікті пайда ететін нұсқау орындалмаса немесе тармақ бағыты дұрыс болжанбаса, процессор "қате жол" бойынша нұсқауларды алып, орындайды. Бұл нұсқаулар мүлдем орындалмауы керек еді; ерекшелік шарты кез келген болжамды нұсқаулар орындалғанға дейін пайда болуы керек еді немесе филиал басқа бағытта жүруі керек еді және басқа нұсқауларды алып, орындау керек еді. Процессор қате жолдың кез келген нәтижесін, ерекшелік немесе тармақ болжау қателігін анықтаған кезде, болжамды түрде орындалған нұсқауларды "алып тастауы" керек. Дәмханалар үшін күрделілік - жаман немесе дұрыс болжалмаған жолдағы кез-келген дәмханалар өздерінің мәндерін жад жүйесіне тапсырмауы керек; егер дәмханалар өздерінің мәндерін тапсырған болса, онда тапсыруды "тазарып тастау" мүмкін емес, ал машинаның жад жағдайы орындалмауы керек дәмхана нұсқаулығынан алынған деректермен бүлінген. Осылайша, сақтау буфері болмаса, барлық алдын ала мүмкін болатын ерекшеліктерді тудыратын нұсқаулар орындалғанша (және ерекшелік тудырмағанша) және барлық алдыңғы тармақ бағыттары белгілі болғанша, сақтау орындай алмайды. Дүкендерді филиалдың нұсқаулары мен ерекшеліктері белгілі болғанға дейін күтуге мәжбүрлеу тапсырыс беруден тыс агрессияны едәуір азайтады және ILP (нұсқау деңгейінің параллельділігі) мен өнімділігін шектейді. Буферлік сақтау арқылы, дүкендер ерекшеліктерді немесе шешілмеген тармақ нұсқауларын орындай алады, олардың деректерін дүкен кезегінде буферлейді, бірақ олардың мәндерін зейнеткерлікке шыққанға дейін тапсырмайды. Бұл дұрыс болжалмаған немесе нашар жолдардағы дүкендердің өз мәндерін жады жүйесіне беруіне кедергі келтіреді, сонымен қатар ILP-ді және дүкендердің толық тапсырысты орындаудан өнімділікті арттырады.
Жүкті жүктеп жіберу
Зейнеткерлікке шыққанға дейін дүкендерді буферлеу ЖӘМ және ЖӘМ тәуелділігін болдырмайды, бірақ жаңа мәселені енгізеді. Келесі сценарийді қарастырайық: дүкен өзінің мекенжайы мен деректерін дүкен кезегінде орындайды және буферлейді. Бірнеше нұсқаудан кейін, жүк орындалады, ол жад адресімен оқылады, оған сақтау орны жазды. Егер жүктеме өзінің деректерін жад жүйесінен оқыса, ол алдыңғы сақтау орнымен ауыстырылатын ескі мәнді оқиды. Жүкпен алынған деректер дұрыс емес болады. Бұл мәселені шешу үшін процессорлар сақтау кезегін пайдалана отырып, жүк жіберу үшін сақтау деп аталатын әдісті қолданады. Сақтау кезегі жинақтарды жинақтауға дейін буферлеуден басқа, екінші мақсатқа қызмет етеді: аяқталған, бірақ әлі де зейнеткерлікке шыққан ("ұшудағы") жинақтардың деректерін кейінгі жүктемелерге жіберу. FIFO кезегінің орнына, сақтау кезегі шын мәнінде мазмұндық адрестік жады (CAM) болып табылады. Жүктелген кезде, ол бағдарламаның логикалық түрде алдыңғы қатардағы ұшақтардың кезегін іздеп табады. Егер сәйкес келетін сақтау орны болса, жүктеме өзінің деректерін жад жүйесінің орнына осы сақтау орнынан алады. Егер сәйкес келетін сақтау орны болмаса, жүктеме әдеттегідей жад жүйесіне кіреді; кез келген алдыңғы сәйкес келетін сақтау орындары бұрыннан зейнеткерлікке шығып, өздерінің мәндерін бекіткен болуы керек. Бұл әдіс жүкке дұрыс деректерді алуға мүмкіндік береді, егер олардың өндіруші қоймасы аяқталса, бірақ әлі де зейнеткерлікке шықпаған болса. Жүктің жады мекенжайына бірнеше сақтау орындары сақтау кезегінде болуы мүмкін. Бұл жағдайды басқару үшін, бағдарламалық тәртіпте жүктеуден логикалық түрде ертерек болатын соңғы дүкенді таңдау үшін сақтау кезегі басымдықпен кодталады. Қай сақтаудың "ең соңғы" екенін анықтау нұсқауларға уақыт белгісін қосу арқылы, немесе жүктің ең ескі және ең жаңа қоймаларға қатысты салыстырмалы орнын (слотты) білу арқылы жүзеге асырылуы мүмкін.
RAW тәуелділік бұзушылықтарын анықтау
Заманауи зақымдалған CPU-лар RAW тәуелділік бұзушылықтарын анықтау үшін бірқатар әдістерді қолдана алады, бірақ барлық әдістер ұшу жүктемесін орындаудан зейнеткерлікке шыққанға дейін қадағалауды қажет етеді. Жүк орындалған кезде ол жады жүйесіне және/немесе сақтау кезегіне кіріп, оның деректерін алады, содан кейін оның мекенжайы мен деректері зейнеткерлікке шыққанға дейін жүк кезегінде буферде сақталады. Жүк кезегі құрылымы мен қызметі бойынша сақтау кезегіне ұқсас, және кейбір процессорларда сақтау кезегімен бірге бір құрылымда біріктірілуі мүмкін, ол жүк сақтау кезегі немесе LSQ деп аталады. RAW тәуелділік бұзушылықтарын анықтау үшін мынадай әдістер қолданылады немесе ұсынылды:
Жүк кезегінің CAM іздеу
Бұл әдіспен жүк кезегі, дүкен кезегі сияқты, жадқа кіру мекенжайын пайдалана отырып, CAM іздестіріледі және барлық ұшу жүктемелерін қадағалайды. Қойма орындалғанда, ол бағдарламаның реті бойынша логикалық түрде кейінгі орындағы бірдей мекен-жайдан келген жүктелген жүктер үшін жүктеу кезегін іздейді. Егер осындай сәйкес жүктілік болса, ол сақтаудан бұрын орындалған болуы керек және осылайша жады жүйесінен / сақтау кезегінен дұрыс емес, ескі мәнді оқыған болуы керек. Жүктің мәнін пайдаланған кез келген нұсқаулар да дұрыс емес деректерді пайдаланған. Егер мұндай бұзушылық анықталса, қалпына келтіру үшін жүктеме "бозылған" деп есептелген буферде белгіленеді. Сақтау кезегінде және зейнеткерлік буферде қалады және әдетте зейнеткерлікке шығады, ол зейнеткерлікке шыққан кезде оның құндылығын жады жүйесіне жібереді. Алайда, бұзылған жүктеме зейнетке шығу нүктесіне жеткенде, процессор құбырды жуып, жүктеме нұсқаулығынан орындауды қайта бастайды. Осы сәтте барлық алдыңғы дүкендер өздерінің құндылықтарын жады жүйесіне тапсырды. Жүктеп беру нұсқаулығы енді жад жүйесінен дұрыс мәнді оқиды, ал кез келген тәуелді нұсқаулар дұрыс мәнді пайдалана отырып қайта орындалады. Бұл техника әр сақтау орындалуындағы жүктеме кезегінің ассоциативтік іздеуін қажет етеді, бұл схема қуатын тұтынады және үлкен жүктеме кезектері үшін қиын уақыт жолы бола алады. Алайда, ол қосымша жады (кеш) порттарын қажет етпейді немесе басқа жүктемелермен немесе орындалатын қоймалармен ресурстық қақтығыстарды тудырмайды.
Зейнеткерлікке шыққан кездегі түсініктілігі
Бұл әдіспен, тәртіптен тыс орындалған жүктеме нұсқаулары қайта орындалады (олар жад жүйесіне кіреді және олардың мекенжайынан екінші рет мәнді оқиды) олар зейнетке шығу нүктесіне жеткенде. Жүк қазір зейнеткерлік нұсқаулық болғандықтан, ол әлі де ұшудағы кез-келген нұсқаулықтан тәуелді емес; оның алдындағы барлық дүкендер өздерінің мәндерін жад жүйесіне тапсырды, сондықтан жад жүйесінен оқылған кез-келген мәннің дұрыс екендігіне кепілдік беріледі. Жүкті қайта орындау кезінде жадынан оқылған мәнді жүктемені алғаш орындау кезінде алынған мәнмен салыстырады. Егер мәндер бірдей болса, бастапқы мән дұрыс болды және бұзылу орын алған жоқ. Егер қайта орындау мәні бастапқы мәннен өзгеше болса, онда RAW бұзылуы орын алды және құбырды тазарту керек, өйткені жүктемеге байланысты нұсқаулар дұрыс емес мәнді қолданды. Бұл әдіс жүктеме кезегін іздеуден тұжырымдамасы жағынан қарапайым және екінші CAM-ді және оның қуатты іздеуін жояды (жүктеме кезегі енді қарапайым FIFO кезегі болуы мүмкін). Жүкпен жад жүйесіне қайта кіру керек болғандықтан, бұл жүйе өте тез болуы керек, сондықтан бұл схема жылдам кэшке негізделген. Кэш қаншалықты жылдам болса да, әрбір ретсіз жүктеу нұсқаулығы үшін екінші жады жүйесіне кіру нұсқаулықтардың зейнеткерлікке шығу күттірімін арттырады және процессор орындауы керек кэшке кірулердің жалпы санын арттырады. Қосымша кешке қол жеткізуді қалпына келтіру уақытын қолданыстағы кеш портын қайта пайдалану арқылы қанағаттандыруға болады; алайда бұл процессордың басқа жүктемелері мен орындауға тырысатын қоймаларымен порт ресурстарын таластыруды тудырады, сондықтан өнімділіктің төмендеуіне әкелуі мүмкін. Сонымен қатар, жүктемені анықтайтын қосымша кэш портын қосуға болады, бірақ бұл кэстің күрделілігін, қуатын және аумағын арттырады. Кейбір соңғы жұмыстар (Roth 2005) RAW тәуелділік бұзушылықтың болмауы мүмкін емес екендігі белгілі болса, көптеген жүктемелерді қайта орындаудан сүзгілеудің жолдарын көрсетті; мұндай техника осындай кідіріс пен ресурстық қақтығысты жоюға көмектеседі немесе жоюға көмектеседі. Бұл схеманың кішігірім пайдасы (жүк кезегін іздеумен салыстырғанда) RAW тәуелділік бұзушылықты белгілемейді және егер RAW тәуелділік бұзушылықты туғызатын қоймада (қойманың мекенжайы ұшудағы жүк мекенжайымен сәйкес келсе) кэштегі деректер мәніне сәйкес келетін деректер мәні болса, құбыржолды тазартуды тудырмайды. Жүк кезегін іздеу схемасында осындай құбыржолды жууды болдырмау үшін жүк кезегін іздеу аппараттарына қосымша деректерді салыстыру қажет.
RAW тәуелділік бұзушылықтарын болдырмау
Жүктілік пен сақтау орындарын тапсырыссыз орындауға толық қолдау көрсететін процессорлар RAW тәуелділік бұзушылықтарын олар пайда болған кезде анықтай алады. Алайда, көптеген CPU-лар бұл мәселені барлық жүктемелер мен сақтау орындарын ретпен орындауға мәжбүрлеу арқылы немесе ретсіз жүктеме / сақтау орындарының шектеулі түрін ғана қолдап, бұл мәселені болдырмайды. Бұл тәсіл тапсырыс жүктемесі / сақтау орындалуынан толық қолдау көрсетумен салыстырғанда төмен өнімділікті ұсынады, бірақ ол орындау өзегі мен кэштерінің күрделілігін едәуір азайта алады. Бірінші нұсқа, жүктемелер мен қоймаларды ретке келтіру, RAW-ке тәуелділіктен аулақтайды, өйткені жүк өндіруші қоймасынан бұрын орындалып, дұрыс емес деректер алу мүмкіндігі жоқ. Тағы бір мүмкіндік - жүктеме мен қоймаларды екі операцияға бөлу: адресті құру және кэшке кіру. Осы екі бөлек, бірақ байланысты операциялар арқылы, CPU жүктемелер мен қоймаларға жад жүйесіне тек барлық алдыңғы жүктемелер мен қоймалардың мекен-жайы LSQ-да буферленгеннен кейін ғана кіруге рұқсат береді. Адрестерді құрудан кейін, барлық адрестер белгілі болғандықтан, бұдан былай ешқандай екіжақты тәуелділіктер болмайды, сондықтан тәуелді жүктемелер олардың сәйкес қоймалары аяқталғанша орындалмайды. Бұл схема әлі де кейбір "жүргізуден тыс" мүмкіндік береді кез-келген ұшу жүктемелері мен қоймалары үшін мекенжайлар жасау операциялары ретсіз орындалуы мүмкін, ал мекенжайлар пайда болғаннан кейін әр жүк немесе қойма үшін кэшке кіру кез-келген тәртіпте болуы мүмкін (қазіргі белгілі) шын тәуелділіктерді құрметтейді.
Жадыға тәуелділікті болжау
Тапсырыссыз жүктеу / сақтау орындауын толық қолдайтын процессорлар жад тәуелділігін болжау деп аталатын қосымша, байланысты әдісті пайдалана алады. Бұл әдіс жүктеулер мен сақтау орындары арасындағы нақты тәуелділікті олардың мекенжайлары белгілі болғанға дейін болжауға тырысады. Бұл әдісті қолдану арқылы процессор ұшудағы сақтаудан тәуелді деп болжанатын жүктемелерді сол сақтау аяқталғанға дейін орындаудан сақтай алады, RAW тәуелділік бұзушылықтан аулақ болады және осылайша құбыржолды тазартудан және өндірілген өнімділік жазасынан аулақ болады. Толығырақ жадқа тәуелділікті болжау мақаласын қараңыз.