본문 바로가기

CS/컴퓨터구조

[컴퓨터구조] Interconnection

현재 글은 컴퓨터 구조와 아키텍처 서적 및 대학에서 들은 강의를 기반으로 한다.


Computer Interconnection

 컴퓨터는 프로세서, 메모리 및 I/O 장치들이 서로 협력하여 상호작용함으로써 동작한다. 이러한 장치들이 함께 동작하기 위해서는 이들 사이를 연결하는 통로 등을 구축할 필요가 있고, 이런 통로들의 구조를 나타낸 것을 Interconnection structure이라고 부른다. 해당 구조는 장치 사이에 꼭 필요한 정보 교환에 기초한다.

컴퓨터의 각 모듈들에 대한 Interconnection Structure을 나타낸 것

 Interconnection Structure은 최소한 다음과 같은 전송 방식들을 지원해줘야 한다.

타입 설명
Memory → Processor 프로세서가 메모리로부터 instruction / data 읽어 옴
Processor → Memory 프로세서가 데이터를 메모리에 작성
I/O → Processor I/O 모듈 통해 I/O 디바이스의 외부 정보 읽어옴
Processor → I/O 프로세서가 I/O 디바이스에 데이터를 보냄
I/O ↔ Memory DMA. 프로세서의 개입 없이 바로 데이터 송 · 수신

Bus Interconnection

Bus

버스의 간략한 구조

 컴퓨터의 각 모듈들이 통신하기 위해서는 이들 사이를 연결하는 통로가 필요한데, 이 통로 역할을 버스가 수행한다. 버스는 둘 이상의 디바이스를 연결한 통신 경로로, 연결된 모듈들에게 공유되는 통신 수단이 된다.

 버스를 통해 정보를 보내면 버스에 연결된 모든 디바이스들이 해당 정보를 받을 수 있다(broadcast). 이 특성은 다수의 캐시에게 정보를 요청할 때 큰 도움이 된다고 한다. 한 번에 여러 개의 신호가 전송될 수는 없다.

 컴퓨터 시스템은 계층에 따른 다양한 레벨의 컴포넌트 사이를 연결하는 많은 버스를 가진다. 즉, 컴퓨터 내에서 버스는 여러개가 존재한다. 이때 컴퓨터는 컴퓨터의 주된 기능을 수행하는 프로세서, 메모리 I/O 모듈을 연결한 시스템 버스를 1개 이상 가진 상호 연결 구조를 가진다.

 하나의 시스템 버스는 약 5000개가 넘는 개별 라인을 가진다고 하며, 이 라인들은 특정 기능마다 할당되어 있다. 라인들은 특성에 따라 Control line, Address line, Data line 세 가지로 나뉜다. 버스 역시 이에 대응하여 존재한다.

  • Control Bus 
    • data, address line 에 대한 접근 및 사용을 제어하는 데 사용 ( 모든 컴포넌트 사이에서 공유하기 때문 )
    • command signal : 수행될 동작을 식별
    • timing signal : 데이터와 주소 정보의 유효성 표시
    • 메모리, I/O, 버스, 동기화, 초기화 등의 동작을 포함해야 함.
  • Address Bus
    • 데이터 버스의 데이터를 옮길 출발지 및 목적지를 지정하는데 사용
    • width 크기가 메모리의 크기와 연관되어 있으므로, width가 클수록 메모리 수용량이 높음
    • 주소 I/O 포트 에도 사용된다고 한다
  • Data Bus
    • 모듈 사이에서 데이터를 이동시키는 데이터 라인
    • 한 번에 많은 정보를 옮기는 게 성능에 좋으므로 width 가 클수록 좋음( 32  < 64 < 128 ... )

