트랜스포트 트리거드 아키텍처컴퓨터 구조에서 트랜스포트 트리거드 아키텍처(Transport triggered architecture, TTA)는 프로그램이 프로세서의 내부 전송 버스를 직접 제어하는 프로세서 설계의 한 종류이다. 계산은 데이터 전송의 부작용으로 발생한다. 즉, 기능 장치의 트리거 포트에 데이터를 기록하면 기능 장치가 계산을 시작하도록 트리거된다. 이는 순환 배열에서 일어나는 것과 유사하다. 모듈식 구조로 인해 TTA는 맞춤형 데이터패스를 갖지만 고정 기능 하드웨어 가속기의 유연성 부족과 설계 비용이 없는 응용 분야별 명령어 집합 프로세서(ASIP)에 이상적인 프로세서 템플릿이다. 일반적으로 트랜스포트 트리거드 프로세서는 여러 전송 버스와 버스에 연결된 여러 기능 장치를 가지며, 이는 명령어 수준 병렬성을 위한 기회를 제공한다. 병렬성은 프로그래머가 정적으로 정의한다. 이러한 측면(그리고 분명히 큰 명령어 워드 폭으로 인해)에서 TTA 아키텍처는 매우 긴 명령어 워드(VLIW) 아키텍처와 유사하다. TTA 명령어 워드는 여러 슬롯(버스당 한 슬롯)으로 구성되며, 각 슬롯은 해당 버스에서 발생하는 데이터 전송을 결정한다. 세분화된 제어는 기존 프로세서에서는 불가능한 일부 최적화를 허용한다. 예를 들어, 소프트웨어는 레지스터를 사용하지 않고 기능 장치 간에 데이터를 직접 전송할 수 있다. 트랜스포트 트리거링은 일반적으로 프로그래머에게 숨겨진 일부 마이크로아키텍처 세부 사항을 노출한다. 이는 프로세서의 제어 논리를 크게 단순화한다. 일반적으로 런타임에 수행되는 많은 결정이 컴파일 타임에 고정되기 때문이다. 그러나 이는 한 TTA 프로세서용으로 컴파일된 바이너리가 아키텍처에 작은 차이라도 있다면 재컴파일 없이는 다른 프로세서에서 실행되지 않는다는 것을 의미하기도 한다. 바이너리 비호환성 문제는 전체 문맥 전환을 구현하는 복잡성 외에도 TTA를 일반 목적 컴퓨팅보다 임베디드 시스템에 더 적합하게 만든다. 모든 단일 명령어 집합 컴퓨터 아키텍처 중 TTA 아키텍처는 이를 기반으로 프로세서가 구축된 몇 안 되는 아키텍처 중 하나이며, 이를 기반으로 프로세서가 상업적으로 판매된 유일한 아키텍처이다. VLIW 아키텍처와 비교한 이점TTA는 "노출된 데이터패스" VLIW 아키텍처로 볼 수 있다. VLIW는 연산을 사용하여 프로그래밍되는 반면, TTA는 연산 실행을 여러 이동 연산으로 분할한다. 낮은 수준의 프로그래밍 모델은 표준 VLIW에 비해 여러 가지 이점을 제공한다. 예를 들어, TTA 아키텍처는 VLIW보다 간단한 레지스터 파일을 사용하여 더 많은 병렬성을 제공할 수 있다. 프로그래머가 피연산자와 결과 데이터 전송의 타이밍을 제어하므로 레지스터 파일(RF)의 복잡성(입력 및 출력 포트 수)은 여러 병렬 명령어의 최악의 발행/완료 시나리오에 따라 확장될 필요가 없다. 전송 프로그래밍을 통해 가능한 중요한 고유 소프트웨어 최적화는 소프트웨어 바이패스라고 불린다. 소프트웨어 바이패스의 경우, 프로그래머는 데이터를 다음 기능 장치의 피연산자 포트로 직접 이동하여 레지스터 파일 쓰기 백을 바이패스한다. 이 최적화를 적극적으로 적용하면 결과를 레지스터 파일로 전송하는 원래 이동을 완전히 제거하여 레지스터 파일 포트 압력을 줄이고 범용 레지스터를 다른 임시 변수에 사용할 수 있다. RF 하드웨어의 필요한 복잡성을 단순화하는 것 외에도 감소된 레지스터 압력은 상당한 CPU 에너지 절약으로 이어질 수 있으며, 특히 모바일 임베디드 시스템에서 중요한 이점이다.[1] [2] 구조TTA 프로세서는 독립적인 기능 장치와 레지스터 파일로 구축되며, 이들은 전송 버스와 소켓으로 연결된다. 기능 장치각 기능 장치는 하나 이상의 연산을 구현하며, 이는 간단한 정수 덧셈에서 복잡하고 임의의 사용자 정의 응용 분야별 계산에 이르는 기능을 구현한다. 연산의 피연산자는 기능 장치 포트를 통해 전송된다. 각 기능 장치는 독립적인 파이프라인을 가질 수 있다. 기능 장치가 완전히 파이프라인화된 경우, 완료하는 데 여러 클럭 사이클이 걸리는 새로운 연산은 매 클럭 사이클마다 시작될 수 있다. 반면에 파이프라인은 이전 연산이 아직 실행 중인 동안 항상 새로운 연산 시작 요청을 수락하지 않을 수도 있다. 데이터 메모리 접근 및 프로세서 외부와의 통신은 특수 기능 장치를 사용하여 처리된다. 메모리 접근 연산을 구현하고 메모리 모듈에 연결되는 기능 장치는 종종 로드/스토어 유닛이라고 불린다. 제어 장치제어 장치는 프로그램 실행을 제어하는 특수한 기능 장치이다. 제어 장치는 실행할 명령어를 가져오기 위해 명령어 메모리에 접근할 수 있다. 실행 중인 프로그램이 실행(점프)을 프로그램의 임의의 위치로 전송할 수 있도록, 제어 장치는 제어 흐름 연산을 제공한다. 제어 장치는 일반적으로 명령어를 가져오고, 디코딩하고, 실행하는 단계를 포함하는 명령어 파이프라인을 가지고 있다. 레지스터 파일레지스터 파일에는 프로그램에서 변수를 저장하는 데 사용되는 범용 레지스터가 포함되어 있다. 기능 장치와 마찬가지로 레지스터 파일에도 입출력 포트가 있다. 읽기 및 쓰기 포트의 수, 즉 동일한 클럭 사이클에 여러 레지스터를 읽고 쓸 수 있는 기능은 각 레지스터 파일마다 다를 수 있다. 전송 버스와 소켓상호 연결 아키텍처는 소켓을 통해 기능 장치 포트에 연결되는 전송 버스로 구성된다. 연결 비용 때문에 장치(기능 장치 및 레지스터 파일) 간 연결 수를 줄이는 것이 일반적이다. TTA는 각 장치 출력 포트에서 모든 장치 입력 포트로 가는 경로가 있는 경우 완전히 연결되었다고 말한다. 소켓은 소켓의 버스-포트 연결 중 어느 것이 언제든지 활성화될지 선택하여 TTA 프로세서를 프로그래밍하는 수단을 제공한다. 따라서 클럭 사이클에 발생하는 데이터 전송은 각 버스에 대해 활성화될 소스 및 대상 소켓/포트 연결을 정의하여 프로그래밍할 수 있다. 조건부 실행일부 TTA 구현은 조건부 실행을 지원한다. 조건부 실행은 가드의 도움으로 구현된다. 각 데이터 전송은 레지스터(종종 1비트 조건부 레지스터)와 버스에 연결된 가드에 의해 조건부로 설정될 수 있다. 가드된 레지스터의 값이 거짓(0)으로 평가되는 경우, 가드가 연결된 버스에 대해 프로그래밍된 데이터 전송은 스쿼시된다. 즉, 대상에 기록되지 않는다. 무조건적인 데이터 전송은 어떤 가드에도 연결되지 않으며 항상 실행된다. 분기TTA 프로세서를 포함한 모든 프로세서는 프로그램 카운터를 변경하는 제어 흐름 명령어를 포함하며, 이는 서브루틴, if-then-else, for-loop 등을 구현하는 데 사용된다. TTA 프로세서의 어셈블리어는 일반적으로 무조건 분기(JUMP), 조건부 상대 분기(BNZ), 서브루틴 호출(CALL), 조건부 반환(RETNZ) 등 다른 프로세서의 해당 어셈블리어 명령어와 동일하게 보이는 제어 흐름 명령어를 포함한다. TTA 머신의 다른 모든 연산과 마찬가지로 이러한 명령어는 특수 기능 장치에 대한 "이동" 명령어로 구현된다. sTTAck 및 첫 번째 MOVE 프로토타입과 같이 조건부 실행을 지원하는 TTA 구현은 이러한 제어 흐름 명령어 대부분을 프로그램 카운터에 대한 조건부 이동으로 구현할 수 있다.[3][4] 맥심 인터그레이티드 MAXQ와 같이 무조건적인 데이터 전송만 지원하는 TTA 구현[5]은 일반적으로 프로그램 카운터에 단단히 연결되어 다양한 대상 주소에 응답하는 특수 기능 장치를 가지고 있다. 각 주소는 "이동"의 대상으로 사용될 때 프로그램 카운터에 다른 영향을 미친다. 각 "상대 분기 <조건>" 명령어는 각 조건에 대해 다른 대상 주소를 가지며, 다른 대상 주소는 CALL, RETNZ 등에 사용된다. 프로그래밍더 전통적인 프로세서 아키텍처에서는 프로세서가 일반적으로 실행되는 연산과 그 피연산자를 정의함으로써 프로그래밍된다. 예를 들어, RISC 아키텍처의 덧셈 명령어는 다음과 같을 수 있다. add r3, r1, r2 이 예제 연산은 범용 레지스터 r1과 r2의 값을 더하고 그 결과를 레지스터 r3에 저장한다. 대략적으로, 프로세서에서 명령어의 실행은 아마도 명령어를 제어 신호로 변환하여 상호 연결 네트워크 연결과 기능 장치를 제어하는 결과를 낳을 것이다. 상호 연결 네트워크는 레지스터 r1과 r2의 현재 값을 덧셈 연산을 실행할 수 있는 기능 장치(종종 산술 논리 장치인 ALU라고 불림)로 전송하는 데 사용된다. 마지막으로, 제어 신호가 ALU에서 덧셈 연산을 선택하고 트리거하며, 그 결과는 레지스터 r3으로 다시 전송된다. TTA 프로그램은 연산을 정의하지 않고, 피연산자 값을 읽고 쓰는 데 필요한 데이터 전송만 정의한다. 연산 자체는 연산의 트리거링 피연산자에 데이터를 기록함으로써 트리거된다. 따라서 연산은 트리거링 데이터 전송의 부작용으로 실행된다. 그러므로 TTA에서 덧셈 연산을 실행하려면 세 가지 데이터 전송 정의(이동이라고도 함)가 필요하다. 이동은 전송 버스에서 발생하는 데이터 전송의 종점을 정의한다. 예를 들어, 이동은 기능 장치 F의 포트 1에서 레지스터 파일 R의 레지스터 인덱스 2로의 데이터 전송이 버스 B1에서 발생해야 한다고 명시할 수 있다. 대상 프로세서에 여러 버스가 있는 경우, 각 버스는 동일한 클럭 사이클에 병렬로 활용될 수 있다. 따라서 동일한 명령어에 여러 데이터 전송을 스케줄링하여 데이터 전송 수준 병렬성을 활용할 수 있다. 덧셈 연산은 TTA 프로세서에서 다음과 같이 실행될 수 있다. r1 -> ALU.operand1 r2 -> ALU.add.trigger ALU.result -> r3 두 번째 이동은 ALU라고 불리는 기능 장치의 두 번째 피연산자에 쓰는 것으로, 덧셈 연산을 트리거한다. 이는 'add'의 실행 지연 시간 후에 'result' 출력 포트에서 덧셈의 결과를 사용할 수 있게 한다. ALU와 관련된 포트는 누산기 역할을 하여 기본 TTA를 추상화하는 매크로 명령어를 생성할 수 있다s: lda r1 ; "ALU 로드": 값을 ALU 피연산자 1로 이동
add r2 ; 더하기: 값을 더하기 트리거로 이동
sta r3 ; "ALU 저장": 값을 ALU 결과에서 이동
프로그래머에게 보이는 연산 지연 시간TTA의 주요 철학은 복잡성을 하드웨어에서 소프트웨어로 옮기는 것이다. 이로 인해 프로그래머에게 여러 추가적인 위험이 발생한다. 그 중 하나는 지연 슬롯이며, 이는 기능 장치의 프로그래머에게 보이는 연산 지연 시간이다. 타이밍은 전적으로 프로그래머의 책임이다. 프로그래머는 결과가 너무 일찍 읽히거나 너무 늦게 읽히지 않도록 명령어를 스케줄링해야 한다. 결과가 너무 일찍 읽히는 경우 프로세서를 잠그는 하드웨어 감지 기능은 없다. 예를 들어, 지연 시간이 1인 add 연산과 지연 시간이 3인 mul 연산을 가진 아키텍처를 생각해보자. add 연산을 트리거할 때 다음 명령어(다음 클럭 사이클)에서 결과를 읽을 수 있지만, mul의 경우 결과를 읽기 전에 두 명령어를 기다려야 한다. 결과는 트리거링 명령어 이후 세 번째 명령어에 사용할 준비가 된다. 결과를 너무 일찍 읽으면 이전에 트리거된 연산의 결과를 읽게 되거나, 기능 장치에서 이전에 트리거된 연산이 없는 경우 읽은 값이 정의되지 않는다. 반면에, 다음 연산 결과가 아직 읽히지 않은 출력 포트의 결과를 덮어쓰지 않도록 결과를 충분히 일찍 읽어야 한다. 레지스터 파일 내용 외에도 기능 장치 파이프라인 레지스터 내용 및 기능 장치 입출력 포트를 포함하는 프로그래머에게 보이는 프로세서 컨텍스트가 풍부하기 때문에 외부 인터럽트 지원에 필요한 컨텍스트 저장은 TTA 프로세서에서 구현하기 복잡하고 비용이 많이 들 수 있다. 따라서 인터럽트는 일반적으로 TTA 프로세서에서 지원되지 않고, 그들의 작업은 외부 하드웨어(예: I/O 프로세서)에 위임되거나 폴링과 같은 대체 동기화/통신 메커니즘을 사용하여 그 필요성이 회피된다. 구현
같이 보기각주
외부 링크 |
Portal di Ensiklopedia Dunia