※ 이 글은 오가사와라 히로유키(小笠原博之) 씨가 블로그에 적은 글을 번역한 것입니다. 사정에 따라 예고없이 삭제될 수 있으므로 양해부탁드립니다.

Nexus 10 CPU Cortex-A15의 부동소수점 연산속도

(원문 : 3DMark Android 版の結果から)

Nexus10을 입수하여 ARMv7A의 새로운 CPU core 3종류가 갖춰졌기에 Apple Swift, Qualcomm Krait, ARM Cortex-A15를 비교해보겠습니다. 동작 클럭이 가장 높다는 것도 있지만, Cortex-A15의 동작은 Swift보다도 고속이었습니다.

                (1)     (2)     (3)     (4)     (5)     (6)     (7)
               iPad3   Nexus7  EVO 3D iPhone5  iPad4   HTL21  Nexus10
                A5X    Tegra3 MSM8660   A6      A6X   APQ8064 Exynos5D
               ARM A9  ARM A9 Scorpion Swift   Swift   Krait  ARM A15
               1.0GHz  1.2GHz  1.2GHz  1.3GHz? 1.4GHz? 1.5GHz  1.7GHz
               VFPv3   VFPv3   VFPv3   VFPv4   VFPv4   VFPv4   VFPv4
----------------------------------------------------------------------
a:m44 vmla_AQ  4.784   3.959   2.859   1.293   1.204   1.337   0.619
b:m44 vmla_BQ  2.408   2.002   1.136   1.359   1.266   0.931   0.569
c:m44 vmla_AD  4.781   3.980   3.053   1.669   1.554   1.889   0.557
d:m44 vmla_BD  2.406   2.003   1.434   1.329   1.238   1.532   0.568
A:m44 vfma_AQ  -----   -----   -----   1.632   1.519   1.882   0.746
B:m44 vfma_BQ  -----   -----   -----   1.594   1.484   0.695   0.840
e:fadds     A  4.010   3.343   3.383   3.090   2.878   2.774   2.383
f:fmuls     A  4.010   3.337   3.383   3.167   2.953   2.747   2.369
g:fmacs     A  4.012   3.337   3.379   6.180   5.757   5.574   2.956
h:vfma.f32  A  -----   -----   -----   6.180   5.756   2.747   2.957
i:vadd.f32 DA  4.111   3.426   3.377   3.091   2.877   2.762   1.183
j:vmul.f32 DA  4.110   3.421   3.383   3.168   2.950   2.746   1.478
k:vmla.f32 DA  4.512   3.792   3.380   3.166   2.951   5.604   1.480
l:vadd.f32 QA  8.023   6.688   3.377   3.090   2.878   2.801   2.365
m:vmul.f32 QA  8.022   6.681   3.384   3.166   2.952   2.761   2.364
n:vmla.f32 QA  8.025   6.681   3.380   3.167   2.950   5.606   2.367
o:vfma.f32 DA  -----   -----   -----   3.167   2.494   2.833   1.479
p:fadds     B  4.014   3.347   5.917   6.181   5.756   3.467   2.956
q:fmuls     B  5.013   4.195   5.917   6.180   5.756   3.556   3.558
r:fmacs     B  8.023   6.688   8.451  12.361  11.514   6.298   5.912
s:vfma.f32  B  -----   -----   -----  12.363  11.513   3.430   5.910
t:vadd.f32 DB  4.113   3.421   5.916   3.090   2.881   3.529   2.958
u:vmul.f32 DB  4.118   3.422   5.073   3.169   2.949   3.447   2.364
v:vmla.f32 DB  9.027   7.561   8.451   6.180   5.755   6.293   4.728
w:vadd.f32 QB  8.021   6.705   5.916   3.090   2.879   3.457   2.961
x:vmul.f32 QB  8.029   6.683   5.074   3.167   2.950   3.428   2.363
y:vmla.f32 QB  9.026   7.532   8.457   6.179   5.759   6.372   4.729
z:vfma.f32 DB  -----   -----   -----   6.181   5.755   3.437   4.730
----------------------------------------------------------------------
↑수치는 실행시간(초) 수치가 작을 수록 빠름

(1)=Apple iPad 3          A5X      Cortex-A9  x2 1.0GHz  VFPv3 i6.1
(2)=ASUS Nexus 7          Tegra 3  Cortex-A9  x4 1.2GHz  VFPv3 A4.2
(3)=HTC EVO 3D ISW12HT    MSM8660  Scorpion   x2 1.2GHz  VFPv3 A4.0
(4)=Apple iPhone 5        A6       Swift      x2 1.3GHz? VFPv4 i6.1
(5)=Apple iPad 4          A6X      Swift      x2 1.4GHz? VFPv4 i6.1
(6)=HTC J butterfly HTL21 APQ8064  Krait      x4 1.5GHz  VFPv4 A4.1
(7)=Samsung Nexus 10      Exynos5D Cortex-A15 x2 1.7GHz  VFPv4 A4.2

