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

iPhone 5s A7 CPU의 부동소수점 연산속도 (32bit)

(원문 : iPhone 5s A7 CPU の浮動小数点演算速度 (32bit))

iPhone 5s의 부동소수점 연산속도를 명령단위로 비교해보았습니다. A7의 CPU core는 ARMv8으로 64bit 명령에 대응하지만, 여기서는 AArch32 (32bit mode)의 VFP/NEON 명령을 비교해보겠습니다. 64bit mode (AArch64)에서는 레지스터의 개수와 view가 다르므로 결과가 달라질 가능성이 있습니다.

                 (1)      (2)    (3)     (4)      (5)      (6)
                Nexus7  EVO 3D  iPhone5  HTL21  Nexus10  iPhone5s
              Cortex-A9 Scorpion Swift   Krait Cortex-A15   ?
                Tegra3  MSM8660    A6  APQ8064 Exynos5D     A7
                1.2GHz  1.2GHz  1.3GHz  1.5GHz  1.7GHz    1.3GHz?
-----------------------------------------------------------------
a:m44 vmla_A Q   3.959   2.859   1.293   1.337   0.619     0.700
b:m44 vmla_B Q   2.002   1.136   1.359   0.931   0.569     0.670
c:m44 vmla_A D   3.980   3.053   1.669   1.889   0.557     0.649
d:m44 vmla_B D   2.003   1.434   1.329   1.532   0.568     0.745
A:m44 vfma_A Q   -----   -----   1.632   1.882   0.746     0.707
B:m44 vfma_B Q   -----   -----   1.594   0.695   0.840     0.699
e:fadds      A   3.343   3.383   3.090   2.774   2.383     3.551
f:fmuls      A   3.337   3.383   3.167   2.747   2.369     3.475
g:fmacs      A   3.337   3.379   6.180   5.574   2.956     3.480
h:vfma.f32   A   -----   -----   6.180   2.747   2.957     3.480
i:vadd.f32 D A   3.426   3.377   3.091   2.762   1.183     1.031
j:vmul.f32 D A   3.421   3.383   3.168   2.746   1.478     1.545
k:vmla.f32 D A   3.792   3.380   3.166   5.604   1.480     1.567
l:vadd.f32 Q A   6.688   3.377   3.090   2.801   2.365     1.031
m:vmul.f32 Q A   6.681   3.384   3.166   2.761   2.364     1.548
n:vmla.f32 Q A   6.681   3.380   3.167   5.606   2.367     1.574
o:vfma.f32 D A   -----   -----   3.167   2.833   1.479     1.574
p:fadds      B   3.347   5.917   6.181   3.467   2.956     6.953
q:fmuls      B   4.195   5.917   6.180   3.556   3.558     6.652
r:fmacs      B   6.688   8.451  12.361   6.298   5.912     9.867
s:vfma.f32   B   -----   -----  12.363   3.430   5.910     9.859
t:vadd.f32 D B   3.421   5.916   3.090   3.529   2.958     3.663
u:vmul.f32 D B   3.422   5.073   3.169   3.447   2.364     3.114
v:vmla.f32 D B   7.561   8.451   6.180   6.293   4.728     6.185
w:vadd.f32 Q B   6.705   5.916   3.090   3.457   2.961     3.659
x:vmul.f32 Q B   6.683   5.074   3.167   3.428   2.363     3.101
y:vmla.f32 Q B   7.532   8.457   6.179   6.372   4.729     6.199
z:vfma.f32 D B   -----   -----   6.181   3.437   4.730     6.188

↑수치는 실행시간(초) 수치가 작을수록 고속

빠르다고 생각한 iPhone 5 A6의 Swift로부터 1년, A7은 더욱 강력한 연산능력을 갖고 있는 듯 합니다. 거의 동 클럭(?)에서도 Swift의 최대 3배의 스루풋을 내며, 클럭차가 있음에도 Cortex-A15에 필적하는 점수가 나오고 있습니다.

특히 NEON 명령이 고속이라는 걸 알 수 있습니다. D와 Q에서 차가 없으므로, 연산은 128bit 단위라고 예상할 수 있습니다. 그럼에도 Cortex-A15의 64bit 2pipe로 실현된 속도를 따라잡고 있으므로, 어디까지나 억측이지만 A7은 128bit pipe가 복수 존재하고 있을 가능성이 있습니다.

반면, VFP 쪽은 다른 CPU와 차이가 거의 없는 듯, 동작 클럭분만큼 차가 나고 있습니다. 다만 Swift에서 극단적으로 느렸던 스칼라의 덧곱셈[각주:1]명령에 있어서는 A7에서 제대로 결점을 극복했다는 것을 알 수 있습니다. 그래도 레이턴시는 Swift 정도는 아니지만 비교적 큰 편입니다.

ARMv8의 아키텍처 변경에 따라, NEON 명령에서도 배정밀도 연산이 지원되게 되었습니다. 이 테스트는 단정밀도의 32bit 부동소수점 연산이지만, 만약 배정밀도로 비교한다면 32bit ARMv7세대와는 차이가 훨씬 벌어지게 될겁니다.

x86에서도 SSE2가 배정밀도 연산을 지원하게 됨으로써, 호환성 목적 이외로는 FPU (x87)을 사용할 필요가 없어지게 되었습니다. 실제로 Windows x64의 64bit mode에서는 FPU를 사용하지 않고 SSE 명령만이 이용되고 있습니다.

마찬가지로 ARMv8도 Advanced NEON이 배정밀도를 커버함으로써 VFP를 나눌 필요가 없어지게 되었습니다. AArch32에서는 VFP 명령이었던 것이 AArch64에서는 NEON의 스칼라로 바뀌었음을 예상할 수 있습니다.

Krait, Swift, Cortex-A15과 ARMv7-A로 VFPv4세대의 CPU가 겨우 갖춰졌다 싶었더니, 그에 더해 새로운 세대의 CPU가 등장해버렸습니다. 진짜 퍼포먼스는 AArch64 (64bit mode)에서 발휘되므로, 지금부터가 진짜라 할 수 있겠습니다.

a:〜z: 각개의 상세와 설명은 과거의 기사를 참조해십시오. Cortex-A8을 포함한 여러 기종의 결과를 아래 페이지에 정리했습니다.

  1. 積和의 의역. 값을 곱하고 난 후 목표값에 더하는 명령. vmla, vfla등. [본문으로]

+ Recent posts