2009년 9월 16일 수요일

OpenSPARC Internals - 1

OpenSPARC에서 공개한 프로세서는 OpenSPARC T1과 OpenSPARC T2 두 종류입니다. 우선 OpenSPARC T1에 대해서 살펴 봅니다.

OpenSPARC T1은 기본적으로 8개의 64bit SPARC core가 내장되고 각 core 별로 4개의 thread를 동시에 실행할 수 있습니다. 따라서 총 32개의 thread(task)를 동시에 실행할 수 있는 구조를 가지고 있습니다.


  • 전체적인 구성

8개의 Core가 Unified Level 2 Cache를 공유하는 형태를 가집니다. L2 Cache는 4개의 bank로 나누어 관리됩니다. 각 Core가 동시에 L2 Cache에 data를 요청하는 경우를 줄이기 위해서 core가 요청하는 address에 따라서 L2 Cache의 4개의 bank 중에 하나가 선택되고 각 bank는 독립적으로 동작합니다. 각 Core와 L2 Cache의 4개의 bank는 on-chip crossbar bus로 연결됩니다. Level 2 Cache는 총 3MB의 12-way set associativity를 가진다고 합니다. DDR2 SDRAM Controller게 CPU에 직접 연결되는데, L2 Cache의 각 bank 마다 하나씩의 DDR2 SDRAM Controller가 연결됩니다.


재미 있는 것은 FPU(Floatingpoint Processing Unit)은 chip 전체에 하나만 있고, 8개의 core가 공유하여 사용합니다.


  • Core 내부

Core 내부는 정말 단순한 구조를 가집니다. 단, 하나의 integer pipeline만 존재하고 기본적으로 single issue입니다. pipeline의 구성은 Fetch/Switch(Thread Select)/Decode/Execute/Memory/Writeback의 6단계인데 Switch를 제외하면 전형적인 5 stage pipeline과 동일합니다(Load/Store Unit은 약간 더 긴 stage를 가진다고 합니다). Switch Stage가 바로 여러개의 thread를 돌릴 수 있게 해 주는 부분입니다. 이 부분의 동작 역시 아주 단순합니다. 4개의 thread에서 각각 읽어온 instruction 4개를 round-robin 형태로 하나씩 뽑아서 pipeline에 issue하는 형태를 가집니다. 단, 특정 thread가 cache miss 등으로 인해 pipeline stall이 발생하거나 latency가 긴 instruction(branch, multiply, load, divide)을 수행하는 경우에 해당 thread의 instruction issue를 멈추고 나머지 thread에서만 issue를 수행하다가 해당 thread의 pipeline stall 조건이 없어지면 다시 그 thread에서도 instruction issue를 수행합니다.


16KB의 Level 1 Instruction cache가 있는데 4개의 thread가 공유하고, 4-way set associative하고 32byte의 cache line size를 가집니다. 4개의 thread가 공유해야 하므로 physically indexed, physically tagged의 형태를 가집니다. 즉, virtual address가 아니라 physical address로 cache를 access한다는 말입니다.


8KB의 Level 1 Data cache를 가지고 있는데, 역시 4개의 thread가 공유하고 4-way set associative하고 16byte의 cache line size를 가집니다. L1 Instruction cache와 마찬가지로 physical address로 access하고 있는 것으로 보입니다. 기본적으로 write-through 형태를 가지고 별도로 각 thread별로 8개의 entry를 가지는 store buffer가 있어서 memory write를 buffering하게 됩니다.


당연히 Intruction TLB와 Data TLB를 각각 따로 사용하고 있고, 64 entry fully associative로 구성되고 4개의 thread가 공유하는 형태를 가집니다.


Branch instruction이 issue 되었을 때 해당 thread의 issue를 멈추는 것으로 보아 복잡한 branch predication은 수행하지 않는 것으로 보입니다.


4개의 thread를 처리할 수 있도록 추가된 하드웨어는 Swtich stage와, 각 thread별로 가지게 되는  PC, instruction buffer, register file, store buffer 정도가 됩니다. 물론 SPARC은 register window라고 하는 독특한 형태의 register file을 사용하므로, 각 thread별 register file의 추가가 어느 정도는 큰 hardware 크기 증가가 일어나기는 합니다만 단순히 multi-core를 통한 thread 늘리기에 비해서는 당연히 큰 증가가 아닐 겁니다.




  • 동작 주파수 및 크기
OpenSPARC T1에 대한 자료는 찾을 수 없고, UltraSPARC T1의 경우 90nm 공정에서 1.2GHz로 동작하는 것으로 알려져 있습니다. 그 때 size는 340 mm^2이다.



  • 의미


우선 T1의 경우 FPU를 8개의 core가 나누어 써야 하므로 scientific calculation이 많은 application에서는 성능이 제대로 나올 수 없습니다. 즉, IBM의 Power 시리즈 처럼 FLOPs로 성능이 측정되는 Super Computer 동네에서는 전혀 쓰일 가능성이 없습니다.


또한, 수행 시간, 즉 latency로 측정할 수 있는 단일 thread의 성능을 높이기 위해서 설계된 processor가 아닙니다. 우선 pipeline이 깊지 않아서 clock frequency가 높지 않습니다. core 하나가 4개의 thread를 round robin issue하는 형태이므로, core에서 4개의 thread가 동시에 동작한다면 1개의 thread를 돌릴 때에 비해 최악의 경우 1/4의 성능을 낼 수 밖에 없는 구조를 가집니다. 따라서 수행 시간이 중요한 system에서는 좋은 성능을 발휘할 수 없습니다. 예를 들어 chip 설계를 위한 EDA tool 등의 경우에도 좋은 성능을 기대할 수 없습니다.



4개의 thread를 round robin으로 issue하는 것이 가지는 의미는, 특정 thread가 cache miss와 같은 pipeline stall이 발생하였을 때에도, 다른 thread의 instruction이 issue가 일어날 수 있으므로 그로 인한 pipeline utilization 증가입니다.


Database와 같은 Server application의 경우에는 cache miss가 일반적인 다른 application에 비해 더 많이 발생한다고 합니다. 이런 cache miss가 많이 발생하고, latency 보다는 throughput이 중요한 system의 경우에서 의미를 가진다고 볼 수 있습니다. 수행 시간, FLOPs 가 의미를 가지는 것이 아니라 TPS(transaction per second)가 의미를 가지는 동네에서 성능을 발휘할 수 있겠습니다.


0 개의 댓글:

댓글 쓰기