테스트 항목에 대한 자세한 내용은 아래를 참조(a:~z:)

iPad4/EVO 3D/Butterfly는 다시 측정해서 예전보다 수치가 올라가있습니다.

a:~d: 를 보면, 1.7GHz의 Cortex-A15는 Swift의 2배 가까운 수치입니다. 명령 단독으로도 효율이 올라가, Krait와 비교해도 64bit D(float2) 명령의 속도차는 클럭의 차이 이상입니다.

64bit D(float2)와 128bit Q(float4)에 차이가 있는 것을 보면, 아마도 Cortex-A15은 64bit 단위의 ALU가 2 파이프 존재하고 있는게 아닐까 합니다. 128bit Q(float4)의 속도는 Swift/Krait와 큰 차이가 없으므로 연산능력의 피크 속도 자체는 Swift/Krait와 동일한 듯 합니다. D, Q의 차가 없는 Scorpion/Swift/Krait는 128bit 단위라 생각할 수 있습니다.

(1)~(3) Cortex-A9/Scorpion의 a:~d:에서는 AQ/AD와 BQ/BD의 결과에 큰 차이가 납니다. 이것이 CPU 세대간의 차이로, (4)~(7)의 Swift/Krait/Cortex-A15에서는 명령순에 의존하지 않고 일정한 효율로 실행되고 있음을 알 수 있습니다.

이전에도 적었던 대로 Swift는 스칼라의 덧곱셈[각주:1] 명령만 느립니다. NEON의 벡터에서는 덧곱셈이라도 딱히 속도가 떨어지진 않으므로, 무언가 구조적인 이유에 의한 것이라 생각됩니다.

마찬가지로 Krait에도 귀찮은 패턴이 있습니다. ARM에서는 VFPv4 이후 FMA(Fused Multiply add) 명령이 추가되었습니다. Krait는 vfma(FMA)보다도 종래의 vmla 명령이 2배 가까이 느립니다. 반올림처리할 vmul[각주:2] + vadd[각주:3]로 전개될 가능성이 있습니다.

Krait 최적화

a:~d: 의 연산은 vmla[각주:4]를 사용하지만, Krait에서는 이 명령이 느립니다. vfma[각주:5]로 바꿈으로서 고속화할 가능성이 있기에 시험해봤습니다.

// A: mat44 neon_AQ의 vfma화

   vmul.f32  q8, q0, d8[0]
   vlma.f32  q8, q1, d8[1]
   vlma.f32  q8, q2, d9[0]
   vlma.f32  q8, q3, d9[1]
    :
↓
   vmul.f32  q8, q0, d8[0]
   vdup.f32  q9,  d8[1]
   vfma.f32  q8, q1, q9
   vdup.f32  q10, d9[0]
   vfma.f32  q8, q2, q10
   vdup.f32  q11, d9[1]
   vfma.f32  q8, q3, q11
    :


// B: mat44 neon_AQ의 vfma화

   vmul.f32  q8,  q0, d8[0]
   vmul.f32  q9,  q0, d10[0]
   vmul.f32  q10, q0, d12[0]
   vmul.f32  q11, q0, d14[0]
   vmla.f32  q8,  q1, d8[1]
   vmla.f32  q9,  q1, d10[1]
   vmla.f32  q10, q1, d12[1]
   vmla.f32  q11, q1, d14[1]
    :
↓
   vmul.f32  q8,  q0, d8[0]
   vmul.f32  q9,  q0, d10[0]
   vmul.f32  q10, q0, d12[0]
   vmul.f32  q11, q0, d14[0]
   vdup.32   q12, d8[1]
   vdup.32   q13, d10[1]
   vdup.32   q14, d12[1]
   vdup.32   q15, d14[1]
   vfma.f32  q8,  q1, q12
   vfma.f32  q9,  q1, q13
   vfma.f32  q10, q1, q14
   vfma.f32  q11, q1, q15
    :

vfma는 vmla와 달리 vector * scalar가 안되므로 그냥 바꾸는 것만으로는 동작하지 않습니다. SSE와 마찬가지로 데이터 복사가 필요하므로 vdup[각주:6]를 삽입했습니다.

               ARM A9  ARM A9 Scorpion Swift   Swift   Krait  ARM A15
----------------------------------------------------------------------
a:m44 vmla_AQ  4.784   3.959   2.859   1.293   1.204   1.337   0.619
b:m44 vmla_BQ  2.408   2.002   1.136   1.359   1.266   0.931   0.569
    ↓
A:m44 vfma_AQ  -----   -----   -----   1.632   1.519   1.882   0.746
B:m44 vfma_BQ  -----   -----   -----   1.594   1.484   0.695   0.840

