Փակել գովազդը

Մայք Էշ նվիրված իր բլոգում iPhone 64S-ում 5-բիթանոց ճարտարապետության անցնելու գործնական հետևանքները: Այս հոդվածը հիմնված է նրա բացահայտումների վրա:

Այս տեքստի պատճառը հիմնականում մեծ քանակությամբ ապատեղեկատվություն է տարածվում այն ​​մասին, թե իրականում ինչ է նշանակում 5-բիթանոց ARM պրոցեսորով նոր iPhone 64s-ը օգտատերերի և շուկայի համար։ Այստեղ մենք կփորձենք օբյեկտիվ տեղեկատվություն բերել մշակողների համար այս անցման կատարման, հնարավորությունների և հետևանքների մասին:

«64 բիթ»

Պրոցեսորի երկու մաս կա, որոնց «X-bit» պիտակը կարող է վերաբերել՝ ամբողջ թվերի ռեգիստրների լայնությունը և ցուցիչների լայնությունը: Բարեբախտաբար, ժամանակակից պրոցեսորների մեծ մասում այս լայնությունները նույնն են, ուստի A7-ի դեպքում դա նշանակում է 64-բիթանոց ամբողջ թվերի ռեգիստրներ և 64-բիթանոց ցուցիչներ:

Այնուամենայնիվ, նույնքան կարևոր է նշել, թե ինչ չի նշանակում «64bit»-ը. RAM ֆիզիկական հասցեի չափը. RAM-ի հետ հաղորդակցվելու բիթերի քանակը (հետևաբար RAM-ի քանակը, որը սարքը կարող է աջակցել) կապված չէ պրոցեսորի բիթերի քանակի հետ: ARM պրոցեսորներն ունեն 26-ից 40-բիթանոց հասցեներ և կարող են փոխվել անկախ համակարգի մնացած մասերից:

  • Տվյալների ավտոբուսի չափը. RAM-ից կամ բուֆերային հիշողությունից ստացված տվյալների քանակը նմանապես անկախ է այս գործոնից: Անհատական ​​պրոցեսորի հրահանգները կարող են պահանջել տարբեր քանակությամբ տվյալներ, բայց դրանք կա՛մ ուղարկվում են կտորներով, կա՛մ ստացվում են հիշողությունից ավելին, քան անհրաժեշտ է: Դա կախված է տվյալների քվանտի չափից: iPhone 5-ն արդեն հիշողությունից տվյալներ է ստանում 64-բիթանոց քվանտայով (և ունի 32-բիթանոց պրոցեսոր), և մենք կարող ենք հանդիպել մինչև 192 բիթ չափերի։
  • Լողացող կետի հետ կապված ցանկացած բան. Նման ռեգիստրների (FPU) չափերը կրկին անկախ են պրոցեսորի ներքին աշխատանքից: ARM-ն օգտագործում է 64-բիթանոց FPU-ն ARM64-ից առաջ (64-բիթանոց ARM պրոցեսոր):

Ընդհանուր առավելություններն ու թերությունները

Եթե ​​համեմատենք այլ կերպ նույնական 32 բիթ և 64 բիթ ճարտարապետությունները, ապա դրանք հիմնականում այդքան էլ տարբեր չեն: Սա պատճառներից մեկն է հանրության ընդհանուր խառնաշփոթի, որը պատճառ է փնտրում, թե ինչու Apple-ը շարժական սարքերում նույնպես անցնում է 64 բիթ: Այնուամենայնիվ, ամեն ինչ գալիս է A7 (ARM64) պրոցեսորի հատուկ պարամետրերից և այն բանից, թե ինչպես է այն օգտագործում Apple-ը, ոչ միայն այն փաստից, որ պրոցեսորն ունի 64-բիթանոց ճարտարապետություն:

