Reklamı Kapat

Mike Ash kendi bloguna adanmış iPhone 64S'de 5 bit mimariye geçişin pratik sonuçları. Bu makale onun bulgularından yararlanmaktadır.

Bu metnin nedeni, 5 bit ARM işlemcili yeni iPhone 64'lerin kullanıcılar ve pazar için gerçekte ne anlama geldiğine dair büyük miktarda yanlış bilginin yayılmasından kaynaklanıyor. Burada geliştiricilere bu geçişin performansı, yetenekleri ve sonuçları hakkında objektif bilgiler sunmaya çalışacağız.

"64 bit"

Bir işlemcinin "X-bit" etiketinin başvurabileceği iki kısmı vardır: tamsayı kayıtlarının genişliği ve işaretçilerin genişliği. Neyse ki çoğu modern işlemcide bu genişlikler aynıdır; dolayısıyla A7 durumunda bu, 64 bitlik tamsayı kayıtları ve 64 bitlik işaretçiler anlamına gelir.

Ancak "64bit"in ne anlama gelmediğini belirtmek de aynı derecede önemlidir: RAM fiziksel adres boyutu. RAM ile iletişim kuracak bit sayısı (dolayısıyla bir cihazın destekleyebileceği RAM miktarı) CPU bit sayısıyla ilişkili değildir. ARM işlemcileri 26 ila 40 bit arasında herhangi bir adrese sahiptir ve sistemin geri kalanından bağımsız olarak değiştirilebilir.

  • Veri yolu boyutu. RAM veya ara bellekten alınan veri miktarı da benzer şekilde bu faktörden bağımsızdır. Bireysel işlemci talimatları farklı miktarlarda veri talep edebilir, ancak bunlar ya parçalar halinde gönderilir ya da bellekten ihtiyaç duyulandan fazlasını alır. Veri kuantumunun boyutuna bağlıdır. iPhone 5 zaten hafızadan 64 bitlik kuantumda veri alıyor (ve 32 bit işlemciye sahip) ve 192 bit'e varan boyutlarla karşılaşabiliyoruz.
  • Kayan noktayla ilgili herhangi bir şey. Bu tür kayıtların (FPU) boyutu yine işlemcinin dahili işleyişinden bağımsızdır. ARM, ARM64'ten (64 bit ARM işlemci) önce 64 bit FPU kullanıyor.

Genel avantajlar ve dezavantajlar

Başka şekilde aynı olan 32bit ve 64bit mimarileri karşılaştırırsak, genellikle o kadar da farklı değiller. Bu, Apple'ın mobil cihazlarda da 64 bit'e geçmesinin nedenini arayan kamuoyunun genel kafa karışıklığının nedenlerinden biri. Ancak bunların hepsi, yalnızca işlemcinin 7 bit mimariye sahip olmasından değil, A64 (ARM64) işlemcinin belirli parametrelerinden ve Apple'ın onu nasıl kullandığından kaynaklanıyor.

Ancak yine de bu iki mimari arasındaki farklara bakarsak birçok farklılık bulacağız. Açık olanı, 64 bitlik tamsayı kayıtlarının 64 bitlik tamsayıları daha verimli bir şekilde işleyebilmesidir. Daha önce bile onlarla 32 bit işlemcilerde çalışmak mümkündü ancak bu genellikle onları 32 bit uzunluğunda parçalara bölmek anlamına geliyordu ve bu da hesaplamaların yavaşlamasına neden oluyordu. Yani 64 bitlik bir işlemci genellikle 64 bitlik türlerle, 32 bitlik olanlar kadar hızlı işlem yapabilir. Bu, genellikle 64 bit türleri kullanan uygulamaların 64 bit işlemcide çok daha hızlı çalışabileceği anlamına gelir.

