Кіріспе

MAJC (Microprocessor Architecture for Java Computing) - Sun Microsystems компаниясының 1990-жылдардың ортасынан аяғына дейін жасаған көп өзекті, көп желілі, өте ұзақ нұсқаулық сөз (VLIW) микропроцессорлық дизайны. MAJC процессоры бастапқыда UltraJava процессоры деп аталды, ол Java бағдарламаларын орындауға бағытталған, оның "соңы компиляциясы" Sun-ке бірнеше оңтайлы дизайн шешімдерін қабылдауға мүмкіндік берді. Процессор Sun компаниясының екі коммерциялық графикалық картасында шығарылды. Көп өзекті процессордағы бірнеше желілер туралы алынған сабақтар кейінірек OpenSPARC-ті іске асыру үшін негіз болды, мысалы UltraSPARC T1.

Тапсырманы компиляторға жіберу

Басқа VLIW жобалары сияқты, атап айтқанда Intel-тің IA 64 (Itanium) сияқты, MAJC процессордан шығып, бірнеше қымбат операцияларды байланысты компиляторларға көшіру арқылы өнімділікті жақсартуға тырысты. Жалпы, VLIW жобалары нұсқаулық жоспарлаушыны жоюға тырысады, ол көбінесе процессордың транзисторлық бюджетіне қатысты үлкен мөлшерді білдіреді. CPU-ның осы бөлігі бағдарламалық жасақтамадан алынып тасталған кезде, бұл транзисторларды басқа мақсаттарда қолдануға болады, көбінесе бірден көп нұсқауларды өңдеу үшін қосымша функционалдық бірліктер қосу немесе кэш жадының мөлшерін ұлғайту үшін, деректердің анағұрлым баяу негізгі жадынан келуін күту уақытын азайту үшін. MAJC осы жалпы тұжырымдамаларды бөлісе отырып, басқа VLIW жобаларынан және жалпы процессорлардан ерекшеленді.

Жалпыланған функционалдық бірліктер

Процессорлардың көпшілігі белгілі бір дерек түрінде жұмыс істеуге бейімделген функционалдық бірліктер деп аталатын бірнеше бөлек "субпроцессорларды" қамтиды. Мысалы, қазіргі заманғы CPU-да әдетте екі немесе үш функционалдық бірлік бар, олар бүтін сандық деректерді және логикалық нұсқауларды өңдеуге арналған, олар ALU деп аталады, ал басқа бірліктер жылжымалы нүктелі сандарды, FPU-ларды немесе мультимедиалық деректерді, SIMD-ді басқарады. MAJC-де кез келген деректерді өңдей алатын бір ғана көп мақсатты функционалдық блок пайдаланылды. Теориялық тұрғыдан бұл тәсіл кез келген деректерді өңдеуге сол деректерді өңдеуге арналған бірлікте бірдей деректерді өңдеуге қарағанда ұзақ уақыт, мүмкін әлдеқайда ұзақ уақыт кетеді дегенді білдіреді. Бірақ, екінші жағынан, бұл жалпы мақсаттағы блоктар сонымен қатар CPU-ның үлкен бөліктерін пайдаланбайтындығын білдірді, өйткені бағдарлама сол уақытта көптеген (мысалы) жылжымалы нүктелік есептеулерді жасады.

Ұзындығы өзгермелі нұсқаулық пакеттері

Тағы бір айырмашылық - MAJC-де VLIW-де компилятор бір уақытта орындалуы мүмкін деп анықтаған бірнеше нұсқауларды қамтитын өзгермелі ұзындығы бар "нұсқау пакеттері" болды. Көптеген VLIW архитектуралары белгіленген ұзындығы бар пакеттерді қолданады және орындауға нұсқау таба алмаған кезде, оны жай ғана орын алатын NOP-пен толтырады. Түрлі ұзындықтағы нұсқаулық пакеттер CPU-ға күрделілік қосқанмен, ол кез-келген уақытта кэштегі кодтың санын ұлғайта отырып, кодтың көлемін азайтты және осылайша қымбат кэштің санын азайтты.

Қалқалар мен тосқауылдардан аулақ болу