A: 는 상당히 느리지만 B: 는 효과가 있었습니다. 이 케이스에서는 Krait가 Cortex-A15을 넘어섰습니다.

예상대로 Swift, Cortex-A15에서는 역효과로, vdup가 늘어난 만큼 느려졌습니다.

참고로 vmla과 vfma는 반올림 타이밍이 다르므로 엄밀하게 말하자면 결과가 일치하지 않습니다. vfma 쪽은 오차가 적지만, C의 코드에서 보통으로 쓰면 fmacs[각주:7]가 되므로 검증코드에서 멋지게 assert에 걸렸습니다.

  1. 積和의 의역. 값을 곱하고 난 후 목표값에 더하는 명령. vmla, vfla등. [본문으로]
  2. 스칼라 부동소수점 곱셈 [본문으로]
  3. 스칼라 부동소수점 덧셈 [본문으로]
  4. 스칼라 부동소수점의 덧곱셈. 각주 1을 참고 [본문으로]
  5. vmla와 마찬가지로 스칼라 부동소수점의 덧곱셈 명령이지만 목표값에 더하기 전에 반올림하지 않음 [본문으로]
  6. 벡터 레지스터의 각 요소를 스칼라 값으로 채우는 명령 [본문으로]
  7. 구버전의 단정밀도 스칼라 덧곱셈 명령 [본문으로]

※ 이 글은 오가사와라 히로유키(小笠原博之) 씨가 블로그에 적은 글을 번역한 것입니다. 사정에 따라 예고없이 삭제될 수 있으므로 양해부탁드립니다.

3DMark Android 판의 결과로부터

(원문 : 3DMark Android 版の結果から)

Android판 3DMark 앱의 DEVICE CHANNEL에서 각 기종의 결과를 볼 수 있습니다. 매우 흥미진진하고, 보고 있으면 재미있는 데이터이기에 정리해봤습니다.

SoC      CPU       core  GPU              Score        CPU vs GPU
-----------------------------------------------------------------
APQ8064  Krait      x4   Adreno 320       8000-11000   CPU <= GPU*
Exynos5D Cortex-A15 x2   Mali-T604        7800        *CPU >  GPU
MSM8960  Krait      x2   Adreno 225       5000-6500    CPU <= GPU*
MSM8x60  Scorpion   x2   Adreno 220       3700-5000    CPU <= GPU*
Tegra3   Cortex-A9  x4   ULP GeForce(12)  3000-4000   *CPU >> GPU
K3V2     Cortex-A9  x4   Vivante GC4000   3400-3700   *CPU >> GPU
OMAP4470 Cortex-A9  x2   PowerVR SGX544   3600        *CPU >> GPU
Exynos4Q Cortex-A9  x4   Mali-400MP4      2500-3400   *CPU >> GPU
Z2460    Atom       x1   PowerVR SGX540   2400        *CPU >> GPU
Exynos4D Cortex-A9  x2   Mali-400MP4      1600-2100   *CPU >> GPU
OMAP44x0 Cortex-A9  x2   PowerVR SGX540   1300-3400   *CPU >> GPU
MSM8x55  Scorpion   x1   Adreno 205       1750         CPU <  GPU*
RK3066   Cortex-A9  x2   Mali-400MP4      1200-2800   *CPU >> GPU
Tegra2   Cortex-A9  x2   ULP GeForce(8)   1400-2100   *CPU >> GPU

・Score 값이 높을수록 빠름
・수치는 항상 변동하므로 현시점에서의 참고치로 봐주시길.

가장 오른쪽 열은 CPU와 GPU 중에 어느 쪽의 수치가 더 높은지를 나타냅니다.

전체적으로는 Adreno22x/320의 수치가 높은 경향이 있습니다. 오른쪽 열을 보면 알 수 있듯, CPU 보다도 GPU의 점수가 높은 것은 Qualcomm (Adreno)의 프로세서뿐입니다.

Exynos/OMAP/Tegra 등, Quallcom 이외에는 모두 CPU 쪽이 높게 나타나고 있고, 그 차이도 2배 정도까지 넓혀져 있습니다.

어째서 이런 결과가 되었는지 생각해보겠습니다.

CPU

CPU는 두 그룹으로 나뉘어집니다.

(A) Cortex-A9, Scorpion
(B) Cortex-A15, Krait

(B)는 새로운 세대의 CPU 코어로, 동작 클럭 차이도 있지만 실행효율 자체도 향상되어 있습니다. 예를 들어 (A)가 2 명령 디코드(역자 주: 원문에는 deocde라고 되어있으나 decode의 오타라고 생각되어 수정)의 Out-of-Order 실행인 것에 대해, (B)그룹은 3 명령으로 끌어올려져 있습니다. 동일 클럭, 동 코어수라도 Krait, Cortex-A15 쪽이 고속입니다.

