광고 닫기

마이크 애쉬 자신의 블로그에 헌정 iPhone 64S에서 5비트 아키텍처로 전환하는 데 따른 실질적인 의미. 이 기사는 그의 연구 결과를 바탕으로 작성되었습니다.

이 텍스트를 쓴 이유는 주로 5비트 ARM 프로세서를 탑재한 새로운 iPhone 64s가 실제로 사용자와 시장에 어떤 의미가 있는지에 대해 잘못된 정보가 많이 퍼지기 때문입니다. 여기에서는 개발자를 위한 이러한 전환의 성능, 기능 및 영향에 대한 객관적인 정보를 제공하려고 노력할 것입니다.

"64비트"

"X비트" 레이블이 참조할 수 있는 프로세서의 두 부분, 즉 정수 레지스터의 너비와 포인터의 너비가 있습니다. 다행스럽게도 대부분의 최신 프로세서에서는 이러한 너비가 동일하므로 A7의 경우 이는 64비트 정수 레지스터와 64비트 포인터를 의미합니다.

그러나 "64비트"가 무엇을 의미하지 않는지 지적하는 것도 마찬가지로 중요합니다. RAM 물리적 주소 크기. RAM과 통신하는 비트 수(따라서 장치가 지원할 수 있는 RAM의 양)는 CPU 비트 수와 관련이 없습니다. ARM 프로세서에는 26비트에서 40비트 사이의 주소가 있으며 시스템의 나머지 부분과 독립적으로 변경될 수 있습니다.

  • 데이터 버스 크기. RAM이나 버퍼 메모리에서 수신된 데이터의 양도 마찬가지로 이 요소와 무관합니다. 개별 프로세서 명령어는 서로 다른 양의 데이터를 요청할 수 있지만 청크 단위로 전송되거나 메모리에서 필요한 것보다 더 많이 수신됩니다. 이는 데이터 퀀텀의 크기에 따라 다릅니다. iPhone 5는 이미 64비트 퀀텀(32비트 프로세서 포함)으로 메모리에서 데이터를 수신하고 있으며 최대 192비트 크기까지 사용할 수 있습니다.
  • 부동 소수점과 관련된 모든 것. 이러한 레지스터(FPU)의 크기는 프로세서의 내부 작동과 무관합니다. ARM은 ARM64(64비트 ARM 프로세서) 이전부터 64비트 FPU를 사용해 왔습니다.

일반적인 장점과 단점

동일한 32비트 아키텍처와 64비트 아키텍처를 비교해 보면 일반적으로 그다지 다르지 않습니다. 이는 Apple이 모바일 장치에서도 64비트로 전환하는 이유를 찾는 대중의 일반적인 혼란의 이유 중 하나입니다. 그러나 이 모든 것은 A7(ARM64) 프로세서의 특정 매개변수와 Apple이 이를 사용하는 방식에서 비롯되며 프로세서에 64비트 아키텍처가 있다는 사실뿐만 아니라

그러나 이 두 아키텍처의 차이점을 계속 살펴보면 몇 가지 차이점을 발견할 수 있습니다. 분명한 점은 64비트 정수 레지스터가 64비트 정수를 더 효율적으로 처리할 수 있다는 것입니다. 이전에도 32비트 프로세서에서 작업할 수 있었지만 이는 일반적으로 32비트 긴 조각으로 나누어 계산을 느리게 만드는 것을 의미했습니다. 따라서 64비트 프로세서는 일반적으로 64비트 유형만큼 빠르게 32비트 유형을 계산할 수 있습니다. 이는 일반적으로 64비트 유형을 사용하는 응용 프로그램이 64비트 프로세서에서 훨씬 빠르게 실행될 수 있음을 의미합니다.

64비트는 프로세서가 사용할 수 있는 총 RAM 용량에 영향을 미치지 않지만 하나의 프로그램에서 대용량 RAM을 사용하여 작업하는 것을 더 쉽게 만들 수 있습니다. 32비트 프로세서에서 실행되는 단일 프로그램의 주소 공간은 약 4GB에 불과합니다. 운영 체제와 표준 라이브러리가 차지하는 공간을 고려하면 프로그램에서 응용 프로그램용으로 1~3GB 정도의 공간이 남게 됩니다. 그러나 32비트 시스템에 4GB 이상의 RAM이 있는 경우 해당 메모리를 사용하는 것이 좀 더 복잡합니다. 우리는 운영 체제가 프로그램을 위해 이러한 더 큰 메모리 덩어리를 매핑하도록 강제해야 합니다(메모리 가상화). 또는 프로그램을 여러 프로세스로 분할할 수 있습니다(각 프로세스는 이론적으로 직접 주소 지정에 사용할 수 있는 4GB의 메모리를 갖습니다).