Негізгі айырмашылық - MAJC дизайнының компилятордан интерлоктардан, орындауда үзілістерден аулақ болуды талап етуі, ал бір нұсқаудың нәтижелері келесі орындалуы үшін өңдеу қажет. Мысалы, егер процессорға C = A + B, E = C + D нұсқаулары берілсе, онда екінші нұсқау бірінші аяқталғаннан кейін ғана орындалуы мүмкін. Процессорлардың көпшілігі C-нің мәнін есептеген кезде басқа нұсқауларды орындауға мүмкіндік беретін, осы сияқты өзара байланысқан нұсқауларды тоқтатып, қайта жоспарлауға арналған конструкциясына кілттер кіреді. Алайда бұл бұғатталулар чиптік жылжымайтын мүлік тұрғысынан өте қымбат және нұсқауды жоспарлау логикасының көпшілігін білдіреді. Компилятордың осы блоктанудан аулақ болу үшін, ол әрбір нұсқаудың орындалуына қанша уақыт кететінін нақты білуі керек. Мысалы, егер белгілі бір іске асыруда жылжымалы нүктемен көбейтуді аяқтау үшін үш цикл қажет болса, MAJC компиляторлары басқа нұсқауларды жоспарлауға тырысады, олар үш циклді аяқтауға қажет және қазіргі уақытта тоқтатылмаған. Нақты іске асырудағы өзгеріс бұл кідіртуді тек екі нұсқауға дейін азайтуы мүмкін, бірақ компилятор бұл өзгеріс туралы хабардар болуы керек. Бұл компилятордың MAJC-ге тұтастай байланысты емес, MAJC-нің белгілі бір іске асырылуы, әрбір жеке CPU-ның MAJC-ге негізделген дизайны дегенді білдіреді. Бұл әдетте күрделі логистикалық проблема болар еді; мысалы, Intel IA 32 дизайнының әртүрлі нұсқаларының санын қарастырайық, әрқайсысына жеке компилятор қажет болады және әзірлеуші әрқайсысы үшін әртүрлі бинарлық файл жасау керек. Алайда, Java нарығын дәл осы тұжырымдама басқарады - әр ISA үшін әр түрлі компилятор бар және ол әзірлеушінің орнына клиенттің машинасына орнатылады. Жасаушы өз бағдарламасының тек бір байт-кодты нұсқасын жібереді, ал пайдаланушының машинасы оны негізгі платформаға компиляциялайды. Шын мәнінде, нұсқауларды осылай жоспарлау өте қиын мәселе болып табылады. Нақты әлемде, процессорлар осы жоспарлауды орындау кезінде көптеген оқиғаларға тап болады, өйткені қажетті деректер кэштен тыс және бағдарламада мұндай деректерге тәуелді емес басқа нұсқаулар жоқ. Бұл жағдайларда процессор ұзақ уақыт бойы тоқтап, негізгі жадыда күтуі мүмкін. VLIW әдісі бұл ретте көп көмектеспейді; компилятор орындалатын нұсқауларды іздеуге көп уақыт жұмсай алады, бірақ бұл оны таба алады дегенді білдірмейді. MAJC бұл мәселені басқа желілерден кодты орындау мүмкіндігі арқылы шешуге тырысты, егер ағымдағы желі жадыда тоқтаса. Тақырыптарды ауыстыру әдетте контексттік ауыстырғыш деп аталатын өте қымбат процесс болып табылады, ал қалыпты процессорда ауыстырғыш кез-келген үнемдеуді басып, машинаны баяулатады. MAJC-де жүйе бір уақытта төрт желіге дейін жадында күйін ұстай алады, бұл контекстті бірнеше нұсқаулыққа дейін қысқартады. Бұл мүмкіндік басқа процессорларда пайда болды; Intel оны HyperThreading деп атайды. MAJC бұл идеяны бір қадам алға жылжытты және олар тоқтаған кезде желілер үшін қажетті деректер мен нұсқауларды алдын ала алуға тырысты. Процессорлардың көпшілігі нұсқау ағынының бөліктері үшін ұқсас функционалдылықты қамтиды, бұл болжамды орындау деп аталады, онда процессор тармақтың екі мүмкін нәтижелерін де есептеп, шешуші айнымалыны күтеді. MAJC бұдан былай үдерісті тоқтамағандай орындай берді, бұл орындауды пайдаланып, үдерістің тоқтауы тоқтаған кезде қажет болатын кез келген деректерді немесе нұсқауларды тауып, жүктейді. Sun мұны Space Time Computing (STC) деп атады және бұл болжамдық көптірікті дизайн. Осы уақытқа дейін процессорлар бір желіде параллельділікті алуға тырысты, бұл әдіс өз шегіне жетіп барады. Жалпы алғанда, MAJC дизайны бір желіде параллельділікті іздеуден гөрі, желілер (және бағдарламалар) арқылы жүгіру арқылы тоқтаулардан аулақ болуға тырысқан сияқты. VLIW-тің тоқтап қалуы жағынан нашар болады деп күтіледі, өйткені компиляция кезінде орындау уақытында мінез-құлқын түсіну қиын, бұл мәселені шешуде MAJC әдісін ерекше қызықты етеді.

Қолданылу

Sun компаниясы MAJC-дің бір ғана моделін, екі өзекті MAJC 5200-ді жасады, ол Sun-дің XVR 1000 және XVR 4000 жұмыс станциялары графикалық тақталарының жүрегі болды. Алайда, көп өзекті және көп желілі дизайн идеяларының көбі, әсіресе, кідіртуді азайту үшін бірнеше желілерді пайдалану тұрғысынан, Sun SPARC процессор желісіне, сондай-ақ басқа компаниялардың жобаларына жол ашылды. Сонымен қатар, нұсқауларға қарағанда процессорды мүмкіндігінше көп желілерді орындау үшін жобалау туралы MAJC идеясы кейінгі UltraSPARC T1 (кодтық атауы Ниагара) дизайнының негізі болып көрінеді.