Adreno

각 회사의 SoC/GPU는 다종다양하며 특기분야가 확실합니다. Adreno는 ATI 의 흐름을 이은 모바일용 GPU로, 가장 데스크탑용 GPU에 가까운 기능을 갖고 있습니다. 이것은 다른 GPU에는 없는 커다란 특징입니다.

예를 들자면 정점 텍스처나 볼륨 텍스처(3D 텍스처) 등, 모바일 용도로는 별로 필요치 않은 기능에도 확실히 대응하고 있습니다. 다음 링크에 실제로 각종 GPU 기능을 비교한 표가 있습니다.

프래그먼트 셰이더(픽셀 셰이더)의 연산정밀도도 fp32의 highp 고정으로, 묘화 품질 역시 데스크탑 GPU와 동등합니다. 퍼포먼스를 높이기 위해 눈에 보이는 것을 희생할 필요가 업습니다.

그 대신 초기의 Adreno 20x/AMD Z430에서는 정점 캐시가 없었고, 데스크탑 GPU와 동등한 묘화기능을 가진 반면, 퍼포먼스는 생각했던 것만큼 나오지 않는 경향이 있었습니다. 이 점은 Adreno 22x 이후 개량되어, 묘화 프리미티브에 의존하지 않으며 스루풋이 크게 올라가 있습니다.

복잡한 셰이더도 상당히 잘 돌아가지만, 애플리케이션에 따라서는 그다지 속도가 나오지 않는 것도 있습니다. 어디까지나 상상에 지나지 않지만, Adreno는 OpenGL ES 1.1의 고정 파이프를 시뮬레이션하는 부분이 그다지 좋지 않은 것일지도 모릅니다. (미확인입니다)

셰이더를 사용하여 묘화할 경우, Adreno는 극단적으로 모바일에 특화된 최적화할 필요가 없으며, 셰이더를 그대로 이식해도 속도가 잘 떨어지지 않는 경향이 있습니다. 이 점이 벤치마크에서 유리하게 작용하는 것이 아닐까 합니다. 정리하자면,

  • highp 고정이라 연산정밀도를 떨어트리지 않아도 속도가 변하지 않음
  • 모바일용으로 mediump/lowp화하는 등 특별한 최적화를 할 필요가 없음
  • PC의 묘화 품질에서 떨어트릴 필요가 없음
  • Uniform 수, Sampler 수도 많고 Extension도 풍부하여 호환성을 유지하기 쉬움
  • 통합 셰이더이므로, 정점 부하, 픽셀 부하 어느쪽에든 대응하기 쉬움

또 Adreno 320는 OpenGL ES 3.0에 대응하는 새로운 설계의 GPU 코어이므로, 세대적으로도 상당한 고성능입니다. 사용되는 API 가 ES 2.0이므로, 아직 잠들어있는 하드웨어 기능도 있습니다. 앞으로도 더욱 점수가 늘어날 것이라고 생각됩니다.

Mali-400MP4

GPU의「코어 수」는 GPU에 따라 세는 방법이 다르며 단위도 제각각입니다. 단말의 스펙에 GPU의 코어 수가 적혀있는 경우도 있지만, 성능의 지표가 될 수 있는 건 어디까지나 동일 GPU끼리 비교했을 때 뿐입니다.

PowerVR SGX의 MP1~4은 CPU와 거의 같은 개념으로, GPU 그 자체가 복수 존재하여 병렬로 동작합니다.

Tegra의 코어 수는 GPU 내의 연산 유닛 수를 나타냅니다. G80 이후의 데스크탑 GPU에 맞춘 것으로, 통합 셰이더의 스트림 프로세서에 해당하는 것이 몇개분인지를 나타냅니다. Discrete 이지만 정점, 프래그먼트 둘다 카운트됩니다.

Mali-400은 다음 페이지의 그림(Mali-400 MP Image)에 나와있듯 프래그먼트 프로세서의 유닛 수를 선택할 수 있으며, MP1~MP4라고 불립니다. 이 숫자에는 정점 프로세서가 포함되어 있지 않습니다.

Tegra2/3에서도 8→12로 코어 수는 늘어났지만 정점 유닛 수는 동일합니다. 만약 Mali-400MP와 마찬가지로 프래그먼트 프로세서만을 센다면 Tegra2의 ULP GeForce(8)는 정점 4 + 프래그먼트 4로 MP1, Tegra3의 ULP GeForce(12)는 Vertex 4 + Fragment 8로 MP2가 될 것입니다.

다시 말해 Discrete Shader의 GPU에서는 스펙 표기상의 코어 수가 늘어나도, 정점 성능이 향상된다고는 할 수 없습니다.