64bit, işlemcinin kullanabileceği toplam RAM miktarını etkilemese de, tek bir programda büyük miktarda RAM ile çalışmayı kolaylaştırabilir. 32 bit işlemcide çalışan herhangi bir programın yalnızca yaklaşık 4 GB adres alanı vardır. İşletim sistemi ve standart kütüphanelerin bir miktar yer kapladığı göz önüne alındığında, programa uygulama kullanımı için 1-3 GB arasında bir alan kalıyor. Ancak 32 bitlik bir sistemde 4 GB'tan fazla RAM varsa bu belleği kullanmak biraz daha karmaşıktır. İşletim sistemini programımız için bu daha büyük bellek parçalarını eşlemeye zorlamak zorundayız (bellek sanallaştırma) veya programı birden fazla işleme bölebiliriz (burada her işlem yine teorik olarak doğrudan adresleme için kullanılabilir 4 GB belleğe sahiptir).

Ancak bu "hackler" o kadar zor ve yavaştır ki, minimum sayıda uygulama bunları kullanır. Uygulamada, 32 bitlik bir işlemcide, her program yalnızca 1-3 GB belleğini kullanır ve daha fazla kullanılabilir RAM, birden fazla programı aynı anda çalıştırmak veya bu belleği arabellek (önbellekleme) olarak kullanmak için kullanılabilir. Bu kullanımlar pratiktir ancak herhangi bir programın 4 GB'tan büyük bellek parçalarını kolayca kullanabilmesini isteriz.

Şimdi, 4GB'tan fazla bellek olmadan 64 bit mimarinin işe yaramaz olduğu şeklindeki sık sık (aslında yanlış) iddiaya geliyoruz. Daha az belleğe sahip bir sistemde bile daha büyük bir adres alanı kullanışlıdır. Bellek eşlemeli dosyalar, dosyanın tamamının belleğe yüklenmesine gerek kalmadan, dosya içeriğinin bir kısmının mantıksal olarak sürecin belleğine bağlandığı kullanışlı bir araçtır. Böylece sistem, örneğin RAM kapasitesinin birkaç katı büyüklüğündeki büyük dosyaları kademeli olarak işleyebilir. 32 bitlik bir sistemde, bu kadar büyük dosyaların güvenilir bir şekilde bellek eşlemesi yapılamaz, oysa 64 bitlik bir sistemde, çok daha büyük adres alanı sayesinde bu çocuk oyuncağıdır.

Bununla birlikte, işaretçilerin daha büyük boyutu aynı zamanda büyük bir dezavantajı da beraberinde getirir: Aksi takdirde, aynı programlar 64 bitlik bir işlemcide daha fazla belleğe ihtiyaç duyar (bu daha büyük işaretçilerin bir yerde saklanması gerekir). İşaretçiler programların sık kullanılan bir parçası olduğundan, bu fark önbellekte yük oluşturabilir ve bu da tüm sistemin daha yavaş çalışmasına neden olur. Yani perspektiften bakıldığında, işlemci mimarisini 64-bit olarak değiştirirsek bunun aslında tüm sistemi yavaşlatacağını görebiliriz. Dolayısıyla bu faktörün başka yerlerde daha fazla optimizasyonla dengelenmesi gerekiyor.

ARM64

Yeni iPhone 7'lere güç veren 64 bit işlemci A5, yalnızca daha geniş kayıtlara sahip sıradan bir ARM işlemci değil. ARM64, eski 32 bit sürüme göre önemli iyileştirmeler içeriyor.

Apple A7 işlemci.

kayıt

ARM64, 32 bit ARM'den iki kat daha fazla tam sayı kaydı tutar (kayıtların sayısını ve genişliğini karıştırmamaya dikkat edin - "64 bit" bölümünde genişlikten bahsettik. Yani ARM64'te hem iki kat daha geniş yazmaçlar hem de iki kat daha fazla kayıt bulunur) kayıtlar). 32 bitlik ARM'de 16 tamsayı kaydı bulunur: bir program sayacı (PC - geçerli talimatın numarasını içerir), bir yığın işaretçisi (devam eden bir işleve yönelik bir işaretçi), bir bağlantı kaydı (sondan sonra geri dönüşe yönelik bir işaretçi) işlevin) ve geri kalan 13 tanesi uygulama kullanımı içindir. Bununla birlikte, ARM64'te bir sıfır yazmacı, bir bağlantı yazmacı, bir çerçeve işaretçisi (yığın işaretçisine benzer) ve bir tanesi geleceğe ayrılmış olmak üzere 32 tam sayı kaydı bulunur. Bu bize uygulama kullanımı için 28 kayıtla kalıyor; bu da 32 bit ARM'in iki katından fazla. Aynı zamanda ARM64, kayan noktalı sayı (FPU) kayıtlarının sayısını 16'dan 32 128 bit kayıtlara iki katına çıkardı.