Single Bus Problem

 컴퓨터 전체적으로 버스를 하나만 사용하게 되면 모든 디바이스를 하나의 버스에 연결해야 한다. 컴퓨터는 엄연히 현실의 물리법칙을 적용받는 전자 장치의 일종으로, 버스 역시 전기 / 전자와 관련된 물리 법칙을 벗어날 수 없다.

 너무 많은 디바이스가 버스에 연결되어 있는 경우 동일 버스에 있음에도 불구하고 propagation delay 가 발생할 수 있다. 버스를 통해 한번에 공급할 수 있는 전력은 한정되어 있으므로 공급 과정을 여러 번 반복해야 하기 때문이다. 이런 상황에서는 한 클럭 내에 전류를 전부 공급하지 못해 정보가 섞일 수도 있다. 

 버스의 capacity 가 장치들의 총 capacity 합보다 훨씬 커야만 지연 없이 데이터 및 전류를 문제없이 보낼 수 있다. 하지만 버스 자체의 capacity을 무한정 늘릴 수는 없기 때문에 버스 자체를 다수 + 계층적으로 두어 한 버스가 감당할 디바이스 수를 줄임으로써 이 문제를 해결한다.

버스 아키텍처

(좌) 캐시를 포함한 전통적 버스 구조, (우) 고성능 버스

 전통적 버스 아키텍처에서는 시스템 버스를 하나로 운영하되, 확장 버스를 둬서 CPU, 메모리 및 I/O 작업을 제외한 일을 맡기고 있다. 프로세서는 캐시를 이용하여 원하는 정보를 찾고, 없는 경우 시스템 버스를 이용해 정보를 얻게 된다. 고성능 버스에서는 버스의 계층을 더 나누어 큰 성능이 필요한 작업의 경우 high-speed bus을 이용하여 처리한다. 

 이는 버스 아키텍처의 예시로, 실제 버스가 어떻게 구성되는지는 보드를 구현하는 개발사에 따라 다르다.

버스 디자인에 고려해야 할 점

 버스는 컴퓨터 내의 다양한 기기들 사이에서 정보를 전달하기 위한 통로 역할을 수행한다. 컴퓨터 내 다른 부품들에 비해 구조가 간단한 편이라 가격이 저렴한 편이지만, 성능을 높이기 위해서는 버스의 width나 복잡도를 높여야 하기 때문에 비용이 증가할 수 있다. 결과적으로 버스의 간단함을 살리면서 어느 정도 성능을 보장하는 것이 중요하다.

 버스 디자인 시에 고려할 점에는 다음과 같은 것들이 있다.

  • Type (Dedicated or Multiplexed)
  • Method of Arbitation (Centralized or Distributed)
  • Timing (Synchronous or Asynchronous)
  • Bus width
  • Data transfer type

1) 버스의 데이터 전송 방식

 버스의 타입은 address와 data을 동시에 처리하는지 여부에 따라 나뉜다.

버스 타입 설명
dedicated 데이터와 주소, I/O 라인 등을 다른 라인을 이용하여 처리한다.
multiplexed 데이터와 주소를 동일한 라인을 이용하여 처리한다.

 보통 multiplexed 방식을 이용하여 데이터 및 주소를 하나의 라인으로 처리한다. 각각의 타입에 대해 다른 라인을 배정할 필요가 없기 때문에 버스가 노는 일이 적어지고, 라인 수 자체도 줄어드는 장점이 있다.

 컴퓨터 내에서 특정 주소에 있는 정보를 얻어 오기 위해서는 그 주소를 먼저 준 다음 주소를 기반으로 데이터를 가져온다. 즉 READ의 경우 주소 다음에 데이터 정보를 가져오는 것이 일반적이라 주소 라인과 데이터 라인을 구분하지 않아도 성능상 큰 차이가 없다. 반면 WRITE 동작의 경우 입력할 주소와 데이터를 함께 받아서 처리할 수 있다면 더 효율적이기 때문에 multiplexed 방식의 성능이 더 낮을 수 있다. 다행히도 컴퓨터 내에서 READ : WRITE = 8 : 2 정도로 READ의 비율이 더 높아서 큰 문제는 되지 않는다고 한다.