Այնուամենայնիվ, եթե մենք դեռ նայենք այս երկու ճարտարապետությունների միջև եղած տարբերություններին, մենք կգտնենք մի քանի տարբերություններ: Ակնհայտն այն է, որ 64-բիթանոց ամբողջ թվերի ռեգիստրները կարող են ավելի արդյունավետ կերպով մշակել 64-բիթանոց ամբողջ թվերը: Նույնիսկ նախկինում հնարավոր էր նրանց հետ աշխատել 32-բիթանոց պրոցեսորների վրա, բայց դա սովորաբար նշանակում էր բաժանել դրանք 32-բիթանոց երկարությամբ մասերի, ինչը հանգեցնում էր ավելի դանդաղ հաշվարկների։ Այսպիսով, 64-բիթանոց պրոցեսորը սովորաբար կարող է հաշվարկել 64-բիթանոց տեսակների հետ նույնքան արագ, որքան 32-բիթանոցների դեպքում: Սա նշանակում է, որ հավելվածները, որոնք սովորաբար օգտագործում են 64-բիթանոց տեսակներ, կարող են շատ ավելի արագ աշխատել 64-բիթանոց պրոցեսորի վրա:

Չնայած 64 բիթը չի ազդում RAM-ի ընդհանուր քանակի վրա, որը կարող է օգտագործել պրոցեսորը, այն կարող է հեշտացնել մեկ ծրագրում RAM-ի մեծ կտորների հետ աշխատելը: 32-բիթանոց պրոցեսորով աշխատող ցանկացած ծրագիր ունի ընդամենը մոտ 4 ԳԲ հասցեի տարածք: Հաշվի առնելով, որ օպերացիոն համակարգը և ստանդարտ գրադարանները ինչ-որ բան են վերցնում, սա ծրագրին թողնում է 1-3 ԳԲ-ի սահմաններում հավելվածի օգտագործման համար: Այնուամենայնիվ, եթե 32-բիթանոց համակարգն ունի ավելի քան 4 ԳԲ օպերատիվ հիշողություն, այդ հիշողության օգտագործումը մի փոքր ավելի բարդ է: Մենք պետք է դիմենք ստիպելու օպերացիոն համակարգին քարտեզագրել հիշողության այս ավելի մեծ կտորները մեր ծրագրի համար (հիշողության վիրտուալացում), կամ կարող ենք ծրագիրը բաժանել մի քանի պրոցեսների (որտեղ յուրաքանչյուր պրոցես տեսականորեն ունի 4 ԳԲ հիշողություն, որը հասանելի է ուղղակի հասցեավորման համար):

Այնուամենայնիվ, այս «հակերը» այնքան դժվար և դանդաղ են, որ նվազագույն հավելվածներ օգտագործում են դրանք: Գործնականում, 32-բիթանոց պրոցեսորի վրա, յուրաքանչյուր ծրագիր կօգտագործի միայն իր 1-3 ԳԲ հիշողությունը, և ավելի մատչելի RAM-ը կարող է օգտագործվել միաժամանակ մի քանի ծրագրեր գործարկելու համար կամ օգտագործել այս հիշողությունը որպես բուֆեր (քեշավորում): Այս կիրառությունները գործնական են, բայց մենք կցանկանայինք, որ ցանկացած ծրագիր կարողանա հեշտությամբ օգտագործել 4 ԳԲ-ից մեծ հիշողության կտորներ:

Այժմ մենք գալիս ենք հաճախակի (իրականում սխալ) պնդումին, որ առանց 4 ԳԲ-ից ավելի հիշողության, 64-բիթանոց ճարտարապետությունն անօգուտ է: Հասցեների ավելի մեծ տարածքը օգտակար է նույնիսկ ավելի քիչ հիշողություն ունեցող համակարգում: Հիշողության քարտեզագրված ֆայլերը հարմար գործիք են, որտեղ ֆայլի բովանդակության մի մասը տրամաբանորեն կապված է գործընթացի հիշողության հետ՝ առանց ամբողջ ֆայլը հիշողության մեջ բեռնվելու: Այսպիսով, համակարգը կարող է, օրինակ, աստիճանաբար մշակել մեծ ֆայլեր շատ անգամ ավելի մեծ, քան RAM-ի հզորությունը: 32-բիթանոց համակարգում նման մեծ ֆայլերը չեն կարող հուսալիորեն քարտեզագրվել հիշողության միջոցով, մինչդեռ 64-բիթանոց համակարգում դա մի կտոր տորթ է՝ շնորհիվ շատ ավելի մեծ հասցեների տարածության:

Այնուամենայնիվ, ցուցիչների ավելի մեծ չափը բերում է նաև մեկ մեծ թերություն. հակառակ դեպքում նույնական ծրագրերը 64-բիթանոց պրոցեսորի վրա ավելի շատ հիշողություն են պահանջում (այս ավելի մեծ ցուցիչները պետք է ինչ-որ տեղ պահվեն): Քանի որ ցուցիչները ծրագրերի հաճախակի մաս են կազմում, այս տարբերությունը կարող է ծանրաբեռնել քեշը, որն իր հերթին հանգեցնում է ամբողջ համակարգի ավելի դանդաղ աշխատանքին: Այսպիսով, հեռանկարում մենք կարող ենք տեսնել, որ եթե մենք պարզապես փոխենք պրոցեսորի ճարտարապետությունը 64-բիթանոցի, դա իրականում կդանդաղեցնի ամբողջ համակարգը: Այսպիսով, այս գործոնը պետք է հավասարակշռվի այլ վայրերում ավելի շատ օպտիմալացումներով:

ARM64- ը

A7-ը՝ 64-բիթանոց պրոցեսորը, որը սնուցում է նոր iPhone 5s-ը, սովորական ARM պրոցեսոր չէ՝ ավելի լայն ռեգիստրներով: ARM64-ը մեծ բարելավումներ է պարունակում ավելի հին, 32-բիթանոց տարբերակի համեմատ:

Apple A7 պրոցեսոր:

Ռեեստրը

ARM64-ը երկու անգամ ավելի շատ ամբողջ ռեգիստր է պահում, քան 32-բիթանոց ARM-ը (զգույշ եղեք չշփոթել ռեգիստրների քանակն ու լայնությունը. մենք խոսեցինք լայնության մասին «64-բիթանոց» բաժնում: Այսպիսով, ARM64-ն ունի և՛ կրկնակի լայն ռեգիստրներ, և՛ երկու անգամ ավելի շատ: գրանցամատյաններ): 32-բիթանոց ARM-ն ունի 16 ամբողջ թվային ռեգիստր՝ մեկ ծրագրի հաշվիչ (PC - պարունակում է ընթացիկ հրահանգի համարը), ստեկի ցուցիչ (ցուցիչ դեպի ընթացքի մեջ գտնվող ֆունկցիա), կապող ռեգիստր (ցուցիչ՝ ավարտից հետո վերադարձի համար): ֆունկցիայի), իսկ մնացած 13-ը կիրառական օգտագործման համար են: Այնուամենայնիվ, ARM64-ն ունի 32 ամբողջ ռեգիստր, ներառյալ մեկ զրոյական ռեգիստր, կապի ռեգիստր, շրջանակի ցուցիչ (նման է ստեկի ցուցիչին) և մեկը՝ վերապահված ապագայի համար: Սա մեզ թողնում է 28 գրանցամատյաններ՝ հավելվածների օգտագործման համար, ինչը կրկնակի գերազանցում է 32-բիթանոց ARM-ը: Միևնույն ժամանակ, ARM64-ը կրկնապատկեց լողացող համարի (FPU) ռեգիստրների թիվը 16-ից մինչև 32 128-բիթանոց ռեգիստր:

Բայց ինչո՞ւ է գրանցամատյանների քանակն այդքան կարևոր։ Հիշողությունը սովորաբար ավելի դանդաղ է, քան պրոցեսորի հաշվարկները, և կարդալը/գրելը կարող է շատ երկար տևել: Սա կստիպի արագ պրոցեսորին սպասել հիշողությանը, և մենք կհասնենք համակարգի բնական արագության սահմանաչափին: Պրոցեսորները փորձում են թաքցնել այս արատը բուֆերների շերտերով, բայց նույնիսկ ամենաարագը (L1) դեռ ավելի դանդաղ է, քան պրոցեսորի հաշվարկը: Այնուամենայնիվ, ռեգիստրները հիշողության բջիջներ են անմիջապես պրոցեսորում, և դրանց ընթերցումը/գրումը բավական արագ է, որպեսզի չդանդաղեցնի պրոցեսորը: Ռեգիստրների թիվը գործնականում նշանակում է պրոցեսորային հաշվարկների համար ամենաարագ հիշողության քանակը, ինչը մեծապես ազդում է ամբողջ համակարգի արագության վրա:

Միևնույն ժամանակ, այս արագությունը կոմպիլյատորի կողմից օպտիմիզացման լավ աջակցության կարիք ունի, որպեսզի լեզուն կարողանա օգտագործել այդ ռեգիստրները և ստիպված չլինի ամեն ինչ պահել ընդհանուր հավելվածի (դանդաղ) հիշողության մեջ:

Հրահանգների հավաքածու

ARM64-ը նաև մեծ փոփոխություններ է մտցնում հրահանգների հավաքածուում: Հրահանգների հավաքածուն ատոմային գործողությունների մի շարք է, որը կարող է կատարել պրոցեսորը (օրինակ՝ «ADD register1 register2» թվերը գումարում է երկու գրանցամատյաններում): Առանձին լեզուների համար հասանելի գործառույթները կազմված են այս հրահանգներից: Ավելի բարդ գործառույթները պետք է կատարեն ավելի շատ հրահանգներ, որպեսզի դրանք ավելի դանդաղ լինեն:

ARM64-ում նորություններ են AES կոդավորման, SHA-1 և SHA-256 հեշ գործառույթների հրահանգները: Այսպիսով, բարդ իրականացման փոխարեն, միայն լեզուն կանվանի այս հրահանգը, որը կբերի հսկայական արագություն նման գործառույթների հաշվարկման համար և հուսով ենք, որ հավելվածներում կավելացվի անվտանգություն: օր. Նոր Touch ID-ն օգտագործում է նաև այս հրահանգները գաղտնագրման մեջ՝ թույլ տալով իրական արագություն և անվտանգություն (տեսականորեն, հարձակվողը պետք է փոփոխի պրոցեսորն ինքնին տվյալների մուտք գործելու համար, ինչը, մեղմ ասած, անիրագործելի է՝ հաշվի առնելով դրա մանրանկարչությունը):

Համատեղելիություն 32 բիթ

Կարևոր է նշել, որ A7-ը կարող է ամբողջությամբ աշխատել 32-բիթանոց ռեժիմում՝ առանց էմուլյացիայի անհրաժեշտության: Դա նշանակում է, որ նոր iPhone 5s-ը կարող է առանց դանդաղեցման գործարկել 32-բիթանոց ARM-ի վրա կազմված հավելվածները։ Այնուամենայնիվ, այն չի կարող օգտագործել նոր ARM64 գործառույթները, ուստի միշտ արժե պատրաստել հատուկ կառուցվածք միայն A7-ի համար, որը պետք է շատ ավելի արագ աշխատի:

Գործողության ժամանակի փոփոխությունները

Runtime-ը ծրագրավորման լեզվին գործառույթներ ավելացնող կոդը է, որը նա կարող է օգտագործել հավելվածի գործարկման ընթացքում՝ մինչև թարգմանվելուց հետո: Քանի որ Apple-ին անհրաժեշտ չէ պահպանել հավելվածների համատեղելիությունը (որ 64-բիթանոց երկուականն աշխատում է 32-բիթանոց), նրանք կարող են իրենց թույլ տալ ևս մի քանի բարելավումներ կատարել Objective-C լեզվում:

Դրանցից է այսպես կոչված հատկորոշված ​​ցուցիչ (նշված ցուցիչ): Սովորաբար, առարկաները և այդ օբյեկտների ցուցիչները պահվում են հիշողության առանձին մասերում: Այնուամենայնիվ, ցուցիչների նոր տեսակները թույլ են տալիս քիչ տվյալներ ունեցող դասերին օբյեկտներ պահել անմիջապես ցուցիչում: Այս քայլը վերացնում է օբյեկտի համար անմիջապես հիշողություն հատկացնելու անհրաժեշտությունը, պարզապես ստեղծեք ցուցիչ և դրա ներսում գտնվող առարկան: Նշված ցուցիչները աջակցվում են միայն 64-բիթանոց ճարտարապետության մեջ նաև այն պատճառով, որ 32-բիթանոց ցուցիչում այլևս բավարար տարածք չկա՝ բավարար օգտակար տվյալներ պահելու համար: Հետևաբար, iOS-ը, ի տարբերություն OS X-ի, դեռ չէր աջակցում այս գործառույթին: Այնուամենայնիվ, ARM64-ի գալուստով սա փոխվում է, և iOS-ը այս առումով նույնպես հասել է OS X-ին:

Չնայած ցուցիչների երկարությունը 64 բիթ է, ARM64-ում միայն 33 բիթ է օգտագործվում ցուցիչի սեփական հասցեի համար: Եվ եթե մենք կարողանանք հուսալիորեն քողարկել ցուցիչի մնացած բիթերը, կարող ենք օգտագործել այս տարածքը լրացուցիչ տվյալներ պահելու համար, ինչպես նշված պիտակավորված ցուցիչների դեպքում: Հայեցակարգային առումով սա Objective-C-ի պատմության ամենամեծ փոփոխություններից մեկն է, թեև այն շուկայական հատկություն չէ, ուստի օգտատերերի մեծամասնությունը չի իմանա, թե ինչպես է Apple-ը առաջ մղում Objective-C-ն:

Ինչ վերաբերում է օգտակար տվյալներին, որոնք կարող են պահպանվել նման հատկորոշված ​​ցուցիչի մնացած տարածության մեջ, ապա, օրինակ, Objective-C-ն այժմ օգտագործում է այն՝ պահպանելու այսպես կոչված. տեղեկանքների քանակը (հղումների քանակը): Նախկինում տեղեկանքների քանակը պահվում էր հիշողության մեկ այլ վայրում՝ դրա համար պատրաստված հեշ աղյուսակում, բայց դա կարող է դանդաղեցնել ամբողջ համակարգը մեծ թվով alloc/dealloc/retain/release calls դեպքում: Աղյուսակը պետք է կողպվեր՝ թելերի անվտանգության պատճառով, այնպես որ երկու թելի մեջ երկու առարկաների հղման թիվը հնարավոր չէր միաժամանակ փոխել: Այնուամենայնիվ, այս արժեքը նոր է ներդրվել մնացած այսպես կոչվածի մեջ Իսա ցուցանիշները։ Սա ևս մեկ աննկատ, բայց հսկայական առավելություն և արագացում է ապագայում։ Այնուամենայնիվ, դա երբեք հնարավոր չէր հասնել 32-բիթանոց ճարտարապետության մեջ:

Կապակցված օբյեկտների մասին տեղեկատվությունը, թե արդյոք օբյեկտը թույլ է հղված է, արդյոք անհրաժեշտ է օբյեկտի համար դեստրուկտոր ստեղծել և այլն, նույնպես նոր են տեղադրվում առարկաների ցուցիչների մնացած տեղում: Այս տեղեկատվության շնորհիվ Objective-C-ն Runtime-ը կարողանում է հիմնովին արագացնել գործարկման ժամանակը, որն արտացոլվում է յուրաքանչյուր հավելվածի արագության վրա: Փորձարկումից սա նշանակում է հիշողության կառավարման բոլոր զանգերի մոտ 40-50% արագացում: Պարզապես անցնելով 64-բիթանոց ցուցիչների և օգտագործելով այս նոր տարածքը:

Եզրակացություն

Թեև մրցակիցները կփորձեն տարածել այն միտքը, որ 64-բիթանոց ճարտարապետության անցնելն ավելորդ է, դուք արդեն կիմանաք, որ սա ուղղակի շատ անտեղյակ կարծիք է։ Ճիշտ է, պարզապես անցնել 64 բիթ առանց լեզուն կամ հավելվածները դրան հարմարեցնելու, իրականում ոչինչ չի նշանակում, այն նույնիսկ դանդաղեցնում է ամբողջ համակարգը: Բայց նոր A7-ն օգտագործում է ժամանակակից ARM64 նոր հրահանգների հավաքածուով, և Apple-ը դժվարացել է արդիականացնել ամբողջ Objective-C լեզուն և օգտվել նոր հնարավորություններից, հետևաբար խոստացված արագությունը:

Այստեղ մենք նշել ենք բազմաթիվ պատճառներ, թե ինչու է 64-բիթանոց ճարտարապետությունը ճիշտ քայլ առաջ: Սա հերթական հեղափոխությունն է «գլխարկի տակ», որի շնորհիվ Apple-ը կփորձի առաջնագծում մնալ ոչ միայն դիզայնով, օգտատիրոջ միջերեսով և հարուստ էկոհամակարգով, այլ հիմնականում շուկայում առկա ամենաժամանակակից տեխնոլոգիաներով։

Աղբյուրը ` mikeash.com
.