Galaxy S2에서 Mali-400MP4가 등장했을 때에는 픽셀 퍼포먼스가 굉장히 높아, 다른 GPU와 비교해도 좋은 성능이었습니다. 하지만 그 후 복잡한 3D 장면에서는 정점 성능이 병목이 되었다는 것을 알고 계실겁니다.

위에서 보신 대로 MP4에서도 정점 성능은 늘어나지 않았고, 10~20만 정도의 비교적 낮은 레벨에서 한계에 부딪히고 있는 듯 합니다.

3DMark Ice Storm의 폴리곤 수는 상당한 하이폴리곤인 듯 한데, Mali-400MP4의 퍼포먼스가 나타나지 못하는 것은 그 때문이라고 생각됩니다.

픽셀 셰이더는 mediump이라 엄밀히는 데스크탑 GPU보다 연산정밀도가 떨어집니다. 다만 Tegra나 PowerVR SGX처럼 최적화를 위해 정밀도를 깎아야할 정도로 빡빡하지는 않습니다. 정점이 병목일 뿐 픽셀측은 mediump 고정이므로 그다지 손을 댈 필요는 없을 듯 합니다.

Mali-T604 이후는 통합 셰이더이므로 특성이 또 달라질 것입니다.

Tegra2/3

Mali-400MP와 같은 Discrete Shader지만, 특성은 정반대입니다. 정점에 여유가 있는 대신에 픽셀이 부족해져서, 비교적 하이폴리곤에 심플한 머티리얼일 때 퍼포먼스가 좋아지는 듯 합니다.

Mali-400MP와 마찬가지로 픽셀 정밀도는 mediump까지이지만, 복잡한 셰이더 코드에서는 lowp를 병용하여 질보다 속도를 우선해야할 경우가 생깁니다. 깊이의 해상도도 다른 GPU보다 떨어집니다.

다른 GPU보다도 대응 확장기능이 떨어지며, 하드웨어 기능도 대담하게 삭제되었습니다. 예를 들자면 깊이 텍스처를 사용할 수 없어 섀도우 맵을 컬러 맵에 써넣어야 합니다. 깊이를 압축해야하기에, 셰이더에도 추가 연산 코드가 필요합니다. OpenGL ES 2.0의 사양 상 깊이 텍스처 대응이 필수는 아니지만, 대응하지 않는 GPU는 Tegra2/3 뿐입니다.

3DMark에서는 비교적 하이폴리곤이지만 Mali-400MP 정도로 점수가 떨어지지는 않으며, GPU의 능력으로서 타당한 결과라 생각됩니다.

NVIDIA답지 않은 성능의 GPU도 아마도 이것이 마지막이 아닐까 합니다. Tegra4에서는 기능면에서도 속도면에서도 크게 손을 대어 점수가 상당히 늘어날 것이라 생각됩니다.

PowerVR SGX

이전의 기사에서도 적었듯, PowerVR SGX 5xx는 2종류가 있습니다. Android 단말에서는 낡은 Series 5(SGX540)가 많아, GPU의 성능면에서 벤치마크의 점수가 그다지 좋지 않은 듯합니다. 그 외에도 생각할 수 있는 원인이 있습니다.

PowerVR SGX는 어떤 묘화든 낭비없이 해내는 경향이 있습니다. 정점이 많은 장면이든 픽셀이 많은 장면이든 유연하게 따라갑니다.

사용 방법의 자유도도 높아 화질 우선으로 써도 되고, 속도 중시도 할 수 있고, 용도에 따라 마음대로 쓸 수 있습니다. 그 반면, 정해진 해법이 없이 상황에 맞는 판단이 요구됩니다.

예를 들자면 Uniform 수는 퍼포먼스를 생각한다면 128개 이내, 이식성이나 사용성을 위해서는 256개를 사용한다던가 하는 것입니다. (과거 기사의 comment를 참조)

또 픽셀에 highp fp32를 쓸 수 있어, 데스크탑 GPU와 동일한 정밀도로 묘화할 수 있습니다. 이 경우 퍼포먼스가 떨어지므로, 속도를 생각한다면 겉보기를 희생해서 mediump, lowp로 바꿀 수 있습니다.

다른 GPU와 달리 TBDR(타일 기반 지연 렌더링)이므로, ALU의 이용효율이 전체 퍼포먼스에 주는 영향이 큽니다.

통상의 GPU는 래스터라이저에서 픽셀 셰이더(프래그먼트 셰이더)가 호출되므로, 파이프라인 대기 사이클이 존재합니다. 래스터라이저나 깊이 테스트 등, 다른 스테이지가 막혀있을 때는 셰이더를 줄여도 속도가 크게 변화하지 않습니다.

PowerVR SGX는 지연 렌더링이므로, 픽셀 셰이더가 호출될 때에는 래스터라이저 등 다른 스테이지가 완료되어 있는 상태입니다. 셰이더의 명령을 줄이면 줄일수록 직접 퍼포먼스에 영향을 주므로 최적화가 힘들어지기 쉽습니다.