2) 버스 중재 방식

 버스를 사용하고 싶어 하는 버스 마스터들이 서로 경합을 일으킬 때 이를 중재하는 주체가 누구인지에 따라 달라진다.

버스 타입 설명
centralized 한개의 버스 중재기가 모든 버스 마스터들 사이의 경합을 제어
distributed 모든 버스 마스터가 각자 중재기를 가지고 중재 작업에 참여

 전체 시스템의 구조가 커지고 디바이스의 속도가 빨라짐에 따라 하나의 중재기나 CPU의 개입이 오버헤드로 작용하는 경우가 있는데, 이런 오버헤드를 줄이기 위해 distributed 방식을 사용하여 CPU의 개입을 줄인다고 한다.

https://www.tutorialspoint.com/what-is-bus-arbitration-in-computer-organization

http://blog.skby.net/%EB%B2%84%EC%8A%A4-%EC%A4%91%EC%9E%AC-bus-arbitration/

 

3) 타이밍 처리 방식

 컴퓨터는 각 클럭마다 상태를 변경하며 주어진 instruction을 실행한다. 이때 컴퓨터 자체는 물리법칙을 따르는 전자 기기이기 때문에 회로가 길어지는 경우 클럭 내에 모든 회로 상에 전력을 공급할 수 없어 의도하지 않은 동작이 발생할 수도 있다. 클럭에만 의존하는지, 아니면 클럭 이상의 요소에 의존하여 타이밍을 처리하는지에 따라 다른 방법이 있다.

버스 타입 설명
synchronous 클럭에 의존하여 타이밍 제어
asynchronous 클럭 이상의 신호 등을 통해 타이밍 제어

 synchronous 방식에서는 사이클 내의 어떤 클럭에 어떤 동작을 하는지 정해져 있기 때문에 따로 메시지를 주고받지 않더라도 데이터들을 처리할 수 있다. 그러나  회로가 매우 길어지거나, 회로가 매우 빠른 경우 클럭 기반의 타이밍 처리가 어려워지기 때문에 명시적인 신호를 보내는 asynchronous 방법을 이용한다. 이 경우 버스를 통해 RD, ACK, WR 등의 신호를 직업 주고받으며 동작하므로 synchronous 방식에 비해 성능이 떨어질 수 있다.

synchronous 방식
asynchronous 방식

4) bus width

 bus width은 버스가 한 번에 전달할 수 있는 데이터의 크기를 의미한다. width은 단순히 클수록 한 번에 전송 가능한 데이터의 양이 증가하여 성능이 좋지만, 크기가 커질수록 비용 역시 크게 증가하므로 무작정 크기를 늘릴 수는 없다.

5) Data transfer type

 버스의 구조나 지원해야 하는 기능에 따라 다양한 전송 타입이 존재한다.

(1) WRITE

write ( multiplexed or dedicated )

 쓰기 모드는 버스가 dedicated / multiplexed 여부에 따라 달라진다. multiplexed 방식에서는 하나의 라인에서 주소 및 데이터를 차례대로 다른 사이클에 전송한다. 반면 dedicated 방식에서는 주소와 데이터가 각각 다른 라인을 이용하기 때문에 한 사이클 내에 동시에 전송할 수도 있다.


(2) READ

read ( multiplexed or dedicated )

 데이터를 읽기 위해서는 해당 데이터가 존재하는 주소를 먼저 파악해야 한다. 따라서 라인의 개수 차이가 있기는 해도 multiplexed나 dedicated 모두 주소를 전달한 후 데이터를 전송받게 된다.

