რეკლამის დახურვა

მაიკ ეშ მიუძღვნა თავის ბლოგს iPhone 64S-ში 5-ბიტიან არქიტექტურაზე გადასვლის პრაქტიკული შედეგები. ეს სტატია ეყრდნობა მის დასკვნებს.

ამ ტექსტის მიზეზი ძირითადად არის გავრცელებული დეზინფორმაციის დიდი რაოდენობა იმის შესახებ, თუ რას ნიშნავს რეალურად მომხმარებლებისთვის და ბაზრისთვის ახალი iPhone 5s 64-ბიტიანი ARM პროცესორით. აქ ჩვენ შევეცდებით ობიექტური ინფორმაციის მოტანა დეველოპერებისთვის ამ გადასვლის შესრულების, შესაძლებლობებისა და შედეგების შესახებ.

"64 ბიტი"

პროცესორის ორი ნაწილია, რომელსაც "X-bit" იარლიყი შეიძლება მიუთითებდეს - მთელი რიცხვების რეგისტრების სიგანე და მაჩვენებლების სიგანე. საბედნიეროდ, უმეტეს თანამედროვე პროცესორებზე ეს სიგანეები იგივეა, ასე რომ, A7-ის შემთხვევაში ეს ნიშნავს 64-ბიტიან მთლიან რეგისტრებს და 64-ბიტიან მაჩვენებლებს.

თუმცა, თანაბრად მნიშვნელოვანია აღვნიშნოთ რას არ ნიშნავს "64bit": ოპერატიული მეხსიერების ფიზიკური მისამართის ზომა. RAM-თან კომუნიკაციისთვის ბიტების რაოდენობა (აქედან გამომდინარე, RAM-ის რაოდენობა, რომელსაც შეუძლია მოწყობილობის მხარდაჭერა) არ არის დაკავშირებული CPU-ის ბიტების რაოდენობასთან. 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 გბ მეხსიერებას, ხოლო მეტი ხელმისაწვდომი ოპერატიული მეხსიერება შეიძლება გამოყენებულ იქნას რამდენიმე პროგრამის ერთდროულად გასაშვებად ან ამ მეხსიერების ბუფერად (ქეშირება) გამოსაყენებლად. ეს გამოყენება პრაქტიკულია, მაგრამ ჩვენ გვსურს, რომ ნებისმიერმა პროგრამამ შეძლოს ადვილად გამოიყენოს მეხსიერების ნაწილები 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-ბიტიან რეგისტრამდე.

მაგრამ რატომ არის რეგისტრების რაოდენობა ასე მნიშვნელოვანი? მეხსიერება ზოგადად უფრო ნელია ვიდრე CPU გამოთვლები და კითხვა/წერა შეიძლება ძალიან დიდი დრო დასჭირდეს. ეს აიძულებს სწრაფ პროცესორს დაელოდო მეხსიერებას და ჩვენ მივაღწევთ სისტემის ბუნებრივ სიჩქარის ლიმიტს. პროცესორები ცდილობენ დამალონ ეს ხარვეზი ბუფერების ფენებით, მაგრამ ყველაზე სწრაფიც კი (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/reale ზარების შემთხვევაში. ცხრილი უნდა დაკეტილიყო ძაფის უსაფრთხოების გამო, ამიტომ ორ ძაფში ორი ობიექტის მითითების რაოდენობა ერთდროულად ვერ შეიცვლება. თუმცა, ეს მნიშვნელობა ახლად არის ჩასმული დანარჩენ ე.წ isa ინდიკატორები. ეს არის კიდევ ერთი შეუმჩნეველი, მაგრამ დიდი უპირატესობა და აჩქარება მომავალში. თუმცა, ეს ვერასოდეს მიიღწევა 32-ბიტიან არქიტექტურაში.

ინფორმაცია ასოცირებული ობიექტების შესახებ, სუსტად არის თუ არა ობიექტზე მითითება, საჭიროა თუ არა ობიექტისთვის დესტრუქტორის გენერირება და ა.შ., ასევე ახლად ჩასმულია ობიექტების მაჩვენებლების დარჩენილ ადგილას. ამ ინფორმაციის წყალობით, Objective-C. Runtime-ს შეუძლია ფუნდამენტურად დააჩქაროს გაშვების დრო, რაც აისახება თითოეული აპლიკაციის სიჩქარეზე. ტესტირებიდან, ეს ნიშნავს მეხსიერების მართვის ყველა ზარის დაახლოებით 40-50% სიჩქარეს. უბრალოდ 64-ბიტიან მაჩვენებელზე გადასვლით და ამ ახალი სივრცის გამოყენებით.

დასკვნა

მიუხედავად იმისა, რომ კონკურენტები შეეცდებიან გაავრცელონ აზრი, რომ 64-ბიტიან არქიტექტურაზე გადასვლა არასაჭიროა, თქვენ უკვე გეცოდინებათ, რომ ეს მხოლოდ ძალიან არაინფორმირებული აზრია. მართალია, უბრალოდ 64 ბიტიანზე გადასვლა ენის ან აპლიკაციების მასზე ადაპტაციის გარეშე არაფერს ნიშნავს - ეს კი ანელებს მთელ სისტემას. მაგრამ ახალი A7 იყენებს თანამედროვე ARM64-ს ახალი ინსტრუქციების ნაკრებით და Apple-მა გაუძლო მთელი Objective-C ენის მოდერნიზაციას და ახალი შესაძლებლობებით ისარგებლოს - აქედან გამომდინარე, დაპირებული სიჩქარე.

აქ ჩვენ აღვნიშნეთ მრავალი მიზეზი, რის გამოც 64-ბიტიანი არქიტექტურა სწორი ნაბიჯია. ეს არის მორიგი რევოლუცია „კაპოტის ქვეშ“, რომლის წყალობითაც Apple შეეცდება დარჩეს წინა პლანზე არა მხოლოდ დიზაინით, მომხმარებლის ინტერფეისით და მდიდარი ეკოსისტემით, არამედ ძირითადად ბაზარზე არსებული ყველაზე თანამედროვე ტექნოლოგიებით.

წყარო: mikeash.com
.