Peki kayıt sayısı neden bu kadar önemli? Bellek genellikle CPU hesaplamalarından daha yavaştır ve okuma/yazma çok uzun zaman alabilir. Bu, hızlı işlemcinin belleği beklemeye devam etmesine neden olur ve sistemin doğal hız sınırına ulaşırız. İşlemciler bu dezavantajı arabellek katmanlarıyla gizlemeye çalışırlar ancak en hızlısı (L1) bile işlemcinin hesaplamasından daha yavaştır. Ancak yazmaçlar doğrudan işlemcide bulunan bellek hücreleridir ve okuma/yazma işlemleri işlemciyi yavaşlatmayacak kadar hızlıdır. Kayıt sayısı pratikte işlemci hesaplamaları için en hızlı belleğin miktarı anlamına gelir ve bu, tüm sistemin hızını büyük ölçüde etkiler.

Aynı zamanda, bu hızın derleyiciden iyi bir optimizasyon desteği alması gerekir, böylece dil bu kayıtları kullanabilir ve her şeyi genel uygulama (yavaş) belleğinde depolamak zorunda kalmaz.

Komut seti

ARM64 ayrıca komut setine de büyük değişiklikler getiriyor. Talimat seti, bir işlemcinin gerçekleştirebileceği bir dizi atomik işlemdir (örneğin 'ADD kayıt1 kayıt2', iki kayıttaki sayıları toplar). Bireysel dillerde kullanılabilen işlevler bu talimatlardan oluşur. Daha karmaşık işlevlerin daha fazla talimat yürütmesi gerekir, böylece daha yavaş olabilirler.

ARM64'te yeni olan, AES şifreleme, SHA-1 ve SHA-256 karma işlevlerine yönelik talimatlardır. Dolayısıyla, karmaşık bir uygulama yerine, yalnızca dil bu talimatı çağıracak; bu, bu tür işlevlerin hesaplanmasında büyük bir hızlanma sağlayacak ve uygulamalarda güvenliğin artacağını umuyoruz. Örneğin. Yeni Touch ID aynı zamanda bu talimatları şifrelemede de kullanarak gerçek hız ve güvenliğe olanak tanıyor (teorik olarak, bir saldırganın verilere erişmek için işlemcinin kendisini değiştirmesi gerekir; bu da minyatür boyutu göz önüne alındığında en azından pratik değildir).

32bit ile uyumluluk

A7'nin emülasyona ihtiyaç duymadan tamamen 32 bit modunda çalışabildiğini belirtmekte fayda var. Bu, yeni iPhone 5'lerin 32 bit ARM üzerinde derlenen uygulamaları herhangi bir yavaşlama olmadan çalıştırabileceği anlamına geliyor. Ancak bu durumda yeni ARM64 işlevlerini kullanamaz, bu nedenle yalnızca A7 için çok daha hızlı çalışması gereken özel bir yapı oluşturmak her zaman faydalı olacaktır.

Çalışma zamanı değişiklikleri

Runtime, uygulama çalışırken kullanabileceği programlama diline çeviri sonrasına kadar işlevler ekleyen koddur. Apple'ın uygulama uyumluluğunu sürdürmesi gerekmediğinden (64 bitlik bir ikili dosyanın 32 bitte çalışması), Objective-C dilinde birkaç iyileştirme daha yapmaya gücü yetebilir.