(3) Read-Modify-Write

 read-modify-write 방식은 동일 주소에 대해 읽기 후 쓰기 동작을 수행하는 것으로, 버스를 사용하는 여러 장치들 사이에서 데이터 일관성을 유지하기 위해 필요한 전송 방식이다. 다중 프로세서 설계에 꼭 필요하며, 세마포어 등을 구현하는 데 사용된다고 한다. 위에서 언급했던 Read 후 Write 과정을 연달아하는 것이 아니라, 주소를 읽고 Data Read 및 Data Write 하는 과정 자체가 하나의 원자적 과정이라는 것이 중요하다.

https://www.eventhelix.com/fault-handling/bus-cycles/#Read-Modify-Write%20Bus%20Cycle

(4) Read-After-Write

read-after-write 방식은 동일 주소에 대해 쓰기 후 읽기 동작을 수행하는 것으로, 입력한 데이터가 제대로 작성되어 있는지 검사하는 데 사용한다. 컴퓨터의 비트는 전자 수준에서 처리되기 때문에 에러가 발생할 확률이 높다. 따라서 특정 값이 메모리나 저장 장치 전송 여부를 검증할 필요가 있는데, 이 경우에 사용하는 동작이다. 역시 하나의 atomic 한 과정이다.

Read-Modify-Write 와 Read-After-Write


(5) Block Data Transfer

Block Data Transfer

 데이터를 읽을 때는 먼저 해당 데이터가 존재하는 주소를 읽어온 후, 읽어온 주소에 액세스 하여 데이터를 가져온다. 이때 배열처럼 연달아 존재하는 데이터의 주소는 WORD(대략 컴퓨터가 데이터를 처리하는 단위)씩만 차이가 있기 때문에 첫 주소만 안다면 WORD 단위로 읽어올 수 있으며, 주소를 한 번만 전송하기 때문에 전반적인 데이터 전송 속도도 증가한다. 이렇듯 주소를 한번만 보내고 데이터를 연달아 읽어 들이는 방식이 BlockData Transfer이다.

 Block Data Transfer은 캐시 메모리를 사용할 때 꼭 필요하다. 프로세서는 정보를 1 WORD 단위로 읽어 들이지만 캐시 메모리는 MB 단위의 데이터를 저장해둘 수 있다. locality에 따라 프로세서는 현재 읽은 데이터와 공간적으로 가까운 데이터를 미래에 사용할 확률이 매우 높다. 따라서 hit rate 및 성능을 높이기 위해서는 현재 데이터 근방의 데이터들을 캐시 메모리 상에 빠르게 적재해야 하며, 이를 위해 데이터를 블록 단위로 읽어들일 수 있어야 한다.

 병렬 시스템을 구현하는 경우에도 사용하기 좋다. 병렬 시스템은 Shared Memory 또는 Message Passing 방식으로 수행할 수 있는데, 이 중 Message Passing 방식을 사용할 때 블럭 단위 메모리 전송 기능이 필요하다.

 Shared Memory 기반의 병렬 시스템은 여러 개의 CPU가 하나의 메모리를 공유하는 방식으로 동작한다. 메모리 공유 과정에서 데이터 충돌이 발생할 수 있기 때문에 프로세서를 늘리더라도 개수에 비례하게 성능이 증가하지는 않는다고 한다. 

 반면 Message Passing 기반의 병렬 시스템은 여러개의 프로세서가 각각에 대응되는 메모리를 가지고 있다. 프로세서 사이의 데이터 전송이 적게 발생하는 경우 여러 대의 컴퓨터를 돌리는 것과 유사한 효과가 나오므로 설치한 프로세서 개수에 비례하게 성능이 증가한다. 버스를 이용하여 메시지를 전달하는 메시지 패싱 방식에서는 프로세서 사이에서 전송되는 메시지를 블록 단위로 전송함으로써 성능을 높일 수 있다. 

https://en.wikipedia.org/wiki/Shared_memory#/media/File:Shared_memory.svg

 

메시지 패싱 방식을 대강 나타낸 그림


(6) Split Data Transfer

