이 글은 Real world technology의 원문(링크)를 전문번역한 글입니다.
사진 : iDownloadBlog
최초의 아이폰부터 애플의 아이폰과 아이패드에는 전통적으로 이매지네이션 사에서 라이선스받은 PowerVR 그래픽 유닛이 들어갔습니다. 애플은 이매지네이션 지분의 대략 10%를 보유한 대형 주주이며, 동시에 이매지네이션 매출 30%를 차지하는 초거대 고객사이기도 합니다. 하지만 우리는 애플이 ARM의 표준 CPU 코어를 라이선스해 사용하다가 자체 디자인 코어로 프로세서를 교체한 것처럼 애플이 GPU에서도 표준 PowerVR의 디자인이 아닌 자체 디자인 그래픽 유닛을 탑재했다고 생각합니다. 애플이 디자인한 그래픽 유닛은 아이폰 6에 들어간 A8칩에 최초로 탑재되었으며, 이것이 계속 발전되면서 아이폰 6s에 들어간 A9칩과 아이폰 7에 들어간 A10 Fusion칩에도 들어갔습니다.
현대적인 GPU가 화면을 그려내기 위해서는 크게 세 가지의 주요 구성요소들이 필요합니다. 첫 번째는 API 함수 처리, 삼각형 래스터화, 래스터 아웃풋을 담당하는 하드웨어 등이 포함된 고정 기능 그래픽 하드웨어입니다(역자 주 : 스케줄러, 텍스쳐 매핑 유닛, 래스터 아웃풋 유닛 등이 이에 해당). 두 번째는 쉐이더 코어입니다. 쉐이더 코어는 그래픽 유닛에서 핵심적인 역할을 하며, 프로그램 가능한 쉐이더를 실행합니다(버텍스 쉐이더, 지오메트리 쉐이더, 픽셀 쉐이더, 범용 계산 등). 마지막으로는 그래픽 드라이버가 있는데, 이는 메인 프로세서에서 실행되는 소프트웨어로 그래픽 유닛이 CPU의 지휘 아래 제대로 동작하기 위해서 반드시 필요합니다. 그래픽 드라이버는 Metal이나 OpenGL ES 등의 언어로 작성된 그래픽 응용프로그램을 고정 유닛 하드웨어와 쉐이더 유닛이 실행할 수 있는 명령어들로 변환하는 역할을 합니다. 그래픽 드라이버에서 가장 중요한 부분은 쉐이더 코어에서 실행될 수 있는 기계어(이진 코드)를 생성하는 컴파일러입니다.
아이폰 6 이전의 아이폰과 아이패드에는 고정 기능 하드웨어는 물론 쉐이더코어 역시 이매지네이션 사의 PowerVR 아키텍처를 그대로 사용했습니다. 하지만 지난 6~7년간 애플은 AMD, 인텔, 구글, 엔비디아와 같은 곳에서 그래픽 아키텍처를 설계할 줄 아는 엔지니어들과, 드라이버 및 컴파일러를 설계하는 엔지니어들을 적극적으로 고용하여 자체 디자인 GPU를 만들어냈습니다. 예를 들어, 애플 인사이더의 Mike Wuerthele에 따르면 올 초에 이매지네이션 사의 엔지니어 25명이 애플에 의해 고용되었습니다. 다만 애플이 그래픽 유닛의 모든 부분을 자체 디자인으로 바꾼 것 같지는 않습니다. 애플은 여전히 PowerVR의 고정 기능 그래픽 하드웨어를 사용하고 있는 것으로 보입니다. 하지만 여러 공개된 문서들을 볼 때, 애플이 쉐이더 코어를 보다 효율적으로 재설계한 것은 분명해 보입니다. 애플은 자체적으로 쉐이더 코어를 설계했고, 이를 제대로 사용하기 위해 자체 드라이버와 컴파일러를 개발했습니다. 정리하자면, 애플의 그래픽 유닛은 분명히 PowerVR 아키텍처와 일부 부분을 공유하지만 분명히 독자적인 아키텍처를 보유하고 있다는 것입니다. 게다가 애플의 자체 디자인 그래픽 유닛은 세계적인 수준의 성능과 전력 효율을 겸비하고 있습니다. A9 칩은 아직도 대부분의 기기들보다 강력한 그래픽 유닛을 보유하고 있으며, A10 Fusion은 이보다도 40~50% 더 강력합니다.
애플의 그래픽 유닛 아키텍처는 공개적으로 문서화되어 있지 않습니다. 다만 개발자들이 그래픽 유닛을 활용하기 위해서는 Metal이나 OpenGL 컴파일러에 대해 이해할 필요가 있습니다. 때문에 WWDC 2016에서 애플은 ‘Advanced Metal Shader Optimization’을 통해 개발자들이 어떻게 애플의 컴파일러를 사용해야 하는지에 대한 정보와 애플의 자체 디자인 그래픽 유닛 아키텍처를 유추할 수 있는 정보들을 제공했습니다. PowerVR 시리즈 6 GPU의 아키텍처 역시 그리 잘 문서화된 편은 아니지만, 이매지네이션 사는 기본적인 컴파일러에 대한 설명과 최적화 방법을 공유하고 있습니다. 이 두 문서를 비교해보면 이들 두 아키텍처가 다르다는 것을 병확히 알 수 있습니다. 특히 애플의 레지스터 파일이나 데이터 변환 함수는 성능과 전력효율 면에서 더 적합하며, 컴파일러가 특정하기 더 쉽습니다.
애플은 더 작은 레지스터를 사용함으로써 성능과 전력 효율성을 끌어올렸다.
모바일 환경에서 가장 흔히 쓰이는 OpenGL ES와 애플이 자체적으로 제작한 API인 Metal은 이미지 형성이나 데이터 계산을 위한 반정밀도(16비트) 부동소수점 연산을 지원합니다. 반정밀도 부동소수점 연산은 단정밀도(32비트) 부동소수점 연산에 비해 더 적은 전력을 소모합니다. 반정밀도 연산은 당연히 정확도를 일부 희생하지만 단정밀도 연산에 비해서 속도가 빠릅니다. 단정밀도만큼의 정확도를 필요로 하지 않는 상황에서는 속도와 전력소모를 모두 잡는 방법인 셈입니다. 실제로 모바일 환경의 그래픽 렌더링, 이미지 프로세싱, 기계학습에서는 반정밀도로도 제대로된 결과를 얻어내기에 충분합니다.
애플이 공개한 문서에 따르면 애플 그래픽 유닛의 레지스터 파일은 16비트 레지스터로 구성되어 있습니다. 반정밀도 데이터를 다루기에 이상적인 크기로 맞춰져있는 것이죠. 만약 단정밀도 연산을 수행해야 할 때는 두 개의 레지스터를 사용하게 됩니다. 결과적으로, 레지스터 파일은 16비트 변수를 32비트 변수보다 두 배 많이 저장할 수 있는 셈이죠. 애플의 엔지니어들은 반정밀도 연산에 집중해 설계된 아키텍처의 장점인 더 빠른 성능과 전력효율을 위해 반정밀도 연산을 주로 사용하기를 강력하게 권장합니다.
반대로, 이매지네이션 사의 튜닝 가이드라인에 따르면 PowerVR 시리즈 6과 7 그래픽 유닛들은 단정밀도 연산에 적합한 32비트 레지스터를 사용합니다. 시리즈 6 그래픽 유닛은 가장 흔한 FMAD, FMUL, FADD같은 연산들을 반정밀도에서 처리할 수 있긴 했지만 레지스터의 남은 부분을 0으로 채워버리는 단순한 방법으로 데이터를 처리했습니다. 물론 일부 연산자는 두 개의 16비트 데이터를 한 개의 레지스터에 담아 SIMD(Single Instruction Multiple Data)방식으로 처리할 수 있지만(시리즈 7에서는 이 방식을 지원하는 명령어가 더 확장됨) SIMD 방식 실행은 16비트 레지스터를 사용해 이뤄지는 스칼라 연산과 분명히 다릅니다. 즉 PowerVR의 경우 16비트 형식으로 데이터를 저장하면 레지스터 공간이 낭비되기 때문에 반정밀도 데이터를 사용하더라도 단정밀도에 비해 자동적으로 두 배 많은 데이터를 저장하지는 않습니다. 물론 16비트 데이터를 사용하면 메모리 대역폭과 에너지 소비량이 줄어들긴 하지만, 애플의 방식처럼 근본적인 증가를 가져오지는 못합니다.
프로그래머가 반정밀도 연산을 쉽게 사용할 수 있도록 해주는 ‘자유로운 데이터 유형 전환’
반정밀도 연산을 사용할 때 문제가 되는 부분은 대부분의 계산은 반정밀도 연산으로도 충분한 정밀도를 얻을 수 있지만, 일부 연산은 더 높은 정밀도를 요구할 때가 있다는 것입니다. 예를 들어 큰 픽셀 블럭의 색상을 계산한 뒤 그 평균을 계산하는 쉐이더는 각 개별 픽셀에 대해서는 반정밀도 연산으로도 충분하지만 이를 합산해서 평균을 계산할 때는 단정밀도가 필요할 수도 있습니다. 만약 이런 연산에서 픽셀 데이터를 16비트에서 32비트로 변환하는 과정이 너무 낭비가 심하다면 애초에 반정밀도 연산을 사용하지 않는 편이 더 나을 수도 있습니다.
애플의 그래픽 유닛은 서로 다른 데이터 유형간에 탁월한 변환기능을 제공합니다. 덕분에 여러 정밀도를 혼합할 필요가 있는 연산에서 각각의 데이터 유형에 맞는 연산을 통해 최적의 성능을 제공할 수 있습니다. 애플의 발표에 따르면 이런 데이터 전환 과정에서 낭비는 없습니다. 이를 가능하게 하는 것은 데이터패스 상에 데이터 유형을 변환시키는 전용 하드웨어 회로가 추가되었기에 가능합니다. 물론 이런 방법을 채용하면 하드웨어가 더 복잡해지지만, 덕분에 컴파일러를 대폭 간소화하고 프로그래머가 훌륭한 소프트웨어를 작성하는 것을 훨씬 쉽게 만듭니다.
물론 PowerVR 시리즈 6, 7 역시 다른 정밀도 데이터 유형간에 변환을 제공하지만 확실히 그에 상응하는 대가를 요구합니다. 이매지네이션사의 최적화 가이드에 따르면 데이터 변환에 발생하는 비용이 명시되어 있으며(예 : 높은 정밀도에서 낮은 정밀도로 혹은 반대로 낮은 정밀도에서 높은 정밀도로의 변환), 개발자는 최적의 성능을 위해서 변환 횟수를 최소화하는 프로그램을 작성해야 합니다.
기술적인 차이가 애플이 자체 제작 그래픽 유닛을 사용했음을 밝혀냈다.
애플의 그래픽 유닛과 PowerVR의 그래픽 유닛의 레지스터 파일과 데이터 형식의 전환방식을 비교해보면 그 차이는 엄청나게 큽니다. 레지스터 파일 구성은 쉐이더 코어의 가장 기본적인 요소이며 쉐이더 코어의 명령어 셋 아키텍처(ISA)부터 실행 유닛 및 스케줄링 알고리즘까지 거의 모든 것의 설계에 영향을 미칩니다. 한 예시로, 레지스터 크기는 쉐이더 코어 내부에서 대부분을 차지하는 데이터패스의 물리적 배선 설계를 결정합니다. 데이터 변환은 쉐이더 코어의 구조 자체에는 큰 영향을 주지는 않지만 컴파일러와 프로그램을 작성하는 개발자에게 큰 영향을 줍니다. PowerVR 시리즈 7 그래픽 유닛은 많은 면에서 이전 세대인 시리즈 6과 상당히 유사하며 중요한 것은 시리즈 7 역시 여전히 32비트 레지스터를 사용한다는 점입니다. 이런 차이를 살펴보고 내릴 수 있는 합리적인 결론은 애플이 직접 설계한 쉐이더 코어를 이용한 그래픽 유닛을 사용한다는 것입니다. 당연히 자체적으로 개발한 쉐이더 코어를 사용하기 위해서는 그래픽 드라이버와 컴파일러 역시 직접 개발해야 합니다.
심지어 일부 벤치마크는 이런 차이를 잡아내기도 했습니다. 업데이트되기 전의 GFXBench 결과에서 아이폰 7이 Apple G7 GPU를 사용하고 있다고 표시했습니다.
이후에 GFXBench의 데이터베이스가 수정되면서 G9에 대한 언급이 삭제되었습니다. 그러나 삭제되기 전의 데이터가 한국의 웹 사이트인 Back to the Mac에 보존되어 있습니다(역자 주 : 이 사진의 2차 출처는 이 블로그와 Dr.Mola에 게시된 ‘아이폰 7 자세히 알아보기 : 성능’편이며, 1차 출처는 클리앙 새로운소식 게시판의 스퀴니님의 글입니다).
애플의 그래픽 유닛과 PowerVR의 그래픽 유닛 사이에는 아마 같은 테스트를 실행시킴으로써 찾아낼 수 있는 차이점이 더 있을 것으로 보입니다. 거기에 Metal에서는 PowerVR 그래픽 유닛에서는 사용할 수 없는 고유한 기능이 있을 가능성도 있습니다. 그러나 차이점들 중 일부는 하드웨어적인 것과는 관계가 없을 수도 있습니다. 예를 들어 애플의 그래픽 유닛은 OpelGL ES 3.0까지만 지원하는 반면에 PowerVR의 그래픽 유닛들은 좀 더 최신 버전의 OpenGL ES를 지원하는 것은 하드웨어적인 차이라기보다는 소프트웨어적인 차이일 가능성이 높습니다.
자체 디자인이 가져다주는 전략적 이점
애플의 이런 수직적 통합은 소비자 전자제품 분야에서 독보적인 것입니다. 특히 아이폰과 아이패드의 경우 애플은 투입되는 프로세서의 기본적인 회로 설계에서부터 운영체제와 고객들이 직접 사용하는 자체 앱들까지(지도앱이나 메시지, 카메라 앱 등) 모든 것을 통제하고 있습니다. 이러한 수직적 통합을 통해 애플의 하드웨어와 소프트웨어 팀은 시스템 수준의 트레이드오프를 통해 다른 경쟁사들이 쉽게 따라오기 힘든 차별점을 만들어낼 수 있습니다.
최초의 아이폰과 지금의 아이폰을 비교해보면 애플이 추구하는 바는 명확합니다. 애플은 시간이 지나면 지날수록 플랫폼과 생태계에 대한 장악력을 높여갔습니다. 최초의 아이폰은 표준 ARM 코어를 사용한 프로세서를 삼성에 맡겨 설계하였지만, 지금은 ARMv8 기반의 독자 설계 코어를 기반으로한 프로세서를 사용하고 있으며, 이는 경쟁사보다 뛰어난 성능을 제공합니다. 비슷하게, 애플은 Anobit을 인수하고 Anobit의 기술과 엔지니어들을 이용해 자체 제작한 플래시 메모리 컨트롤러를 사용해 아이폰과 아이패드에 들어갈 저장장치를 구성했습니다. 애플에게 그래픽 유닛을 자체제작하는 것은 이런 경향성의 다음 단계로 이해될 수 있습니다.
자체적으로 디자인한 그래픽 유닛이 가져다주는 가장 큰 이점은 ARM이나 이매지네이션, 혹은 퀄컴으로부터 라이선스를 받아 사용하는 다른 경쟁사들에 비해 한발짝 앞서나갈 수 있다는 점입니다. 우수한 그래픽 성능은 게이밍 환경에서 더 나은 사용자 경험으로 직결되며, 높은 전력효율은 더 긴 배터리 시간을 얻을 수 있게 해줍니다. 거기에 더해 이미지 처리나 머신 러닝 등을 활용하는 응용프로그램에서도 이런 이득을 가져다줍니다.
애플의 Metal Performance Shaders 라이브러리는 그래픽 유닛에서 실행되는 수십개의 고도로 최적화된 쉐이더가 포함되어 있어 개발자들에게 다양한 선택지를 제공합니다. 이러한 쉐이더에는 컨볼루션, 풀링, 정제된 선형 유닛 레이어 등의 분류를 위한 신경망이 포함됩니다. 또한 라이브러리는 선형 샘플링 알고리즘보다 더 나은 품질의 이미지를 제공하는 Lanczos 리샘플링 알고리즘 등을 포함하고 있어, 이를 이미지 프로세싱에 사용할 수 있습니다. 예를 들어 인스타그램 앱은 애플의 GPU를 사용하여 로컬 톤 매핑과 대비 향상 등의 효과를 적용합니다. 애플의 카메라 앱 역시 GPU를 사용하여 다양한 이미지 효과를 냅니다. 이미지 처리나 신경망 기술의 경우 반정밀도 연산으로도 충분한 정확한 결과를 얻어낼 수 있으며, 이런 경우에 애플의 자체 디자인 그래픽 유닛은 이런 경우에 PowerVR의 쉐이더 코어보다 더 빠른 성능과 효율성을 제공합니다.
두 번째 이점은 애플이 경쟁사에게 이득을 줄 필요 없이 기능을 만들어내고, 버그를 수정할 수 있다는 것입니다. 만약 타사의 표준 IP를 사용하면 애플이 버그를 수정하거나 새로운 기능을 요청하면 삼성, 미디어텍, 이매지네이션의 고객사들 역시 곧 이런 이득을 볼 수 있습니다.
세 번째 이득은 원하는 시점에 원하는 기능을 추가할 수 있다는 것입니다. 아이폰에 사용되는 애플의 A 시리즈 프로세서들은 매년 공격적인 성능 향상을 이끌어가고 있습니다. 아이폰은 프리미엄 제품이기 때문에 애플은 고객들에게 뛰어난 성능을 제공해야 하며, 매 세대간에도 충분한 성능 차이를 주어 업그레이드 수요를 촉진해야 한다. 결과적으로 애플은 대개 위험을 수반하는 새로운 공정 기술(예 : TSMC의 10nm 공정)의 주요 고객입니다. 자사 디자인 코어를 사용하면 이매지네이션의 표준 코어를 쓸 때보다 더 많은 자금과 인력이 필요하겠지만, 원하는 시기에 원하는 성능을 만들어내기 위해 시간과 능력을 투자할 수 있습니다.
애플은 설계, 품질 검증, 대량생산과 소프트웨어 생태계를 조합시켜서 고객들에게 짧은 시간에 수백만, 수천만대의 스마트폰과 태블릿을 전달해야 합니다. 그렇기에 출시기간 전의 몇 달은 버그를 잡아내고, 열심히 소프트웨어, 하드웨어를 업데이트합니다. 이제는 그래픽 유닛의 설계를 직접 통제할 수 있기때문에 제품 설계에 외부 종속성이 적어지고, 이는 애플이 제때 원하는 성능의 제품을 만들어낼 수 있는데 도움을 줍니다.
예시를 들어볼까요. 애플의 엔지니어가 쉐이더 코어의 논리 설계에서 버그를 발견했다고 가정합시다. 만약 애플이 자사 디자인 쉐이더 코어를 사용하는 상황에서는 이건 그날 바로 수정에 들어갈 수 있는 문제입니다. 하지만 애플이 타사의 IP를 사용한다면 이를 IP 공급자에게 전달하고, 공급자가 수정을 해서 넘겨주길 기다려야 합니다. 또 보통 이런 경우에는 같은 IP를 사용하는 타 고객사와도 일정 조율이 필요할 수 있습니다. 삼성의 엑시노스 5410이 표준 디자인을 활용했을 때 발생하는 위험성을 잘 보여주는 사례인데, 당시 최초의 계획은 Cortex-A15와 A7이 동시에 동작하는 big.LITTLE 구조였지만, 일관성 문제로 결국 클러스터 전환 방식으로 작동할 수밖에 없었습니다. 만약 삼성이 코어들과 이들이 협업하는 방식을 직접 설계했다면, 좀 더 유연하게 이 사태에 대처할 수 있었을 것입니다. 이는 한 회사 내에서의 의사소통이 제3자와의 의사소통보다 더 간편하고 쉽기 때문입니다.
직접 그래픽 유닛을 설계하는 것의 마지막 이점은 애플이 공급업체에 대한 의존도를 낮출 수 있다는 점입니다. 이는 애플의 협상력을 높여줄 수 있으며, 리스크 관리에 유리합니다. 애플은 전통적으로 하나의 공급업체에만 의존하게 되는 상황을 매우 꺼려왔습니다. 항상 내부에서나, 외부의 다른 공급업체를 통해 한 업체에 대한 의존을 줄여나가는 방향으로 나아가는 것이 원칙입니다. 예를 들어, 애플은 꽤나 오랜 기간동안 퀄컴에 의존해 아이폰의 LTE 모뎀을 사용했습니다. 하지만 인텔이 경쟁력있는 LTE 모뎀을 개발하자마자 애플은 대부분의 GSM 사업자에 인텔 모뎀이 들어간 아이폰을 배포했습니다. 장기적으로 애플의 이런 접근은 비용을 낮추고, 새로운 기회를 제공하는 등의 이점이 있습니다.
애플의 자체 설계 GPU는 미래에 애플이 전체 그래픽 유닛을 자사의 디자인으로 교체할 수도 있음을 의미합니다. 이미 애플은 A8, A9, A10 Fusion의 그래픽 유닛의 상당부분을 구현한 GPU 디자인 팀과 드라이버 팀을 가지고 있습니다. 만약 이매지네이션 사가 다른 회사에 의해 인수되거나 기술적으로 뒤쳐지게 된다면, 애플은 간단히 나머지 부분을 자사의 고정 기능 하드웨어로 대체할 수 있을 것입니다.
애플의 다음 행보를 예측해보자
애플은 수년동안 그래픽 유닛 설계역량을 가진 엔지니어들을 모집해왔으며, 아이폰 6, 6s, 7에 투입되는 A8, A9, A10 Fusion에 들어간 그래픽 유닛을 직접 설계했습니다. 물론 여전히 애플의 그래픽 유닛은 PowerVR의 고정 기능 하드웨어를 사용하고 있지만, 드러난 문서들을 살펴봤을 때 애플 그래픽 유닛의 쉐이더 코어는 이매지네이션 사의 PowerVR과 구조적으로 매우 다르다는 것은 분명합니다. 이것은 애플이 자사의 그래픽 유닛용의 Metal, OpenGL ES 컴파일러를 작성했으며, 이를 포함하는 그래픽 드라이버를 작성했다는 것을 알려줍니다.
애플의 발자취를 감안해보면 직접 그래픽 유닛의 일부를 설계한 것은 놀라운 일이 아닙니다. 이것이 가져오는 명백한 성능상의 이점은 이미 가시적으로 느낄 수 있습니다. 생태계에 대한 장악력 강화, 원하는 시점에 원하는 기능을 추가할 수 있다는 점과 쉽게 버그들을 수정할 수 있는 등의 다른 이점들은 외부로 드러나지는 않지만 애플에게는 매우 중요한 것들입니다.
앞으로 애플이 선택할 수 있는 길은 대략 세 가지 정도로 나눠볼 수 있겠습니다. 첫 번째는 현상 유지입니다. 지금처럼 이매지네이션 사가 제공하는 고정 기능 하드웨어를 라이선스 받고, 쉐이더 코어 등 나머지 부분을 직접 설계하여 합치는 방식입니다. 이 시나리오대로라면 애플은 계속해서 PowerVR의 라이선스를 받을 것이지만, 내부적으로는 더 저렴한 가격에 라이선스를 받기위해 협상을 진행할 것입니다. 두번째 선택지는 이매지네이션 사를 인수하는 것입니다. 다만 MIPS 아키텍처 등의 애플에 별로 필요하지 않은 부분이 있다는 점과 2016년 초에 인수할 기회를 한번 지나치기는 했지만, 이매지네이션 사를 인수하게되면 GPU 전체에 대한 즉각적인 설계능력과 인력을 확보할 수 있을 것입니다. 마지막 길은 애플이 스스로 더 잘할 수 있다는 결정을 내렸을 때 직접 GPU 전체를 설계하는 것입니다. 애플이 어떤 길을 선택하든 지금까지 애플이 보여온 행보를 봤을 때 애플은 새로운 영역에서 세계적인 수준의 전문 기술을 개발하는 데 탁월한 회사로 보입니다.
참고문헌
[1] Alex Kan and Fiona, Advanced Metal Shader Optimization. WWDC 2016. http://ift.tt/23ek1Cn and http://ift.tt/2c9vLCY
[2] PowerVR Series6 Compiler Instruction Set Reference. March 17, 2016. http://ift.tt/2ga1qIn
[3] PowerVR Performance Recommendations. March 17, 2016. http://ift.tt/2fTmJLu
[4] Metal Performance Shaders Framework. http://ift.tt/2g9YGe8
필자: Jin Hyeop Lee (홈페이지) 생명과학과 컴퓨터 공학의 교차점에서 빛을 발견하고 싶습니다. Dr.Mola의 편집장으로 활동하고 있습니다. |
참조
• A Look Inside Apple’s Custom GPU for the iPhone
관련 글
• [연작] 아이폰 7 자세히 알아보기 : 성능
from Back to the Mac http://ift.tt/2gcmXOL
via IFTTT