여기가 가장 Adreno와 다른 포인트로, 퍼포먼스를 우선한다면 상당히 손을 많이 써야할 필요가 있습니다. 고속화를 할 여지가 남아있다고도 할 수 있겠습니다.

첨언하자면 품질이 변할 경우 벤치마크 비교로는 올바르다 할 수 없기에, 3DMark는 비교적 높은 연산정밀도로 렌더링하고 있지 않나 생각됩니다. 만약 그렇다면 Tegra/Mali와는 달리 PowerVR의 점수는 더욱 오를 여지가 남아있게 됩니다.

iOS 판이 나오면, 어느 정도나 PowerVR SGX에 최적화되었는지 알 수 있게 될 것입니다.

결론

  • 아마도 각 GPU 별 셰이더 최적화가 그다지 강하지 않으므로, 속도가 잘 떨어지지 않는 Adreno가 유리
  • OpenGL ES 3.0 대응 최신 GPU + 신 CPU와, 한발 앞서 세대교체한 Qualcomm (Krait quad + Adreno 320)가 역시 빠름

※ 이 글은 오가사와라 히로유키(小笠原博之) 씨가 블로그에 적은 글을 번역한 것입니다. 사정에 따라 예고없이 삭제될 수 있으므로 양해부탁드립니다.

(원문 :モバイルデバイスは Game Console を超えたかどうか)

모바일 기기는 게임 컨솔을 넘었을까

모바일 기기는 요 몇년간 상당한 속도로 향상되어 왔으며, 기세도 줄어들지 않고 있습니다. 지금까지 테스트해온 대로, GPU, CPU 모두 PC나 전용기기에 필적하는 능력을 갖게 되었습니다.

개성이 치우쳐진 모바일 프로세서

PC와 마찬가지로 단말의 성능에는 큰 격차가 있습니다.

현시점에서 입수할 수 있는 가장 빠른 CPU는 Snapdragon APQ8064 (Krait Quad core) 일 것입니다. 내일 2013/04/04은 1.7GHz의 옵티머스G Pro L-04E가 발매예정입니다.

지금 당장 구할 수 있는 단말의 GPU 로는 틀림없이 iPad4의 A6X가 가장 빠릅니다.

PowerVR SGX500~의 형번호를 가진 GPU는 여럿 존재하지만, 크게 나누어 2종류가 있습니다.

PowerVR Series 5        SGX530, SGX535, SGX540
PowerVR Series 5XT      SGX543MP, SGX544MP, SGX554MP

형번호가 비슷해서 헷갈리지만, 양쪽에는 PVRTC2, 섀도우 샘플러, 연산정밀도, 멀티코어 등 기능적인 차이가 있습니다. 그중에서도 최상위인 SGX554MP4 를 탑재하고 있는 것은 iPad4의 A6X뿐 입니다.

이와 같이 하이엔드 단말 중에서도 각자 무엇을 중시하는가에 따라 평가가 달라집니다. Apple은 GPU를 최우선하고 있는 반면, CPU가 쿼드코어인 단말은 아직 존재하지 않습니다.

방향성으로 정반대인 것이 NVIDIA Tegra입니다. 솔선해서 듀얼코어, 쿼드코어인 Tegra2/3를 전개해왔지만, 트레이드 오프로서 GPU 기능이 약하고, 묘화성능도 좋지 않습니다.

따라서, 성능차만이 아니라 성격에 있어서도 특성이 제각기였던 것이 지금까지의 모바일 기기의 특징이었습니다.

  • 트레이드 오프가 있으므로 일부분만 우수하다
  • 메이커 별로 강화하고 있는 분야가 다르다

하지만 다음 세대에서는 이러한 언밸런스함이 상당부분 해소될 것이라 생각됩니다.

세대교체

다른 회사에 앞서서 GPU/CPU 모두 세대교체를 달성한 Qualcomm에서는, 아주 특출난 점은 없지만 평균적인 전체 성능이 높아졌습니다.

또, 이후 등장 예정인 Tegra4는 CPU 코어가 쇄신될 뿐 아니라, 겨우 NVIDIA다운 GPU로 강화될 듯 합니다.

Tegra2/3의 GPU인 ULP GeForce는 셰이더 유닛이 discrete였기에 GeForce6800/7800 세대라고 불리고 있었지만, 성능적으로는 대폭으로 깎인 물건이었습니다.

예를 들어 GeForce의 특징적 기능이었던 NVIDIA 섀도우 맵(PCF)이 Tegra2/3에는 탑재되어 있지 않습니다. 그뿐 아니라 지금까지 테스트한 GPU 중에서는 Tegra2/3만이 24비트 깊이나 깊이 텍스처에 대응하지 않았습니다. 다른 회사의 GPU인 Adreno, PowerVR, Mali, Vivante 는 모두 이러한 확장기능에 대응하고 있었는데 말입니다.