split data transfer은 마스터의 작업을 슬레이브에 분리 또는 분할하여 버스 전체의 활용도를 향상하는 기법이다. 버스는 메모리 접근 중에도 사용할 수 있으므로 높은 bandwidth을 보인다.

https://developer.arm.com/documentation/ihi0011/a/AMBA-AHB/Split-transfers


Point-To-Point Interconnection

 버스는 데이터 및 정보를 전달하기 위한 좋은 방법이다. 그러나 컴퓨터를 구성하는 각 부품들의 성능이 향상되고 수가 많아짐에 따라 버스만 이용하기에는 전체 성능을 끌어낼 수 없는 상황이 발생했다. 버스가 계속 확장됨에 따라 동기화 및 제어 기능을 시간 내에 수행하기 어려워졌고, 데이터의 전송률을 높이는 동시에 레이턴시를 줄이는 것이 버스의 복잡도를 계속 증가시켰기 때문이다. 심지어 버스는 메인보드 내에서 쉽게 교체할 수 있는 부품도 아니기 때문에 문제를 가중시켰다.

 따라서 낮은 레이턴시, 높은 데이터 전송율 및 확장성 증가를 동시에 만족하기 위한 방법을 강구했고, 기기들을 직접 연결하는 PPI(Point-To-Point Interconnection) 방법이 사용되기 시작했다. 

PPI의 특징은 다음과 같다.

  • Multiple direct connections
    : 시스템 내 여러 컴포넌트들이 버스를 거치지 않고 직접 연결된다. 따라서 중재(arbitration)가 필요 없다.
  • Layered protocol architecture
    : TCP/IP 기반의 네트워크 환경처럼 프로세서를 계층화한다. 각 계층은 서로 분리되어 있어 하나의 계층에서의 변화가 다른 계층에 영향을 주지 않도록 설계되어 개발이 편리해진다.
  • Packetized data transfer
    : 데이터는 헤더 밑 에러 검출용 코드(비트)와 함께 패킷화 되어 전송된다.

PPI & 멀티코어


QPI(QuickPath Interconnect)

QPI는 인텔이 2008년에 도입한 point-to-point interconnect 형태의 접근 방식이다. PPI의 특성을 따라 계층화되어 있다. 프로세서 내부 연결에 사용되는 기술이다.

  • Physical: 0, 1 단위로 신호를 전송하는 물리적 회로 영역
  • Link: 안정적인 신호 전송 및 흐름 조절을 수행
  • Routing: fabric 통해 패킷을 전송하는 프레임워크를 제공 ( 아직 구체적 구현은 딱히 없다고 함 )
  • Protocol: 디바이스 사이에서 데이터 패킷을 교환할 때 필요한 프로토콜을 제공

계층 구조

링크 내용 참고 : https://en.wikipedia.org/wiki/Intel_QuickPath_Interconnect

Physical Layer

 1bit 을 전송하는 와이어 쌍(송·수신)을 lane이라고 하는데,  20개의 lane을 가지고 있어 한번에 20bit씩 송수신 가능(쌍방향). 링크 레이어에서 나온 비트 스트림(80bits 단위)을 Round Robin 방식으로 각 Lane 에 분산.

  • Physical Interface : 20bit 단위 단방향 데이터 포트. 한쪽의 인터페이스에 송·수신용 하나씩
  • Multilane Distribution : link layer 에서 전달한 80비트 단위의 비트 스트림들을 round robin 방식으로 20개의 lane 분산

Link Layer

 flow control, error control 수행. 총 80비트의 데이터 단위의 flit을 가지는데 72비트는 전달하고 싶은 메시지 조각 중 하나이고, 8비트는 에러 검출을 위한 control code.

  • Flow Control: 보내는 측이 받는 측보다 빠르게 데이터를 전송하지 않도록 막고, 더 들어오는 데이터에 대해 버퍼 조절
  • Error Control: 비트 에러를 감지하여 복구