그러나 이러한 "해킹"은 너무 어렵고 느리기 때문에 최소한의 응용 프로그램에서만 사용됩니다. 실제로 32비트 프로세서에서 각 프로그램은 1~3GB의 메모리만 사용하며 더 많은 RAM을 사용하여 동시에 여러 프로그램을 실행하거나 이 메모리를 버퍼(캐싱)로 사용할 수 있습니다. 이러한 용도는 실용적이지만 우리는 모든 프로그램이 4GB보다 큰 메모리 덩어리를 쉽게 사용할 수 있기를 바랍니다.

이제 우리는 4GB 이상의 메모리가 없으면 64비트 아키텍처가 쓸모가 없다는 빈번한(실제로는 잘못된) 주장에 도달했습니다. 메모리가 적은 시스템에서도 더 큰 주소 공간이 유용합니다. 메모리 매핑 파일은 전체 파일을 메모리에 로드할 필요 없이 파일 내용의 일부를 프로세스의 메모리에 논리적으로 연결하는 편리한 도구입니다. 따라서 시스템은 예를 들어 RAM 용량보다 몇 배 더 큰 대용량 파일을 점진적으로 처리할 수 있습니다. 32비트 시스템에서는 이러한 대용량 파일을 안정적으로 메모리 매핑할 수 없지만 64비트 시스템에서는 훨씬 더 큰 주소 공간 덕분에 식은 죽 먹기입니다.

그러나 포인터의 크기가 클수록 한 가지 큰 단점도 발생합니다. 그렇지 않으면 동일한 프로그램에 64비트 프로세서에서 더 많은 메모리가 필요합니다(이러한 더 큰 포인터는 어딘가에 저장되어야 함). 포인터는 프로그램의 빈번한 부분이기 때문에 이러한 차이는 캐시에 부담을 줄 수 있으며 결과적으로 전체 시스템 실행 속도를 느리게 만듭니다. 따라서 관점에서 볼 때 프로세서 아키텍처를 64비트로 변경하면 실제로 전체 시스템 속도가 느려질 수 있습니다. 따라서 이 요소는 다른 곳에서 더 많은 최적화를 통해 균형을 이루어야 합니다.

ARM64

새로운 iPhone 7s를 구동하는 64비트 프로세서인 A5은 레지스터가 더 넓은 일반 ARM 프로세서가 아닙니다. ARM64에는 이전 32비트 버전에 비해 주요 개선 사항이 포함되어 있습니다.

애플 A7 프로세서.

레지스트리

ARM64는 32비트 ARM보다 두 배 많은 정수 레지스터를 보유합니다. (레지스터 수와 너비를 혼동하지 않도록 주의하십시오. "64비트" 섹션에서 너비에 대해 이야기했습니다. 따라서 ARM64는 두 배의 넓은 레지스터와 두 배의 더 많은 레지스터를 갖습니다. 레지스터). 32비트 ARM에는 16개의 정수 레지스터가 있습니다. 하나의 프로그램 카운터(PC - 현재 명령어의 번호 포함), 스택 포인터(진행 중인 함수에 대한 포인터), 링크 레지스터(종료 후 반환에 대한 포인터) 기능 중), 나머지 13개는 응용 프로그램용입니다. 그러나 ARM64에는 32개의 제로 레지스터, 링크 레지스터, 프레임 포인터(스택 포인터와 유사) 및 미래를 위해 예약된 하나를 포함하여 28개의 정수 레지스터가 있습니다. 이로 인해 애플리케이션 사용을 위한 32개의 레지스터가 남게 되는데, 이는 64비트 ARM의 두 배 이상입니다. 동시에 ARM16는 부동 소수점 수(FPU) 레지스터 수를 32개에서 128개의 XNUMX비트 레지스터로 두 배 늘렸습니다.

그런데 레지스터 수가 왜 그렇게 중요한가요? 메모리는 일반적으로 CPU 계산보다 느리며 읽기/쓰기에는 매우 오랜 시간이 걸릴 수 있습니다. 이로 인해 빠른 프로세서는 계속해서 메모리를 기다려야 하며 시스템의 자연스러운 속도 제한에 도달하게 됩니다. 프로세서는 버퍼 계층을 사용하여 이러한 장애를 숨기려고 하지만 가장 빠른 버퍼(L1)라도 여전히 프로세서의 계산보다 느립니다. 그러나 레지스터는 프로세서에 직접 있는 메모리 셀이며 읽기/쓰기 속도가 프로세서 속도를 늦추지 않을 만큼 빠릅니다. 레지스터 수는 실제로 프로세서 계산을 위한 가장 빠른 메모리 양을 의미하며 이는 전체 시스템 속도에 큰 영향을 미칩니다.