Bunlardan biri sözde etiketli işaretçi (işaretli gösterge). Normalde nesneler ve bu nesnelere yönelik işaretçiler belleğin ayrı bölümlerinde saklanır. Ancak yeni işaretçi türleri, az veri içeren sınıfların nesneleri doğrudan işaretçide depolamasına olanak tanır. Bu adım, nesne için doğrudan bellek ayırma ihtiyacını ortadan kaldırır; yalnızca bir işaretçi ve içindeki nesneyi oluşturmanız yeterlidir. Etiketli işaretçiler yalnızca 64 bit mimaride desteklenir; bunun nedeni, 32 bitlik bir işaretçide yeterli miktarda yararlı veriyi depolamak için artık yeterli alanın olmamasıdır. Bu nedenle iOS, OS X'ten farklı olarak bu özelliği henüz desteklemiyordu. Ancak ARM64'ün gelişiyle bu durum değişiyor ve iOS bu konuda da OS X'i yakaladı.

İşaretçiler 64 bit uzunluğunda olmasına rağmen ARM64'te işaretçinin kendi adresi için yalnızca 33 bit kullanılır. Ve eğer işaretçi bitlerinin geri kalanının maskesini güvenilir bir şekilde kaldırabilirsek, bu alanı, bahsedilen etiketli işaretçilerde olduğu gibi, ek verileri depolamak için kullanabiliriz. Kavramsal olarak bu, pazarlanabilir bir özellik olmasa da Objective-C tarihindeki en büyük değişikliklerden biridir; dolayısıyla çoğu kullanıcı Apple'ın Objective-C'yi nasıl ileriye taşıdığını bilemeyecektir.

Böyle etiketli bir işaretçinin kalan alanında saklanabilecek yararlı verilere gelince, örneğin Objective-C bunu artık sözde depolamak için kullanıyor. referans sayısı (referans sayısı). Daha önce referans sayısı hafızanın farklı bir yerinde, kendisi için hazırlanmış bir hash tablosunda saklanıyordu ancak bu, çok sayıda alloc/dealloc/retain/release çağrılarının olması durumunda tüm sistemi yavaşlatabiliyordu. İş parçacığı güvenliği nedeniyle masanın kilitlenmesi gerekiyordu, bu nedenle iki iş parçacığında iki nesnenin referans sayısı aynı anda değiştirilemezdi. Bununla birlikte, bu değer sözde geri kalanın içine yeni eklenmiştir. isa göstergeler. Bu, göze çarpmayan ancak büyük bir avantaj ve gelecekte hızlanmadır. Ancak 32 bit mimaride bu asla sağlanamaz.

İlişkili nesnelerle ilgili bilgiler, nesnenin zayıf referanslı olup olmadığı, nesne için bir yıkıcı oluşturmanın gerekli olup olmadığı vb. bilgiler de nesnelere yönelik işaretçilerin kalan yerine yeniden eklenir.Bu bilgi sayesinde Objective-C çalışma zamanı, her uygulamanın hızına yansıyan çalışma zamanını temel olarak hızlandırabilir. Testlere göre bu, tüm bellek yönetimi çağrılarında yaklaşık %40-50 oranında hızlanma anlamına gelir. Sadece 64 bit işaretçilere geçerek ve bu yeni alanı kullanarak.

Sonuç

Her ne kadar rakipler 64 bit mimariye geçmenin gereksiz olduğu fikrini yaymaya çalışsalar da bunun sadece bilgisiz bir görüş olduğunu zaten bileceksiniz. Dilinizi veya uygulamalarınızı uyarlamadan 64 bit'e geçmenin aslında hiçbir anlam ifade etmediği doğrudur; hatta tüm sistemi yavaşlatır. Ancak yeni A7, yeni bir komut seti ile modern bir ARM64 kullanıyor ve Apple, tüm Objective-C dilini modernize etme ve yeni yeteneklerin avantajlarından yararlanma zahmetine girdi - dolayısıyla vaat edilen hızlanma.

Burada 64 bit mimarinin ileriye doğru doğru bir adım olmasının birçok nedeninden bahsettik. Bu, Apple'ın yalnızca tasarım, kullanıcı arayüzü ve zengin ekosistemle değil, aynı zamanda piyasadaki en modern teknolojilerle de ön planda kalmaya çalışacağı "kaputun altında" başka bir devrim.

kaynak: mikeash.com
.