Routing Layer

 72비트의 유닛들에 대해 이동할 경로를 라우팅 테이블 기반으로 결정한다. 유닛은 64비트의 메시지와 8비트의 헤더로 구성되며, 헤더는 목적지 및 메시지 타입 정보를 가진다.

Protocol Layer

 패킷 단위로 내용을 전송하는 계층으로, 캐시 일관성 유지에 사용된다. 동일한 데이터를 여러 프로세서에서 사용하는 경우 WRITE 과정 등에 의해 캐시의 일관성이 깨질 수 있다. 이때 일관성 유지를 위해서는 특정 값을 물어보기, 값을 수정했다고 신호, 수정하라는 요청 등의 동작이 가능해야 하는데, 이런 동작이 프로토콜 레이어 수준에서 처리된다고 한다.

 참고로 캐시 일관성은 캐시 계층 상 수평 및 수직 모두를 의미한다. 

QPI speed

3.2 GHz
× 2 bits/Hz (double data rate)
× 16(20) (data bits/QPI link width)
× 2 (unidirectional send and receive operating simultaneously)
÷ 8 (bits/byte)
= 25.6 GB/s


PCIe

 PCI vs PCIe : https://www.partitionwizard.com/clone-disk/pci-vs-pcie.html

 PCI 기술은 병렬 버스 기반으로 디바이스들을 연결했으나, 해당 방식은 연결되는 기기가 많아질수록 신호 동기화 및 지연 등의 문제가 점점 커지기 때문에 전송 속력을 빠르게 만드는데 한계가 존재했다. 이에 대한 대안으로 기기들을 직렬로 연결하는 대안으로 PCIe가 제시되었다.

PCIe는 각 기기를 직렬로 연결하여 높은 capacity, 데이터 전송율을 보이며, 현재 사용하는 컴퓨터는 전반적인 성능 향상을 위해 대부분의 병렬 연결을 PCIe와 같은 직렬 연결로 변경하고 있다. I/O 디바이스를 연결하기 위한 인터페이스로, QPI처럼 계층화 되어있다. 그래픽카드같은 장치를 연결할 때 사용하는 인터페이스로, 꽤 친숙한 모습이다.

위에서부터 PCIe x4, PCIe x16, PCIe x1, PCIe X16, PCI
PCIe의 계층

Physical Layer

  QPI에서의 동작 방식과 유사하다. 여러개의(1, 4, 16 등...) Lane을 가지고 있으며, byte 스트림이 각 Lane에 Round Robin 형식으로 분배되어 전송된다. 각 데이터는 16바이트 단위로 가공된 후 2비트의 동기화용 헤더를 부착하여 130비트 단위로 처리되며, 동기화에는 스크램블러가 사용된다. sync header 2비트는 PCIe가 클럭 기반 동기화를 사용하지 않아 타이밍을 제어하기 위한 다른 동기화 수단이 필요하기 때문이라고 한다(128b/130b 참고).

스크램블러 / 디스크램블러

Data Link Layer

  • 트랜잭션 계층에 의해 생성된 트랜잭션 계층 패킷(TLP)을 시퀀싱
  • 승인 프로토콜을 통해 두 끝점 간 TLP을 안정적으로 전달할 수 있도록 보장
  • 흐름 제어, 크레딧 초기화 및 관리

Transaction Layer

 소프트웨어에게 Read, Write 요청을 받아 전송 요청 패킷을 만든 후 link layer로 보내는 역할을 수행한다. 자세한 내용은 책 혹은 위키피디아 링크를 참고하자.


 

컴퓨터의 연결 방식

  • Bus Interconnection : 버스 기반으로 병렬 연결
  • Point-To-Point Interconnection : 컴포넌트들을 직접 연결
    • QPI : 프로세서 내부에서 각 유닛을 직접 연결
    • PCIe : 하드웨어를 직렬 연결하는 인터페이스