동시에 이 속도에는 언어가 이러한 레지스터를 사용할 수 있고 일반 애플리케이션(느린) 메모리에 모든 것을 저장할 필요가 없도록 컴파일러의 우수한 최적화 지원이 필요합니다.

명령어 세트

ARM64는 또한 명령어 세트에 큰 변화를 가져왔습니다. 명령어 세트는 프로세서가 수행할 수 있는 원자적 연산 세트입니다(예: 'ADD 레지스터1 레지스터2'는 두 레지스터에 숫자를 추가합니다). 개별 언어에서 사용할 수 있는 기능은 이러한 명령어로 구성됩니다. 더 복잡한 함수는 더 많은 명령을 실행해야 하므로 속도가 느려질 수 있습니다.

ARM64의 새로운 기능은 AES 암호화, SHA-1 및 SHA-256 해시 기능에 대한 지침입니다. 따라서 복잡한 구현 대신 언어만이 이 명령을 호출합니다. 이는 이러한 함수의 계산 속도를 크게 높이고 응용 프로그램에 보안을 추가할 수 있기를 바랍니다. 예: 새로운 Touch ID는 또한 이러한 지침을 암호화에 사용하여 실제 속도와 보안을 허용합니다(이론적으로 공격자는 데이터에 액세스하려면 프로세서 자체를 수정해야 합니다. 작은 크기를 감안할 때 비실용적이라고 말할 수 있습니다).

32비트와의 호환성

A7은 에뮬레이션 없이 32비트 모드에서 완전히 실행될 수 있다는 점을 언급하는 것이 중요합니다. 이는 새로운 iPhone 5s가 32비트 ARM에서 컴파일된 애플리케이션을 속도 저하 없이 실행할 수 있다는 것을 의미합니다. 그러나 새로운 ARM64 기능을 사용할 수 없으므로 훨씬 더 빠르게 실행되는 A7 전용 특수 빌드를 만드는 것이 항상 가치가 있습니다.

런타임 변경

런타임은 프로그래밍 언어에 기능을 추가하는 코드로, 애플리케이션이 실행되는 동안 번역이 끝날 때까지 사용할 수 있습니다. 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 호출이 발생하는 경우 전체 시스템 속도가 느려질 수 있습니다. 스레드 안전성 때문에 테이블을 잠가야 했기 때문에 두 스레드에 있는 두 개체의 참조 횟수를 동시에 변경할 수 없었습니다. 그러나 이 값은 소위 나머지 부분에 새로 삽입됩니다. ISA 지표. 이것은 눈에 띄지 않지만 미래에 큰 이점이자 가속화가 될 것입니다. 그러나 이는 32비트 아키텍처에서는 결코 달성될 수 없습니다.

연관된 객체에 대한 정보, 객체가 약하게 참조되는지 여부, 객체에 대한 소멸자를 생성해야 하는지 여부 등도 객체를 가리키는 포인터의 남은 위치에 새로 삽입됩니다. 런타임은 기본적으로 런타임 속도를 높일 수 있으며 이는 각 애플리케이션의 속도에 반영됩니다. 테스트 결과, 이는 모든 메모리 관리 호출의 속도가 약 40-50% 향상되었음을 의미합니다. 64비트 포인터로 전환하고 이 새로운 공간을 사용하면 됩니다.

záver

경쟁사에서는 64비트 아키텍처로의 전환이 불필요하다는 생각을 퍼뜨리려고 노력하겠지만 이는 매우 무지한 의견일 뿐이라는 점을 이미 알고 계실 것입니다. 언어나 응용 프로그램을 조정하지 않고 64비트로 전환하는 것은 실제로 아무 의미가 없으며 전체 시스템 속도를 저하시키기도 한다는 것은 사실입니다. 그러나 새로운 A7은 새로운 명령어 세트와 함께 최신 ARM64를 사용하며 Apple은 전체 Objective-C 언어를 현대화하고 새로운 기능을 활용하기 위해 수고를 겪었습니다. 따라서 속도 향상이 약속되었습니다.

여기서 우리는 64비트 아키텍처가 올바른 발전인 이유에 대해 여러 가지를 언급했습니다. 이는 "내부"의 또 다른 혁명입니다. 덕분에 Apple은 디자인, 사용자 인터페이스 및 풍부한 생태계뿐만 아니라 주로 시장에서 가장 현대적인 기술을 통해 선두를 유지하려고 노력할 것입니다.

드로이 : mikeash.com
.