위 사이트의 슬라이드 사진을 보면 Tegra4에서 드디어 기능차가 해소되었으며, 또한 하드웨어 PCF가 탑재되는 등, 기대했던 GeForce 6800/7800 클래스의 GPU가 된 것 같습니다.

대충 4 픽셀 파이프니 성능적으로는 아마도 아무 표시없는 GeForce 6800 정도가 아닐까 합니다. 픽셀 레이트는 PS3/Xbox360 세대의 절반이지만, 메모리 대역으로 봐도 납득할 수 있는 수치입니다.

Xbox360  22.4GB/s (+32.0GB/s)
PS3      22.4GB/s (+25.6GB/s)
Tegra4   14.9GB/s

물론 예상에 지나지 않으므로 실제로 입수할 때까지는 진짜 성능은 알 수 없습니다.

CPU/GPU 양쪽의 세대교체를 통해, 일점집중형에서 평균적인 성능향상으로 이동하고 있다고 생각할 수 있습니다. 아마도 극단적인 개성연출은 줄어들어가지 않을까 싶습니다.

컨솔과의 비교

Xbox1/GC 시대의 컨솔은 확실히 넘어섰습니다. 우선 CPU의 속도에서 단위가 다르고, GPU 성능도 셰이더 등은 훨씬 고성능입니다. 단, 필레이트에 특화된 PS2의 특수한 하드웨어는 올바르게 비교할 수 없습니다.

또 모바일 기기에 요구되는 해상도는 컨솔보다도 높으므로, 그 점도 고려할 필요가 있습니다.

          mem B/W                CPU          RAM    screen
---------------------------------------------------------------
GC        2.6GB/s (+?)           0.5GHz x1    24MB   SD 480
PS2       3.2GB/s (+48.0GB/s)    0.3GHz x1    32MB   SD 480
Xbox1     6.4GB/s                0.8GHz x1    64MB   SD 480
Xbox360  22.4GB/s (+32.0GB/s)    3.2GHz x3   512MB   HD 720
PS3      22.4GB/s (+25.6GB/s)    3.2GHz x7   512MB   HD 720
PS4     176.0GB/s                ?.?GHz x8     8GB   HD 1080

Tegra3    6.0GB/s                1.7GHz x4  1~2GB
APQ8064   8.5GB/s                1.7GHz x4           HD 1080
A5X      12.8GB/s                1.0GHz x2     1GB   HD 1536
Tegra4   14.9GB/s                1.9GHz x4
A6X      17.0GB/s                1.?GHz x2     1GB   HD 1536

누가 봐도 확실하게 다른 점이라면 RAM 용량이 있습니다. 스마트폰도 태블릿도 RAM 용량 1GB~2GB는 당연하게 되었으며, 이 점에서는 현행 컨솔보다도 여유가 있습니다.

실 기기에서의 CPU 속도

실재 기기에서의 성능 비교
(실측이 아니라 스펙을 통한 연산치이므로 주의)

                             CPU           Clock  DMIPS/clock  DMIPS*core
-------------------------------------------------------------------------
Nexus 10            Exynos 5 Cortex-A15 x2  1.7GHz   3.5          11.90
ARROWS X F-02E      Tegra3   Cortex-A9  x4  1.7GHz   2.5          17.00
Optimus G Pro L-04E APQ8064  Krait      x4  1.7GHz   3.3          22.44

Xbox360             Xenon    PPC core   x3  3.2GHz   2.0~(3.2)   19.20~(30.72)
  • DMIPS*core 가 통합성능(참고치)으로 수치가 높은 쪽이 빠름

CPU의 코어수가 다르면 비교가 어려워지므로 어디까지나 참고치로만 봐주시기 바랍니다. DMIPS/clock는 동일 클럭에서 비교한 코어 1개의 능력으로, 이것을 클럭*코어수로 곱한 것이 DMIPS*core가 됩니다.

Xbox360의 DMIPS/clock은 Wikipedia Instructions per second를 참조했습니다. 단 동일 성능이어야 할 PS3 PPE가 3.2이므로 Xbox360의 실제 점수는 더 높을 가능성이 있습니다. (괄호 안의 수치는 3.2를 기준으로 한 경우) PS3의 Cell은 특수하여 간단히 비교할 수 없습니다.

앞으로 등장하게 될 Exynos 5 Octa (Cortex-A15 x4)나 Tegra4 (Cortex-A15 x4)의 점수를 예상하면 다음과 같습니다.

                             CPU           Clock  DMIPS/clock  DMIPS*core
-------------------------------------------------------------------------
Exynos 5 Octa                Cortex-A15 x4  1.6GHz   3.5          22.40
Tegra4                       Cortex-A15 x4  1.9GHz   3.5          26.60

그다지 엄밀한 비교는 아닐지도 모르지만, CPU 능력으로 현행 컨솔에 필적하는 레벨에 달했다는 것은 사실입니다.

단, 단정밀도의 부동소수점 연산능력으로는 당해내지 못합니다.

          CPU                fp-op/core   core   clock    GFLOPS
----------------------------------------------------------------
Xbox360   Xenon PPC            12         3      3.2GHz   115.2
PS3       Cell BE              12+8       1+7    3.2GHz   217.6
          Tegra3 Cortex-A9     4          4      1.7GHz    27.2
          APQ8064 Krait        8          4      1.7GHz    54.4
          Tegra4 Cortex-A15    8          4      1.9GHz    60.8
  • GFLOPS가 높은 쪽이 빠름
  • 이론치이므로 이대로의 성능이 나오지는 않습니다.

특히 Cell이 압도적으로, 필레이트 괴물이었던 PS2와 마찬가지로 일부분(부동소수점 연산능력)에 있어서 특출난 능력을 갖고 있습니다.

예상으로는 아마 PS4에서도 CPU 하나의 부동소수점 연산능력에 있어서는 Cell에 미치지 못하지 않을까 싶습니다. 그 대신 GPU에 스트림 처리를 맡길 수 있으므로, GPU를 보조하던 Cell과는 반대 입장이 됩니다.

GPU의 속도

  • Mobile Device는 해상도가 매우 높음
  • GPU의 구조가 다름
  • Tegra는 연산정밀도가 다름
  • 성능면에서는 동등

스마트폰에서는 Full HD, 태블릿에서는 2048x1536나 2560x1600 등 상당한 고해상도화가 이루어지고 있습니다. 메모리 대역도 셰이더 사이클도 대부분 픽셀에 소비됩니다. 그 때문에 설령 GPU 성능이 높아져도 상대적으로는 파워 부족에 빠지게 됩니다.

태반의 GPU가 타일 기반이며, 데스크탑 GPU와 구조가 다릅니다. 특히 PowerVR은 아무 것도 하지 않아도 하드웨어가 지연 렌더링을 하므로, 소프트웨어에서 너무 복잡한 일을 하면 역효과가 될 가능성이 있습니다.

예를 들어 Early Z Culling을 효과적으로 사용하려면 앞쪽에서부터 묘화를 해야하지만, 픽셀 단위로 프래그먼트가 제거되는 TBDR(Tile-Based Deferred Rendering. 타일 기반 지연 렌더링)에서는 불필요합니다. 또 포스트 이펙트같이 프레임 버퍼를 재이용하면 추가 비용이 발생할 가능성이 있습니다. 이런 것들을 의식하면서 만들지 않았을 경우, 단순히 이식하는 것만으로는 모바일 GPU에서는 성능이 그다지 나오지 않을지도 모릅니다.

그 점에서 Tegra는 Immediate Mode이므로 데스크탑 GPU와 같은 사고방식이 통용됩니다. 실제로 테스트한 것은 아니므로 억측이지만, 위에 적은대로 Tegra4에서 대충 현행 컨솔의 절반 정도가 아닐까 생각됩니다.

다만 Tegra 시리즈의 픽셀 셰이더는 연산정밀도가 mediump입니다. 정밀도가 필요한 셰이더는 동작하지 않을 가능성이 있고, 하드웨어 섀도우 샘플러의 대응은 필연이었을지도 모릅니다. 또 mediump를 기준으로 하면 PowerVR 역시 퍼포먼스가 올라가므로, fp32인 GPU와의 단순 FLOPS 비교는 무리가 있다고 생각합니다.

참고로, Qualcomm의 Adreno는 픽셀 셰이더의 연산정밀도도 GPU 선능도 컨솔과 비교하여 손색이 없습니다.

  • 셰이더나 확장기능 등, GPU 성능은 현행 컨솔과 완전히 동등
  • 묘화속도에서는 근거가 될 데이터가 부족(하지만 아마도 뒤떨어질듯)

정리

결론을 내자면, 내부구조를 숙지하고 있는 것도 실측해본 것도 아니므로 근거가 없지만, GPU 성능이나 게임에서 중요한 단정밀도의 부동소수점 연산성능에서도 Xbox360/PS3 쪽이 위일 것입니다. 더욱이 고해상도라는 것이나 버스 대역의 한계도 있어, 실제 애플리케이션에서는 GPU 성능 이상으로 간격이 생기는 것이 현실이 아닐까 싶습니다. 다만 급격한 성능의 향상으로, 따라잡는 것도 시간의 문제라는 것은 확실합니다. 특히 램 용량에서 앞서고 있으며, CPU 의 실행성능도 차이가 없어지고 있으니까요.


+ Recent posts