KR20130063004A - 하드웨어 제한에 기초한 조절가능한 트랜잭션 크기를 이용하여 코드를 동적으로 최적화하는 장치, 방법 및 시스템 - Google Patents

하드웨어 제한에 기초한 조절가능한 트랜잭션 크기를 이용하여 코드를 동적으로 최적화하는 장치, 방법 및 시스템 Download PDF

Info

Publication number
KR20130063004A
KR20130063004A KR1020137007502A KR20137007502A KR20130063004A KR 20130063004 A KR20130063004 A KR 20130063004A KR 1020137007502 A KR1020137007502 A KR 1020137007502A KR 20137007502 A KR20137007502 A KR 20137007502A KR 20130063004 A KR20130063004 A KR 20130063004A
Authority
KR
South Korea
Prior art keywords
speculative
code
checkpoint
instruction
transaction
Prior art date
Application number
KR1020137007502A
Other languages
English (en)
Other versions
KR101524446B1 (ko
Inventor
쳉 왕
웨이 리우
에디슨 보린
마우리시오 쥬니어 브레터니츠
유펭 우
실리앙 후
Original Assignee
인텔 코포레이션
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 인텔 코포레이션 filed Critical 인텔 코포레이션
Publication of KR20130063004A publication Critical patent/KR20130063004A/ko
Application granted granted Critical
Publication of KR101524446B1 publication Critical patent/KR101524446B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/52Binary to binary
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30072Arrangements for executing specific machine instructions to perform conditional operations, e.g. using predicates or guards
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/30087Synchronisation or serialisation instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30105Register structure
    • G06F9/30116Shadow registers, e.g. coupled registers, not forming part of the register space
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3858Result writeback, i.e. updating the architectural state or memory

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)
  • Retry When Errors Occur (AREA)
  • Advance Control (AREA)
  • Executing Machine-Instructions (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

본 명세서에서, 트랜잭션들의 동적인 리사이징을 잠재적으로 초래하는 트랜잭션들을 조건부 커밋 및/또는 추론적 체크포인팅하는 장치 및 방법이 기술된다. 이진 코드의 동적인 최적화 동안, 동적 최적화기가 코드를 보다 공격적으로 최적화할 수 있도록 하는 메모리 순서화 보호를 제공하도록 트랜잭션들이 삽입된다. 그리고, 조건부 커밋은 동적 최적화 코드의 효율적인 실행이 가능하게 하고, 트랜잭션이 하드웨어 자원들을 소모하는 것을 방지하고자 한다. 추론적 체크포인트는 트랜잭션의 중단시에 신속하고 효율적인 복원을 가능하게 한다. 프로세서 하드웨어는 조건부 커밋 인스트럭션, 추론적 체크포인트 인스트럭션, 또는 둘 다를 인식하는 디코더들을 포함하는 것과 같이, 트랜잭션들의 동적 리사이징을 지원하도록 구성된다. 그리고, 프로세서 하드웨어는 그러한 인스트럭션들을 디코딩하는 것에 응답하여, 조건부 커밋 또는 추론적 체크포인팅을 지원하기 위한 동작들을 수행하도록 더 구성된다.

Description

하드웨어 제한에 기초한 조절가능한 트랜잭션 크기를 이용하여 코드를 동적으로 최적화하는 장치, 방법 및 시스템{APPARATUS, METHOD, AND SYSTEM FOR DYNAMICALLY OPTIMIZING CODE UTILIZING ADJUSTABLE TRANSACTION SIZES BASED ON HARDWARE LIMITATIONS}
본 발명은 프로세서의 분야에 관한 것으로서, 특히, 프로세서 상에서의 코드 최적화 및 실행에 관한 것이다.
반도체 프로세싱 및 로직 설계에서의 발전은 집적 회로 디바이스들 상에 제공될 수 있는 로직의 양이 증가되도록 허용하였다. 이전에, 단일 스레드 프로세서 상에서, 이진 코드와 같은 코드의 최적화는, 실행의 다른 스레드들에 의한 간섭의 우려가 없었기 때문에, 지나치게 공격적인 것이 허용되었다. 또한, 컴퓨터 시스템 구성들은, 시스템에서의 단일의 또는 다수의 집적 회로로부터, 개별적인 집적 회로 상에 제공되는 다수의 코어, 다수의 하드웨어 스레드, 및 다수의 논리 프로세서로 진화하였다. 전형적으로, 프로세서 또는 집적 회로는 단일의 물리적 프로세서 다이를 포함하며, 프로세서 다이는 임의의 수의 코어, 하드웨어 스레드, 또는 논리 프로세서를 포함할 수 있다. 집적 회로 상에서의 크게 증가하는 수의 프로세싱 요소들 - 코어, 하드웨어 스레드 및 논리 프로세서 - 은 보다 많은 작업들이 병렬로 달성될 수 있도록 한다. 단일 스레드 프로세서로부터 보다 병렬적인 다중 스레드 실행으로의 이러한 발전은 코드 최적화에 제한을 초래하였다.
Figure pct00001
의사 코드 A: 단일 스레드 코드 최적화의 실시예
예를 들어, 의사 코드 A는 [r2] 및 [r2+4]에서의 메모리들로부터의 로드(load)들이 PRLE(Partial Redundancy Load Elimination) 최적화에 의해 헤더 블록(B3)에 대한 루프로부터 호이스팅(hoisting)되는 이진 코드의 최적화를 도시한다. 그리고, [r2+4]에서의 메모리에 대한 저장(store)이 PDSE(Partial Dead Store Elimination) 최적화에 의해 테일(tail) 블록(B4)에 대한 루프로부터 싱크(sink)된다. 이러한 최적화는 단일 스레드 환경에서 동작할 수 있다. 그러나, 다중 스레드 애플리케이션들에서, 다른 스레드들이 루프 실행 동안 [r2] 또는 [r2+4]에서 메모리에 기록/메모리로부터 판독할 수 있으며, 잠재적으로 그것은 메모리 동작들의 실행 순서에서의 변경으로 인한 무효 실행을 초래하게 된다.
본 발명은 예를 통해 도시되며, 첨부된 도면들의 도면에 의해 제한되는 것으로 의도되지 않는다.
도 1은 원자(atomic) 영역들의 동적 리사이징 및 원자 실행을 지원하도록 구성된 멀티프로세싱 요소 프로세서의 논리적 표현의 실시예를 도시한다.
도 2a는 하드웨어 자원 제한들에 기초하여 트랜잭션들의 동적 리사이징을 제공하는 것을 포함하는 코드 최적화 방법에 대한 흐름도의 실시예를 도시한다.
도 2b는 조건부 커밋 코드(conditional commit code)를 삽입하기 위한 도 2a의 흐름도의 실시예를 도시한다.
도 3a는 실행 동안에 트랜잭션을 동적으로 리사이징하는 방법에 대한 흐름도의 실시예를 도시한다.
도 3b는 실행을 계속하기 위해 조건부 커밋 포인트에서 충분한 하드웨어 자원들이 존재하는지 여부를 결정하기 위한 도 3a의 흐름도의 실시예를 도시한다.
도 4는 트랜잭션들의 동적 리사이징을 지원하도록 구성된 하드웨어의 논리적 표현의 실시예를 도시한다.
도 5는 트랜잭션들의 동적 리사이징을 지원하도록 구성된 하드웨어의 논리적 표현의 다른 실시예를 도시한다.
도 6은 트랜잭션들의 동적 리사이징을 지원하도록 구성된 하드웨어의 논리적 표현의 다른 실시예를 도시한다.
도 7a는 트랜잭션 내에 추론적 체크포인트(speculative checkpoint)들을 제공하는 것을 포함하는 코드 최적화 방법에 대한 흐름도의 실시예를 도시한다.
도 7b는 추론적 체크포인트 코드를 삽입하기 위한 도 7a의 흐름도의 실시예를 도시한다.
도 8은 트랜잭션의 실행 동안 메모리를 추론적으로 체크포인팅하는 방법에 대한 흐름도의 실시예를 도시한다.
도 9는 메모리의 추론적 체크포인팅을 지원하도록 구성된 하드웨어의 논리적 표현의 실시예를 도시한다.
도 10은 레지스터 파일의 추론적 체크포인팅을 지원하도록 구성된 하드웨어의 논리적 표현의 다른 실시예를 도시한다.
도 11은 캐시 메모리의 추론적 체크포인팅을 지원하도록 구성된 하드웨어의 논리적 표현의 다른 실시예를 도시한다.
이하의 설명에서, 본 발명에 대한 완전한 이해를 제공하기 위해, 특정 유형의 프로세서 코어들, 특정 프로세서 구성들, 특정 인스트럭션 유형들, 특정 하드웨어 구조들, 특정 코드 최적화 기법들 등의 예들과 같은 많은 특정한 세부사항들이 개시된다. 그러나, 당업자라면, 본 발명을 실시하기 위해 이들 특정한 세부사항들을 이용할 필요는 없음을 명백히 알 것이다. 다른 경우들에 있어서, 특정한, 그리고 대안적인 프로세서 아키텍쳐, 기술된 알고리즘들에 대한 특정 로직 회로/코드, 특정 코드 구현들, 특정 컴파일러 세부사항들, 및 마이크로프로세서들의 다른 특정 동작 세부사항들과 같은 잘 알려진 구성요소들 또는 방법들은, 본 발명을 불필요하게 불명료하게 하지 않도록, 상세히 기술되지 않는다.
본 명세서에서 기술된 방법 및 장치는 하드웨어 제약들에 기초하여 동적으로 사이징된 트랜잭션들을 이용하여 코드를 최적화하기 위한 것이다. 구체적으로, 코드의 최적화는 하드웨어 제약들을 이용한 트랜잭션들의 조건부 커밋 및/또는 추론적 체크포인팅에 대하여 기술된다. 또한, 본 명세서에서 기술된 장치 및 방법은, 그것들이 임의의 형태의 동적으로 사이징된 트랜잭션으로 구현될 수 있으므로, 그렇게 제한되지 않는다. 예를 들어, 코드의 최적화는 정적으로 또는 동적으로 수행될 수 있을 뿐만 아니라, 하드웨어, 소프트웨어, 또는 그들의 조합 내에서 수행될 수 있다.
도 1을 참조하면, 다수의 코어를 포함하는 프로세서의 실시예가 도시된다. 프로세서(100)는 마이크로프로세서, 내장형 프로세서, DSP(digital signal processor), 네트워크 프로세서, 또는 코드 실행을 위한 다른 디바이스와 같은 임의의 프로세서를 포함한다. 프로세서(100)는, 일 실시예에서, 비대칭 코어 또는 대칭 코어(도시된 실시예)를 포함할 수 있는 적어도 2개의 코어(코어(101 및 102))를 포함한다. 그러나, 프로세서(100)는 대칭적이거나 또는 비대칭적일 수 있는 임의의 수의 프로세싱 요소들을 포함할 수 있다.
일 실시예에서, 프로세싱 요소들은 스레드 유닛, 스레드 슬롯, 프로세스 유닛, 콘택스트(context), 논리적 프로세서, 하드웨어 스레드, 코어, 및/또는 실행 상태 또는 아키텍쳐 상태와 같은, 프로세서에 대한 상태를 유지할 수 있는 임의의 다른 요소를 지칭한다. 즉, 프로세싱 요소는, 일 실시예에서, 소프트웨어 스레드, 운영 체제, 애플리케이션, 또는 다른 코드와 같은 코드와 독립적으로 관련될 수 있는 임의의 하드웨어를 지칭한다. 전형적으로, 물리적 프로세서는 코어들 또는 하드웨어 스레드들과 같은 임의의 수의 다른 프로세싱 요소들을 잠재적으로 포함하는 집적 회로를 지칭한다.
때때로, 코어는 독립적인 아키텍쳐 상태를 유지할 수 있는 집적 회로 상에 위치된 로직을 지칭하며, 각각 독립적으로 유지된 아키텍쳐 상태는 적어도 일부의 전용 실행 자원들과 관련된다. 코어와는 반대로, 하드웨어 스레드는 독립적인 아키텍쳐 상태를 유지할 수 있는 집적 회로 상에 위치된 임의의 로직을 전형적으로 지칭하며, 독립적으로 유지된 아키텍쳐 상태들은 실행 자원들에 대한 액세스를 공유한다. 볼 수 있듯이, 소정의 자원들이 공유되고, 다른 것들은 아키텍쳐 상태에 전용될 때, 코어와 하드웨어 스레드의 명명(nomenclature) 사이의 선이 중첩된다. 또한, 코어와 하드웨어 스레드는 운영 체제에 의해 개별적인 논리적 프로세서들로서 보여지며, 운영 체제는 각각의 논리적 프로세서 상에서의 동작들을 개별적으로 스케쥴링할 수 있다.
도 1에 도시된 바와 같이, 물리적 프로세서(100)는 2개의 코어, 즉, 코어(101 및 102)를 포함한다. 여기서, 코어(101 및 102)는 대칭적 코어들, 즉, 동일한 구성들, 기능 유닛들, 및/또는 로직을 갖는 코어들로서 고려된다. 다른 실시예에서, 코어(101)는 비순차적(out-of-order) 프로세서 코어를 포함하는 반면, 코어(102)는 순차적(in-order) 프로세서 코어를 포함한다. 그러나, 코어들(101 및 102)은 네이티브(native) 코어, 소프트웨어 관리형 코어, 네이티브 ISA(Instruction Set Architecture)를 실행하도록 구성된 코어, 변환된 ISA를 실행하도록 구성된 코어, 공동 설계(co-designed) 코어, 또는 다른 알려진 코어와 같은 임의의 유형의 코어로부터 개별적으로 선택될 수 있다. 설명에 부가하여, 코어(101)에 도시된 기능 유닛들이 이하에 보다 상세히 기술되며, 코어(102)에서의 유닛들은 유사한 방식으로 동작한다.
도시된 바와 같이, 코어(101)는 하드웨어 스레드 슬롯들(101a 및 101b)로서 지칭될 수도 있는 2개의 하드웨어 스레드들(101a 및 101b)을 포함한다. 따라서, 일 실시예에서 운영 체제와 같은 소프트웨어 엔티티들은, 잠재적으로 프로세서(100)를 4개의 분리된 프로세서들, 즉, 4개의 소프트웨어 스레드들을 동시에 실행할 수 있는 4개의 논리적 프로세서들 또는 프로세싱 요소들로서 간주한다. 전술한 것 외에, 제1 스레드는 아키텍쳐 상태 레지스터들(101a)과 관련되고, 제2 스레드는 아키텍쳐 상태 레지스터들(101b)과 관련되고, 제3 스레드는 아키텍쳐 상태 레지스터들(102a)와 관련될 수 있고, 제4 스레드는 아키텍쳐 상태 레지스터들(102b)과 관련될 수 있다. 도시된 바와 같이, 아키텍쳐 상태 레지스터들(101a)은 아키텍쳐 상태 레지스터들(101b)에서 복제되어, 개별적인 아키텍쳐 상태들/콘택스트들이 논리적 프로세서(101a) 및 논리적 프로세서(101b)에 대해 저장될 수 있다. 코어(101)에서, 인스트럭션 포인터들 및 리네임(rename) 할당기 로직(130)에서의 리네이밍 로직과 같은 다른 보다 작은 자원들이 스레드들(101a 및 101b)에 대해 또한 복제될 수 있다. 재순서화(reorder)/폐기(retirement) 유닛(135)에서의 재순서화 버퍼들, ILTB(120), 로드/저장 버퍼들, 및 큐(queue)들과 같은 일부 자원들이 파티셔닝을 통해 공유될 수 있다. 범용 내부 레지스터들, 페이지-테이블 베이스 레지스터, 하위 레벨 데이터 캐시 및 데이터-TLB(115), 실행 유닛(들)(140), 및 비순차적 유닛(135)의 부분들과 같은 다른 자원들이 잠재적으로 완전히 공유된다.
프로세서(100)는 때로는, 완전히 공유되고, 파티셔닝을 통해 공유되고, 또는 프로세싱 요소들에 의해/프로세싱 요소들로 전용될 수 있는 다른 자원들을 포함한다. 도 1에서, 프로세서의 예시적인 논리적 유닛들/자원들을 갖는 단지 예시적인 프로세서의 실시예가 도시된다. 프로세서는 이들 기능 유닛들 중 임의의 것을 포함하거나 또는 생략할 수 있고, 또한 도시되지 않은 임의의 다른 알려진 기능 유닛들, 로직들 또는 펌웨어를 포함할 수 있음을 주지해야 한다. 도시된 바와 같이, 코어(101)는 간략화된, 대표적인 비순차적(000) 프로세서 코어를 포함한다. 000 코어는 실행되고/취해질 브랜치(branch)들을 예측하기 위한 브랜치 타겟 버퍼(120) 및 인스트럭션들에 대한 어드레스 변환 엔트리들을 저장하기 위한 I-TLB(instruction-translation buffer)(120)를 포함한다.
코어(101)는 페치된 요소들을 디코딩하기 위해 페치(fetch) 유닛(120)에 연결된 디코드 모듈(125)을 더 포함한다. 페치 로직은, 일 실시예에서, 스레드 슬롯들(101a, 101b)과 각각 관련된 개별적인 시퀀서들을 포함한다. 통상적으로, 코어(101)는 프로세서(100) 상에서 실행가능한 인스트럭션들을 정의/특정하는 제1 ISA(Instruction Set Architecture)와 관련된다. 여기서, 때때로 제1 ISA의 부분인 기계 코드 인스트럭션들은, 수행될 인스트럭션 또는 동작을 참조/특정하는 (오피코드(opcode) 라고 지칭되는) 인스트럭션의 일부를 포함한다. 디코드 로직(125)은 그들의 오피코드들로부터의 이들 인스트럭션들을 인식하고, 제1 ISA에 의해 정의된 바와 같은 프로세싱을 위해 파이프라인 상에서 디코딩된 인스트럭션들을 전달하는 회로를 포함한다. 예를 들어, 이하에 보다 상세히 기술되는 바와 같이, 디코더들(125)은, 일 실시예에서, 조건부 커밋 인스트럭션 및/또는 추론적 체크포인트 인스트럭션과 같은 특정의 새로운 인스트럭션들을 인식하도록 설계되거나 또는 구성된 로직을 포함한다. 결과로서 또는 디코더들(125)에 의한 인식에 의해, 아키텍쳐 또는 코어(101)는 특정의 사전정의된 동작들을 취하여, 적절한 인스트럭션과 관련된 작업들을 수행한다.
일례에서, 할당기 및 리네이머 블록(130)은 인스트럭션 프로세싱 결과들을 저장하는 레지스터 파일들과 같은 자원들을 보유(reserve)하는 할당기를 포함한다. 그러나, 스레드들(101a 및 101b)은 잠재적으로 비순차적 실행이 가능하며, 할당기 및 리네이머 블록(130)은 인스트럭션 결과들을 추적하기 위한 재순서화 버퍼들과 같은 다른 자원들을 또한 보유한다. 또한, 유닛(130)은 프로세서(100) 내부의 다른 레지스터들에 대해 프로그램/인스트럭션 참조 레지스터들을 리네이밍하는 레지스터 리네이머를 포함할 수 있다. 재순서화/폐기 유닛(135)은 위에서 언급한 재순서화 버퍼들, 로드 버퍼들, 및 저장 버퍼들과 같은 구성요소들을 포함하여, 비순차적 실행 및 이후의 비순차적 실행된 인스트럭션들의 순차적 폐기를 지원한다.
스케쥴러 및 실행 유닛(들) 블록(140)은, 일 실시예에서, 실행 유닛들 상에서의 인스트럭션들/동작을 스케쥴링하는 스케쥴러 유닛을 포함한다. 예를 들어, 부동 소수점(floating point) 인스트럭션이, 이용가능한 부동 소수점 실행 유닛을 갖는 실행 유닛의 포트 상에서 스케쥴링된다. 실행 유닛들과 관련된 레지스터 파일들이 또한 정보 인스트럭션 프로세싱 결과들을 저장하기 포함된다. 예시적인 실행 유닛들은 부동 소수점 실행 유닛, 정수 실행 유닛, 점프 실행 유닛, 로드 실행 유닛, 저장 실행 유닛 및 다른 알려진 실행 유닛들을 포함한다.
하위 레벨 데이터 캐시 및 데이터 변환 버퍼(D-TLB)(150)가 실행 유닛(들)(140)에 연결된다. 데이터 캐시는 메모리 일관성(coherency) 상태들에서 잠재적으로 유지되는, 데이터 오퍼랜드와 같은 요소들 상에서 최근에 이용/동작된 것을 저장하기 위한 것이다. D-TLB는 물리적 어드레스 변환들에 대한 최근의 가상/선형의 것을 저장하기 위한 것이다. 특정 예로서, 프로세서는 물리적 메모리를 복수의 가상 페이지로 분할하는 페이지 테이블 구조를 포함할 수 있다.
여기서, 코어들(101 및 102)은, 최근에 페치된 요소들을 캐싱하기 위한, 상위 레벨 또는 더 먼(further-out) 캐시(110)에 대한 액세스를 공유한다. 상위 레벨 또는 더 먼 이라는 것은 실행 유닛(들)로부터 증가되거나 또는 더 멀어지는 캐시 레벨들을 지칭함을 주지해야 한다. 일 실시예에서, 상위 레벨 캐시(110)는 제2 또는 제3 레벨 데이터 캐시와 같은 최종 레벨 데이터 캐시 - 프로세서(100) 상의 메모리 계층구조에서의 최종 캐시 - 이다. 그러나, 상위 레벨 캐시(110)는, 그것이 인스트럭션 캐시와 관련되거나 또는 인스트럭션 캐시를 포함할 수 있으므로, 그렇게 제한되지 않는다. 트레이스(trace) 캐시 - 인스트럭션 캐시의 일 유형 - 가 대신에 디코더(125) 이후에 연결되어 최근에 디코딩된 트레이스들을 저장할 수 있다.
도시된 구성에서, 프로세서(100)는 시스템 메모리(175), 칩셋, 노스브리지(northbridge), 또는 다른 집적 회로와 같은, 프로세서(100) 외부의 디바이스들과 통신하기 위한 버스 인터페이스 모듈(105)을 또한 포함한다. 메모리(175)는 프로세서(100)에 전용이거나 또는 시스템에서의 다른 디바이스들과 공유될 수 있다. 메모리(175)의 유형에 대한 일반적인 예는 DRAM(dynamic random access memory), SRAM(static RAM), NV 메모리(non-volatile memory) 및 다른 알려진 저장 디바이스들을 포함한다.
일 실시예에서, 프로세서(100)는 하드웨어 트랜잭션 실행, 소프트웨어 트랜잭션 실행, 또는 그들의 조합 혹은 하이브리드가 가능하다. 코드의 임계(critical) 또는 원자 섹션/영역으로서 지칭될 수도 있는 트랜잭션은, 원자 그룹으로서 실행될 인스트럭션들, 동작들, 또는 마이크로 동작들의 그룹화를 포함한다. 예를 들어, 인스트럭션들 또는 동작들은 트랜잭션 또는 임계 섹션을 구분하는데 이용될 수 있다. 일 실시예에서, 이하에 보다 상세히 기술되는 바와 같이, 이들 인스트럭션들은 전술한 디코더들과 같은 프로세서(100)의 하드웨어에 의해 인식가능한 ISA와 같은 인스트럭션들의 세트의 일부이다. 때때로, 이들 인스트럭션들은, 일단 상위 레벨 언어로부터 하드웨어 인식가능한 어셈블리 언어로 컴파일되면, 디코더가 디코드 단계 동안 인식하는 동작 코드들(오피코드들) 또는 인스트럭션들의 다른 부분들을 포함한다.
전형적으로, 트랜잭션의 실행 동안, 메모리에 대한 업데이트들은, 트랜잭션이 커밋될 때까지, 광역적으로 가시적으로 되지 않는다. 예로서, 위치에 대한 트랜잭션 기록은 로컬 스레드에 대해 잠재적으로 가시적이며, 또한, 다른 스레드로부터의 판독에 응답하여 기록 데이터는, 트랜잭션 기록을 포함하는 트랜잭션이 커밋될 때까지 전달되지 않는다. 트랜잭션이 여전히 펜딩(pending) 중인 동안, 이하에 보다 상세히 기술되는 바와 같이, 메모리 내로부터 로딩 및 메모리 내로 기록된 데이터 항목들/요소들이 추적된다. 트랜잭션이 커밋 포인트에 도달하면, 트랜잭션에 대해 충돌이 검출되지 않는 경우, 트랜잭션이 커밋되고, 트랜잭션이 광역적으로 가시적으로 되는 동안 업데이트들이 행해진다. 그러나, 트랜잭션이 그의 펜던시(pendency) 동안 무효하다면, 트랜잭션은 중단(abort)되고, 업데이트들이 광역적으로 가시적으로 되지 않으면서, 잠재적으로 재시작된다. 그 결과, 본 명세서에서 이용된 바와 같이, 트랜잭션의 펜던시는, 실행을 시작하였지만, 커밋 또는 중단되지 않은, 즉, 펜딩인 트랜잭션을 지칭한다.
STM(Software Transactional Memory) 시스템은, 때로는 소프트웨어 코드의 실행 내에서 또는 적어도 기본적으로 소프트웨어 코드의 실행을 통한 액세스 추적, 충돌 레졸루션, 또는 다른 트랜잭션 메모리 작업들을 수행하는 것을 지칭한다. 일 실시예에서, 프로세서(100)는 하드웨어/로직을 이용하여, 즉, HTM(Hardware Transactional Memory) 시스템 내에서 트랜잭션들을 실행할 수 있다. 많은 특정 구현 세부사항들이, HTM을 구현할 때 아키텍쳐 및 마이크로아키텍쳐 관점 둘다로부터 존재하며, 그 대부분은 본 발명을 불필요하게 불명료하게 하지 않도록 본 명세서에서 기술되지 않는다. 그러나, 일부 구조들, 자원들, 및 구현들은 예시적인 목적으로 개시된다. 또한, 이들 구조들 및 구현들이 요구되는 것은 아니며, 상이한 구현 세부사항들을 갖는 다른 구조들로 증가 및/또는 대체될 수 있음을 주지해야 한다.
조합으로서, 프로세서(100)는 STM 및 HTM 시스템들 둘다의 이점을 이용하고자 하는 UTM(unbounded transactional memory) 시스템 내의 트랜잭션들을 실행할 수 있다. 예를 들어, HTM은 때로는 작은 트랜잭션들을 실행하는데 있어 고속이며 효율적인데, 그 이유는 트랜잭션들에 대한 액세스 추적, 충돌 검출, 유효화 및 트랜잭션들에 대한 커밋 모두를 수행하는데 있어 소프트웨어에 의존하지 않기 때문이다. 그러나, HTM들은 통상적으로 보다 작은 트랜잭션들만을 처리할 수 있는 반면, STM들은 제한되지 않은 크기의 트랜잭션들을 처리할 수 있다. 따라서, 일 실시예에서, UTM 시스템은 보다 작은 트랜잭션들을 실행하기 위한 하드웨어, 및 하드웨어에 대해 너무 큰 트랜잭션들을 실행하기 위한 소프트웨어를 이용한다. 이하의 설명으로부터 볼 수 있듯이, 소프트웨어가 트랜잭션들을 처리하는 때에도, 하드웨어는 소프트웨어를 돕고, 가속시키는데 이용될 수 있다. 더욱이, 동일한 하드웨어를 이용하여 순수한 STM 시스템을 지원 및 가속시킬 수 있음을 주지하는 것이 중요하다.
전술한 바와 같이, 트랜잭션들은 프로세서(100) 내의 로컬 프로세싱 요소들 및 잠재적으로 다른 프로세싱 요소들 둘다에 의한 데이터 항목들에 대한 트랜잭션 메모리 액세스들을 포함한다. 트랜잭션 메모리 시스템에서의 안전 메카니즘들 없이, 이들 액세스들 중 일부는 잠재적으로 무효 데이터 및 실행, 즉, 판독을 무효화하는 데이터에 대한 기록, 또는 무효 데이터의 판독을 초래할 것이다. 그 결과, 프로세서(100)는 잠재적으로, 후술한 바와 같은 판독 모니터들 및 기록 모니터들과 같은, 잠재적인 충돌들의 식별을 위한 데이터 항목들에 대한 및 그러한 데이터 항목들로부터의 메모리 액세스들을 추적 또는 모니터링하기 위한 로직을 포함한다.
데이터 항목 또는 데이터 요소는 하드웨어, 소프트웨어 또는 그들의 조합에 의해 정의된, 임의의 입도(granularity) 레벨에서의 데이터를 포함할 수 있다. 데이터, 데이터 요소들, 데이터 항목들, 또는 그것에 대한 참조들의 예들의 전부는 아닌 리스트는, 메모리 어드레스, 데이터 오브젝트, 클래스, 동적 언어 코드의 유형의 필드, 동적 언어 코드의 유형, 변수, 오퍼랜드, 데이터 구조, 및 메모리 어드레스에 대한 간접적 참조를 포함한다. 그러나, 데이터의 임의의 알려진 그룹화는 데이터 요소 또는 데이터 항목으로서 지칭될 수 있다. 동적 언어 코드의 유형의 필드 및 동적 언어 코드의 유형과 같은, 전술한 예들 중 일부는 동적 언어 코드의 데이터 구조들을 지칭한다. 예시를 위해, 썬 마이크로시스템즈, 인크(Sun Microsystems, Inc)로부터의 Java™와 같은 동적 언어 코드는 강형(strongly typed) 언어이다. 각각의 변수는 컴파일 시간에 알려지는 유형을 갖는다. 유형들은 2개의 카테고리 - 기본 유형들(부울 및 수치, 예를 들면, int, float) 및 참조 유형들(클래스들, 인터페이스들 및 어레이들) - 로 나누어진다. 참조 유형들의 값들은 오브젝트들에 대한 참조들이다. Java™에서, 필드들로 구성되는 오브젝트는 클래스 인스턴스(class instance) 또는 어레이일 수 있다. 클래스 A의 오브젝트가 주어진다면, 유형 A의 필드 x를 지칭하기 위해 표기 A::x를 이용하고, 클래스 A의 오브젝트 a의 필드 x를 지칭하기 위해 a.x를 이용하는 것이 일반적이다. 예를 들어, 표현은 a.x = a.y + a.z로서 표현될 수 있다. 여기서, 필드 y 및 필드 z는 더해지도록 로딩되고, 그 결과는 필드 x에 기록될 것이다.
따라서, 데이터 항목들에 대한 메모리 액세스들을 모니터링/버퍼링하는 것은 임의의 데이터 레벨 입도에서 수행될 수 있다. 예를 들어, 일 실시예에서, 데이터에 대한 메모리 액세스들은 유형 레벨에서 모니터링된다. 여기서, 필드 A::a에 대한 트랜잭션 기록 및 필드 A::y의 논-트랜잭션(non-transaction) 로드는 동일한 데이터 항목, 즉, 유형 A에 대한 액세스들로서 모니터링될 수 있다. 다른 실시예에서, 메모리 액세스 모니터링/버퍼링은 필드 레벨 입도에서 수행된다. 여기서, A::x에 대한 트랜잭션 기록 및 A::y의 논-트랜잭션 로드는, 그들이 분리된 필드들에 대한 참조들이므로, 동일한 데이터 항목에 대한 액세스들로서 모니터링되지 않는다. 다른 데이터 구조들 또는 프로그래밍 기법들이 데이터 항목들에 대한 메모리 액세스들을 추적시에 고려될 수 있음을 주지해야 한다. 예로서, 클래스 A의 오브젝트의 필드들 x 및 y, 즉, A::x 및 A::y, 클래스 B의 오브젝트들에 대한 포인트는, 새롭게 할당된 오브젝트들로 초기화되고, 초기화 이후에 결코 기록되지 않는 것으로 가정한다. 일 실시예에서, A::x에 의해 포인팅된 객체의 필드 B::z에 대한 트랜잭션 기록은 A::y에 의해 포인팅된 객체의 필드 B::z의 논-트랜잭션 로드와 관련하여 동일한 데이터 항목에 대한 메모리 액세스로서 모니터링되지 않는다. 이러한 예들로부터 추정하면, 모니터들은 임의의 데이터 입도 레벨에서 모니터링/버퍼링을 수행할 수 있음을 결정할 수 있다.
일 실시예에서, 프로세서(100)는 액세스들, 및 데이터 항목들과 관련된 잠재적인 후속 충돌들을 검출 또는 추적하기 위한 모니터들을 포함한다. 일례로서, 프로세서(100)의 하드웨어는, 모니터링되는 것으로서 그에 따라 결정되는 로드들 및 저장들을 추적하기 위한 판독 모니터들 및 기록 모니터들을 포함한다. 예로서, 하드웨어 판독 모니터들 및 기록 모니터들은 기본적인 저장 구조들의 입도에도 불구하고, 데이터 항목들의 입도에서 데이터 항목들을 모니터링하기 위한 것이다. 일 실시예에서, 데이터 항목은 적어도 전체 데이터 항목이 적절하게 모니터링되도록 보장하기 위해 저장 구조들의 입도에서 관련된 메카니즘들을 추적함으로써 경계가 정해진다.
특정한 예시적인 예로서, 판독 및 기록 모니터들은 하위 레벨 데이터 캐시(150) 내의 위치들과 같은 캐시 위치들과 관련된 속성들을 포함하여, 그러한 위치들과 관련된 어드레스들로부터 로드들 및 그러한 어드레스에 대한 저장들을 모니터링한다. 여기서, 데이터 캐시(150)의 캐시 위치에 대한 판독 속성은, 동일한 어드레스에 대한 잠재적인 충돌 기록들에 대한 모니터에 대한 캐시 위치와 관련된 어드레스에 대한 판독 이벤트시에 설정된다. 이 경우, 기록 속성들은 동일한 어드레스에 대한 잠재적인 충돌 판독들 및 기록들에 대한 모니터에 대한 기록 이벤트들에 대해 유사한 방식으로 동작한다. 이러한 예에 대해 또한, 하드웨어는 캐시 위치들이 모니터링됨을 나타내도록 설정된 판독 및/또는 기록 속성들을 갖는 캐시 위치들에 대한 판독들 및 기록들에 대한 스누프(snoop)들에 기초하여 충돌을 검출할 수 있다. 반대로, 판독 및 기록 모니터들을 설정하거나, 버퍼링된 상태에 대한 캐시 위치를 업데이트하는 것은, 일 실시예에서, 다른 캐시들에서 모니터링된 어드레스들을 갖는 충돌들이 검출되도록 허용하는 판독 요청들 또는 소유권 요청들에 대한 판독과 같은 스누프들을 초래한다.
따라서, 설계에 기초하여, 캐시 라인들의 모니터링된 일관성 상태들 및 캐시 일관성 요청들의 상이한 조합들이, 공유된 판독 모니터링된 상태에서의 데이터 항목을 유지하는 캐시 라인 및 데이터 항목에 대한 기록 요청을 나타내는 스누프와 같은 잠재적인 충돌들을 초래한다. 반대로, 버퍼링된 기록 상태에 있는 데이터 항목 및 데이터 항목에 대한 판독 요청을 나타내는 외부의 스누프를 유지하는 캐시 라인이 잠재적으로 충돌하는 것으로 고려될 수 있다. 일 실시예에서, 액세스 요청들 및 속성 상태들의 그러한 조합들을 검출하기 위해, 스누프 로직이 충돌 검출/보고를 위한 모니터들 및/또는 로직과 같은 충돌 검출/보고 로직 뿐만 아니라, 충돌들을 보고하기 위한 상태 레지스터들에 연결된다.
그러나, 조건들 및 시나리오들의 임의의 조합이 트랜잭션에 대해 무효화하는 것으로 고려될 수 있다. 트랜잭션의 논-커밋(non-commit)에 대해 고려될 수 있는 요인(factor)들의 예는, 트랜잭션 액세스된 메모리 위치에 대한 충돌 검출, 모니터 정보 소실, 버퍼링된 데이터 소실, 트랜잭션 액세스된 데이터 항목과 관련된 메타데이터 소실, 및 간섭, 링 천이 또는 명시적인 사용자 인스트럭션과 같은 다른 무효화하는 이벤트 검출을 포함한다.
일 실시예에서, 프로세서(100)의 하드웨어는 버퍼링된 방식으로 트랜잭션 업데이트들을 유지한다. 전술한 바와 같이, 트랜잭셕 기록들은 트랜잭션의 커밋시까지 광역적으로 가시적으로 되지 않는다. 그러나, 트랜잭션 기록들과 관련된 로컬 소프트웨어 스레드는 후속하는 트랜잭션 액세스들에 대한 트랜잭션 업데이트들을 액세스할 수 있다. 첫 번째 예로서, 프로세서(100)에 분리된 버퍼 구조가 제공되어 버퍼링된 업데이트들을 유지하며, 그것은 로컬 스레드에 대한 업데이트를 제공할 수 있지만, 다른 외부 스레드들에 대해서는 그렇지 않다.
반대로, 다른 예로서, 데이터 캐시(150)와 같은 캐시 메모리가, 동일한 트랜잭션 기능을 제공하면서, 업데이트들을 버퍼링하는데 이용된다. 여기서, 캐시(150)는 버퍼링된 일관성 상태에서 데이터 항목들을 유지할 수 있으며, 하나의 경우에 있어서, 새로운 버퍼링된 일관성 상태가, MESI(Modified Exclusive Shared Invalid) 프로토콜과 같은 캐시 일관성 프로토콜에 추가되어, MESIB 프로토콜을 형성한다. 버퍼링된 데이터 항목 - 데이터 항목은 버퍼링된 일관성 상태에 유지됨 - 에 대한 로컬 요청들에 응답하여, 캐시(150)는 데이터 항목을 로컬 프로세싱 요소에 제공함으로써, 내부적인 트랜잭션 순차 순서화(ordering)를 보장한다. 그러나, 외부 액세스 요청들에 응답하여, 미스(miss) 응답이 제공되어 트랜잭션 업데이트된 데이터 항목이 커밋시까지 광역적으로 가시적으로 되지 않도록 보장한다. 더욱이, 캐시(150)의 라인이 버퍼링된 일관성 상태에 유지되고, 제거(eviction)를 위해 선택될 때, 버퍼링된 업데이트는 상위 레벨 캐시 메모리들에 다시 기록되지 않는다 - 버퍼링된 업데이트는 메모리 시스템을 통해 확산되지 않는데, 즉, 커밋 이후까지 광역적으로 가시적으로 되지 않는다. 그 대신에, 트랜잭션은 중단되거나, 또는 제거된 라인이 데이터 캐시와, 희생(victim) 캐시와 같은 상위 레벨 캐시 메모리들 사이의 추론적인 구조에 저장될 수 있다. 커밋시에, 버퍼링된 라인들이 수정된 상태로 천이되어, 데이터 항목을 광역적으로 가시적으로 되도록 한다.
내부 및 외부라는 용어들은, 때로는 캐시를 공유하는 프로세싱 요소들 또는 트랜잭션의 실행과 관련된 스레드의 관점에 대한 것임을 주지해야 한다. 예를 들어, 트랜잭션의 실행과 관련된 소프트웨어 스레드를 실행하기 위한 제1 프로세싱 요소는 로컬 스레드라고 지칭된다. 따라서, 위에서의 설명에서, 어드레스에 대한 캐시 라인이 버퍼링된 일관성 상태에서 유지되도록 하는, 제1 스레드에 의해 이전에 기록된 어드레스에 대한 저장 또는 어드레스로부터의 로드가 수신된다면, 캐시 라인의 버퍼링된 버전이 제1 스레드에 제공되는데, 그것이 로컬 스레드이기 때문이다. 반대로, 제2 스레드는 동일한 프로세서 내의 다른 프로세싱 요소 상에서 실행될 수 있지만, 버퍼링된 상태에서 유지되는 캐시 라인에 대해 책임이 있는 트랜잭션의 실행과 관련되지 않으며 - 외부 스레드 -, 따라서 어드레스에 대한 제2 스레드로부터의 로드 또는 저장이 캐시 라인의 버퍼링된 버전을 미스(miss)하고, 보통의 캐시 대체가 이용되어 상위 레벨 메모리로부터 캐시 라인의 비버퍼링된 버전을 검색한다.
일 실시예에서, 프로세서(100)는 컴파일러/최적화 코드(177)를 실행하여 애플리케이션 코드(176)를 컴파일함으로써, 트랜잭션 실행을 지원하고, 또한 애플리케이션 코드(176)를 잠재적으로 최적화시킬 수 있다. 여기서, 컴파일러는 동작들, 호출들, 기능들, 및 트랜잭션들의 실행을 가능하게 하는 다른 코드를 삽입할 수 있다.
때때로, 컴파일러는 소스 텍스트/코드를 타겟 텍스트/코드로 변환하기 위한 프로그램 또는 프로그램들의 세트를 포함한다. 통상적으로, 컴파일러를 이용한 프로그램/애플리케이션 코드의 컴파일은 상위 레벨 프로그래밍 언어 코드를 하위 레벨 기계 또는 어셈블리 언어 코드로 변환하기 위해 다수의 단계(phase)들 및 패스들에서 수행된다. 또한, 단일 패스 컴파일러들이 단순한 컴파일을 위해 여전히 이용될 수 있다. 컴파일러는 임의의 알려진 컴파일 기법들을 이용하여, 어휘 분석(lexical analysis), 전처리, 파싱(parsing), 의미 분석(semantic analysis), 코드 생성, 코드 변환 및 코드 최적화와 같은 임의의 알려진 컴파일러 동작들을 수행할 수 있다. 본 명세서에서 기술된 바와 같이, 트랜잭션 실행과 동적 코드 컴파일의 결합은, 잠재적으로, 필요한 메모리 순서화 보호를 유지하면서, 보다 공격적인 최적화를 가능하게 한다.
때때로, 보다 큰 컴파일러들은 다수의 단계들을 포함하지만, 이들 단계들 대부분은 2개의 일반적인 단계들, 즉, (1) 전단(front-end), 즉, 일반적으로 구문론적(syntactic) 처리, 의미론적 처리 및 일부 변환/최적화가 발생될 수 있는 곳, 및 (2) 후단(back-end), 즉, 일반적으로 분석, 변환, 최적화 및 코드 생성이 발생되는 곳의 단계들 내에 포함된다. 일부 컴파일러들은 컴파일러의 전단과 후단 사이의 묘사(delineation)의 블러링(blurring)을 예시하는 중간 단(middle end)을 지칭한다. 그 결과, 삽입, 연관, 생성, 또는 컴파일러의 다른 동작이 전술한 단계들 또는 패스들 중 임의의 것 뿐만 아니라, 컴파일러의 임의의 다른 알려진 단계들 또는 패스들에서 발생될 수 있다. 예시적인 예로서, 컴파일러는 잠재적으로 트랜잭션 동작들, 호출들, 기능들 등을, 컴파일의 전단 단계에서의 호출/동작의 삽입 및 그 후의 트랜잭션 메모리 변환 단계 동안의 하위 레벨 코드로의 호출/동작의 변환과 같이, 컴파일의 하나 이상의 단계들에 삽입한다. 동적인 컴파일 동안, 컴파일러 코드 또는 동적 최적화 코드는 그러한 동작/호출을 삽입할 뿐만 아니라, 실행시간 동안의 실행을 위한 코드를 최적화할 수 있음을 주지해야 한다. 특정의 예시적인 예로서, 이진 코드(이미 컴파일된 코드)가 실행시간 동안 동적으로 최적화될 수 있다. 여기서, 프로그램 코드는 동적인 최적화 코드, 이진 코드, 또는 그들의 조합을 포함할 수 있다.
그럼에도 불구하고, 컴파일러의 실행 환경 및 동적 또는 정적 속성에도 불구하고, 일 실시예에서, 컴파일러는 프로그램 코드를 컴파일하여 트랜잭션 실행을 가능하게 하고/하거나 프로그램 코드의 섹션들을 최적화한다. 따라서, 일 실시예에서, 프로그램 코드의 실행에 대한 참조는, (1) 메인 프로그램 코드를 컴파일하고, 트랜잭션 구조들을 유지하고, 다른 트랜잭션 관련 동작들을 수행하고, 또는 코드를 최적화하기 위한 컴파일러 프로그램(들) 또는 최적화 코드 최적화기의 동적 또는 정적인 실행, (2) 최적화/컴파일된 애플리케이션 코드와 같은 트랜잭션 동작/호출을 포함하는 메인 프로그램 코드의 실행, (3) 메인 프로그램 코드와 관련된, 라이브러리와 같은 다른 프로그램 코드의 실행, 또는 (4) 그것들의 조합을 지칭한다.
때로는 STM(software transactional memory) 시스템들 내에서, 컴파일러는 다른 동작들, 호출들, 기능들 및 코드가 라이브러리들 내에서 개별적으로 제공되는 반면, 일부의 동작들, 호출들 및 다른 코드가 컴파일될 애플리케이션 코드와 연결되도록 삽입하는데 이용될 것이다. 잠재적으로, 이것은 애플리케이션 코드를 리컴파일(recompile)하지 않고서, 라이브러리들을 최적화 및 업데이트하기 위해 라이브러리 분배기들의 능력을 제공한다. 특정 예로서, 커밋 기능에 대한 호출이 트랜잭션의 커밋 포인트에서 애플리케이션 코드 내에 연결되도록 삽입될 수 있으며, 다른 커밋 기능은 업데이트가능한 라이브러리에 개별적으로 제공된다. 또한, 특정 동작들 및 호출들을 배치할 장소의 선택은 잠재적으로 애플리케이션 코드의 효율성에 영향을 미친다.
배경 부분에서 전술한 바와 같이, 다중 스레드 시스템에서의 코드의 공격적인 최적화는 메모리 순서화 문제들에 대해 잠재적으로 위험하다. 그러나, 일 실시예에서, 코드 최적화는 트랜잭션 메모리 보호와 결합되어 공격적인 최적화를 허용하면서, 메모리 순서화 보호를 유지한다. 여기서, 최적화된 코드를 포함하는 원자 영역은, 최적화된 코드의 실행시에 트랜잭션 보호가 메모리 순서화 위반이 없도록 보장하도록 프로그램 코드 내로 삽입될 수 있다. 그 결과, 최적화된 코드는 공격적으로 최적화될 수 있으며, 원자 영역은 메모리 순서화 위반들이 영역을 커밋하지 않게, 검출되는 것을 보장한다.
또한, 원자 영역들의 코드 최적화와의 결합이 다른 수정으로부터 이점을 또한 얻을 수 있다. 따라서, 일 실시예에서, 프로세서(100)는 프로세서(100) 내의 하드웨어 자원들의 이용가능성에 기초하여 프로그램 코드(176) 내의 트랜잭션들을 동적으로 리사이징할 수 있다. 전형적으로, 원자 영역이 완전히 커밋되거나 또는 중단된다. 그러나, 이러한 예에서, 트랜잭션은 트랜잭션의 엔드포인트 이전에 커밋될 수 있는데, 즉, 트랜잭션 (또는 트랜잭션 내의 코드의 일부분)의 실행을 완료하기에 낮거나 또는 불충분한 자원들이 존재할 때, 보다 작은 트랜잭션으로 동적으로 리사이징된다. 예시적인 예로서, 캐시 메모리(150)는 관련된 트랜잭션 추적 정보와 더불어 잠정적인 트랜잭션 정보를 유지하는데 이용된다. 이러한 시나리오에서, 캐시(150)가 이용가능한 캐시 엔트리들에 대해 로우(low) 또는 오버플로우(overflow)하게 될 때(제거를 위해 트랜잭션 액세스된 라인을 선택하고, 희생 캐시가 가득참), 실행 트랜잭션은 해당 포인트에서 커밋되고, 그것은 잠정적인 정보가 광역적으로 가시적이게 한다. 그 다음, 새로운 트랜잭션이 커밋 포인트로부터 원래의 트랜잭션의 엔드포인트로 재시작될 수 있다. 따라서, 트랜잭션 하드웨어 자원들 - 이 예에서는 캐시 메모리(150) - 이 해방된다. 그리고, 트랜잭션은 전체 트랜잭션을 롤백(rolling back)하거나 또는 트랜잭션을 UTM 시스템에서와 같이 소프트웨어 내로 연장하는 대신에, 2개의 보다 작은 하드웨어 트랜잭션들로서 완료될 수 있다.
따라서, 일 실시예에서, 프로세서(100)는 그것이 HTM, STM 또는 UTM이건 간에, 디코더들, 캐시 메모리들, 추론적인 저장 구조들, 추적 메카니즘들, 저장 버퍼들, 레지스터 파일들, 체크포인트 저장 메카니즘들, 및 트랜잭션의 실행을 지원하는 임의의 다른 알려진 하드웨어의 임의의 조합과 같은, 트랜잭션 메모리 시스템을 지원하는 하드웨어를 포함한다. 더욱이, 프로세서(100)는 이용가능성, 사용량(usage), 또는 트랜잭션 실행을 지원하는 그러한 하드웨어에 대한 그것의 표현을 추적, 제공 또는 나타내도록 구성된 하드웨어/로직을 또한 포함한다. 제1 예로서, 사용량 메트릭(usage metric)(하드웨어 사용량의 표현)은 캐시 메모리, 희생 캐시, 저장 버퍼 또는 로드 버퍼와 같은 저장 구조에서 이용가능하거나 또는 역으로 점유된 다수의 엔트리들을 포함한다. 다른 예로서, 사용량 메트릭은 메모리의 오버플로우, 중단 이벤트, 또는 엔트리의 제거와 같은 이벤트의 발생을 포함할 수 있다. 그러나, 실제 또는 추상적이건 간에, 임의의 사용량 메트릭이 이용될 수 있다.
보다 추상적인 사용량 메트릭의 예로서, 카운터가 코드 내의 루프 반복들의 수를 카운트하고, 카운터가 임계값을 히트(hit)할 때, 트랜잭션이 커밋된다. 여기서, 임계값은, 불충분한 하드웨어 자원들로 인해 트랜잭션의 중단이 발생될 때 임계값을 감소시키는 것과 같이, 시간에 걸친 코드 프로파일링에 기초하여 동적으로 조절될 수 있다. 그러한 경우, 하드웨어 자원의 정확한 실제 사용량 또는 특정 이벤트가 제공되지 않는다. 그러나, 카운터 임계값의 동적인 조절을 통해, 하드웨어는 하드웨어 자원들이 고갈되기 전에, 즉, 높은 자원 이용으로 인해 중단 또는 롤백이 수행되기 전에, 루프들의 수를 본질적으로 평가한다. 그 결과, 일 실시예에서, 그러한 하드웨어 평가는 그것이 코드 실행에 대한 자원 이용가능성을 평가하기 때문에, 하드웨어 자원들에 대한 사용량 또는 사용량의 표현으로 지칭된다.
일 실시예에서, 프로세서(100) 내의 하드웨어는 트랜잭션이 동적으로 리사이징될 때를 비동기적으로 결정할 수 있다. 예를 들어, 하드웨어 자원의 이용이 높을 때, 프로세서(100)는 트랜잭션을 커밋하고, 프로세서(100) 상에서 실행되는 프로그램 코드(176)의 관점으로부터 투명하게 다른 트랜잭션을 재시작할 수 있다. 여기서, 트랜잭션을 포함하는 프로그램 코드(176)는 실행 로직(140)에 의해 실행된다. 그리고, 프로그램 코드의 관점으로부터, 트랜잭션은 중단없이 실행된다. 그러나, 하드웨어의 관점으로부터, 저장 버퍼와 같은 자원이 높은 이용도를 가져서(오버플로우됨), 하드웨어가 트랜잭션의 엔드포인트 이전에 트랜잭션을 커밋하고, 해당 커밋 포인트에서 제2 트랜잭션을 재시작하고, 트랜잭션의 원래의 엔드포인트에서 제2 트랜잭션을 커밋한다.
다른 실시예에서, 트랜잭션의 동적인 리사이징이 하드웨어 및 펌웨어/소프트웨어의 조합으로 수행될 수 있다. 여기서, 프로세서(100)는 트랜잭션 실행을 지원 및 그러한 자원들의 이용도/이용가능성을 추적하기 위한 하드웨어를 포함한다. 그리고, 프로그램 코드(176)로부터의 조건부 코드는, 실행될 때, 그러한 하드웨어 자원들의 이용도/이용가능성에 기초하여 실행 유닛(140)이 동적으로 리사이징(엔드포인트 전에 트랜잭션을 커밋)하도록 한다. 기본적으로, 자원 이용도 및 잠재적인 조건부 커밋의 검사가 하드웨어에 의한 특정 인스트럭션(비동기적)의 실행으로부터 독립적인 대신 - 소프트웨어 인스트럭션의 결과로서 - 동기적으로 수행된다.
예를 들어, 동적 컴파일러 코드의 일부일 수 있는 동적 최적화 코드(177)가, 프로세서(100)의 실행시간 동안 프로그램 코드(176)를 동적으로 컴파일/최적화하도록 실행 로직(140/141)에 의해 실행된다. 그러한 컴파일/최적화 동안, 원자 영역은 그 원자 영역 내의 조건부 커밋 코드와 함께 프로그램 코드(176)의 섹션에 삽입된다. 그 다음, 실행 로직은(140/141)은 동적으로 코드(176)를 최적화하고, 실행시간 동안 동적으로 최적화된 코드(176)를 실행한다. 특히, 실행 로직(140/141)은 원자 영역과 그 안의 최적화된 코드를 실행한다. 조건부 커밋 코드를 조우(encountering)/디코딩하는 디코드 단계(125)에 응답하여, 하드웨어 자원 이용도가 결정된다. 이용도/이용가능성이 이미 이전에 추적될 수 있지만, 조건부 커밋 코드에 응답하여 이용도가 보고/평가됨을 주지해야 한다. 그 후, 하드웨어 자원 이용가능성/사용량에 기초하여 원자 영역을 커밋할지 여부에 대한 결정이 행해질 수 있다.
일 실시예에서, 자원 사용량에 기초한 커밋할지 여부에 대한 결정이 조건부 코드에 응답하여 하드웨어에 의해 수행된다. 즉, 하드웨어는 독립적으로 하드웨어 사용량을 평가하고, 이용도가 초기 커밋을 초래할 정도로 충분히 높은지의 여부를 결정할 수 있다. 예를 들어, 조건부 커밋 코드는 디코더들(125)에 의해 인식가능한 조건부 커밋 인스트럭션을 포함한다. 조건부 커밋 인스트럭션, 또는 영역 검사 인스트럭션은 브랜치 타겟 어드레스를 포함한다. 그리고, 하드웨어는, 디코드 로직(125)에 의한 조건부 커밋 인스트럭션 디코딩에 응답하여, 하드웨어 자원 이용도가 너무 높은지, 또는 대안적으로 불충분한 자원이 존재하는지를 결정한다. 이용도가 너무 높거나 또는 불충분한 자원이 존재하는 경우, 실행 로직(140)은 실행을 브랜치 타겟 어드레스로 점프시킨다.
일 실시예에서, 하드웨어는 사전결정된 알고리즘에 기초하여 이용도가 너무 높은지 또는 불충분한 자원들이 존재하는지를 결정한다. 예를 들어, 하드웨어 자원이 저장 버퍼를 포함하면, 너무 높은 이용도는 이용되는 저장 버퍼 엔트리들의 사전결정된 수를 포함하거나 오버플로우(이용가능한 저장 버퍼 엔트리가 없음)가 발생된다. 또한, 하드웨어는 이전 실행(코드 프로파일링)에 기초하여 코드의 예상 사용량을 평가하고, 충분한 자원이 조건부 커밋없이 실행을 계속하기 위해 존재하는지 여부를 결정하기 위해 현재 하드웨어 사용량과 함께 그 평가를 이용할 수 있다.
대안적으로, 조건부 커밋 인스트럭션은 예상 사용량을 포함할 수 있다. 그리고, 하드웨어가 불충분한 자원이 존재하는지 여부를 결정하기 위해 하드웨어 사용량에 대해 예상 사용량을 비교한다. 예를 들어, 조건부 코드(176)는 프로그램 코드(176)의 원자 영역 내의 루프에 삽입되는 것으로 가정한다. 그 결과, 조건부 코드는 루프의 모든 반복시에 실행된다. 여기서, 조건부 커밋 인스트럭션은 루프의 반복 동안 실행될 저장 버퍼 엔트리들의 예상되는 수를 참조하고, 그것은 코드에 의해 또는 코드의 동적 프로파일링에 의해 평가된 것으로서 터치할 고유의 저장 버퍼 엔트리들의 수에 기초한 것일 수 있다. 조건부 커밋 인스트럭션을 디코딩하는 디코드 로직(125)에 응답하여, 엔트리들의 예상되는 수는 프로세서(100)의 하드웨어가 결정하는 바에 따라 저장 버퍼에서 이용가능한 엔트리의 수와 비교된다. 예상 엔트리의 수가 이용가능한 엔트리의 수보다 큰 경우, 실행은 조건부 커밋 인스트럭션에 의해 참조된 브랜치 타겟 어드레스로 점프한다. 브랜치 타겟 어드레스는 프로그램 코드(176) 또는 라이브러리 코드와 같은 다른 코드 내의 코드를 참조하는 어드레스를 포함하여, 원자 영역의 초기 커밋을 수행하고 제2 원자 영역을 재시작할 수 있다.
다른 실시예에서, 소프트웨어는 하드웨어 이용도가 너무 높거나, 또는 하드웨어 이용가능성이 너무 낮은 때를 결정한다. 이러한 예에서, 프로세서(100)는 하드웨어 사용량의 표현(하드웨어 사용량 메트릭)을 유지하는, 레지스터와 같은 저장 요소를 포함한다. 여기서, 조건부 코드는 사용량 메트릭을 로드/판독하는 동작들을 포함하고, 그것을 평가하고, 조기 커밋이 수행될 지를 결정한다. 조기 커밋이 수행된다면, 조건부 코드는, 실행 로직(140)에 의해 실행될 때, 실행을 브랜치 타겟 어드레스로 점프하기 위한 점프 동작을 포함하고, 그것은 현재 트랜잭션을 커밋하고 다른 원자 영역을 시작할 수 있다.
하드웨어 및 소프트웨어는 유사한 평가를 수행할 수 있음을 주지해야 한다. 그러나, 하드웨어 솔루션은 잠재적으로 하드웨어가 조기 커밋을 완전히 처리하거나 또는 조건부 커밋 인스트럭션을 단지 수신하도록 허용하는 것을 통해 코드 조밀함(compactness)을 가능하게 한다. 또한, 소프트웨어가 평가를 수행하게 허용하는 것은 조기 커밋을 수행할 때를 결정시에 보다 많은 융통성을 제공한다. 그 결과, 하드웨어와 소프트웨어 간의 조합의 변화도(gradient)는 구현 및 원하는 이점들에 기초하여 하드웨어 이용도/이용가능성이 너무 높은/낮은 때를 결정하는데 이용될 수 있다.
도 1은 상이한 모듈들, 유닛들 및/또는 로직의 표현을 갖는 예시적인 프로세서의 추상화된 논리도를 도시한다. 그러나, 본 명세서에서 기술된 방법들 및 장치들을 이용하는 프로세서는 예시된 유닛들을 포함할 필요는 없음을 주지해야 한다. 그리고, 프로세서는 도시된 유닛들 중 일부 또는 전부를 생략할 수 있다. 또한, 도 1은 단지 2개의 코어를 도시하지만, 프로세서는 동일한 유형의 다수의 코어 뿐만 아니라, 각각 유형이 상이한 2개보다 많은 코어와 같은 임의의 수의 코어를 포함할 수 있다.
도 1은 외부 메모리 제어기(제어기 허브(170))에 대한 인터페이스와 점대점(point-to-point) 형태로 연결되는 프로세서의 실시예를 도시한다. 그러나, 많은 현재의 프로세서들은 다수의 코어들 뿐만 아니라 공유된 캐시들 및 다른 인터페이스들과 상호접속하기 위한 링 구성을 갖는 온프로세서 메모리 인터페이스 모듈 - 온칩 모듈 - 을 포함하기 시작하였다. 도시되지는 않았지만, 프로세서(100)는, 일 실시예에서, 링 상호접속 연결 코어, 캐시 및 메모리 제어기 구성요소들을 포함한다.
여기서, 캐싱 에이전트를 이용하여 물리적으로 분포된 캐시의 슬라이스를 관리한다. 예로서, 각각의 캐시 구성요소는 수집된 코어 - 캐시 에이전트가 캐시의 분포된 슬라이스를 관리하기 위한 목적으로 관련되는 코어 - 에 대한 캐시의 슬라이스를 관리하기 위한 것이다. 캐시 에이전트가 링 상호접속 상의 트래픽 및 캐시 슬라이스들과의 인터페이스를 관리하는 것처럼, 코어 에이전트/구성요소는 트래픽 및 코어와의 인터페이스를 관리한다. 또한, 링 상호접속은 MCIL(Memory Controller Interface Logic) 및/또는 다른 제어기들을 연결하여, 메모리 및/또는 그래픽 프로세서와 같은 다른 모듈들과 인터페이스할 수 있다.
도 2a를 참조하면, 원자 영역을 이용하여 코드를 최적화하는 방법에 대한 흐름도의 실시예가 도시된다. 도 2a에서의 흐름의 블록들은 실질적으로 순차적인 형태로 도시되지만, 도시된 방법들의 흐름들은 임의의 순서로, 그리고 부분적으로 또는 전체적으로 병렬로 수행될 수 있다. 예를 들어, 조건부 커밋 코드는 원자 영역 시작 및 종료 인스트럭션들을 삽입하기 전에 삽입될 수 있다. 더욱이, 도시된 블록들이 수행될 필요가 있는 것은 아니다. 그리고, 도시되지 않은 다른 블록들이 도시된 블록들과 함께 또는 그 대신에 수행될 수 있다.
블록(205)에서, 최적화될 프로그램 코드의 섹션이 식별된다. 전술한 바와 같이, 프로그램 코드는 컴파일러 코드, 최적화 코드, 애플리케이션 코드, 라이브러리 코드 또는 임의의 알려진 표현의 코드를 지칭할 수 있다. 특정한 예시적인 예로서, 프로그램 코드는, 실행을 위해 준비되고, 프로세서(100) 상에서의 실행을 위해 동적으로 컴파일되고/되거나 프로세서(100) 상에서의 실행을 위해 동적으로 최적화되는 이진 코드와 같은, 프로세서(100) 상에서 실행될 코드를 포함한다. 또한, 코드의 삽입(동작들, 기능 호출 등) 및 코드의 최적화는 컴파일러 및/또는 최적화 코드와 같은 프로그램 코드의 실행을 통해 수행된다. 예로서, 최적화 코드는 프로세서(100) 상에서의 프로그램 코드의 실행 직전에 프로그램 코드를 최적화하기 위해 실행시간에서 프로세서(100) 상에서 동적으로 실행된다.
Figure pct00002
의사 코드 B : 최적화될 의사 코드 영역
일 실시예에서, 최적화될 의사 코드 B로부터의 영역과 같은 프로그램 코드의 섹션을 식별하는 것은 최적화될 프로그램 코드의 섹션/영역을 나타내는 코드를 포함한다. 예를 들어, 특정 인스트럭션 또는 구분(demarcation)을 이용하여 최적화되거나 또는 최적화로부터 이점을 얻을 것 같은 코드의 섹션을 나타낸다. 다른 옵션으로서, 프로그래머는 최적화를 위한 센션들을 식별하기 위해 최적화 코드에 의해 이용되는 프로그램 코드의 섹션들에 관한 힌트들을 제공한다. 다른 실시예에서, 영역은 프로파일링 정보에 기초하여 식별/선택된다. 예를 들어, 프로그램 코드는 하드웨어, 프로세서 상에서 실행되는 소프트웨어, 펌웨어, 또는 그들의 조합에 의한 실행 동안에 프로파일링된다. 여기서, 코드의 프로파일링은 힌트들을 생성하거나 원래의 소프트웨어 힌트들을 수정할 뿐만 아니라, 최적화를 위한 영역들의 직접적인 식별을 제공한다. 또한, 코드의 섹션이 특정 유형, 포맷, 또는 코드의 순서와 같은 소정의 속성들에 의해 잠재적으로 식별된다. 특정한 예시적인 예로서, 루프들을 포함하는 코드가 잠재적인 최적화를 위해 타겟화된다. 그리고, 실행 동안의 루프들의 프로파일링은, 루프들 중 어느 것이 최적화되어야 하는지를 결정한다. 또한, 루프가 최적화될 로드들 및 저장들과 같은 특정 코드를 포함한다면, 그러한 코드를 포함하는 영역이 최적화를 위해 식별된다. 의사 코드 B로부터 볼 수 있듯이, 영역은 루프 실행을 최적화하기 위해 루프를 호이스팅 및 싱크할 수 있는 로드들 및 저장들을 포함한다.
Figure pct00003
의사 코드 C : 삽입된 시작 및 커밋 원자 영역 인스트럭션들을 갖는 코드 영역
일 실시예에서, 최적화를 위해 식별된 코드의 섹션이 원자 영역 내로 변환된다. 또는, 코드의 섹션의 적어도 일부분이 원자 영역 내로 변환된다. 여기서, 블록들(210-215)에 도시된 바와 같이, 코드의 부분은 시작 및 종료(커밋) 트랜잭션(원자 영역) 인스트럭션들에 의해 구분된다. 의사 코드 C로부터 볼 수 있듯이, 영역 시작 및 영역 커밋 인스트럭션이 코드의 영역의 이전 및 이후에 각각 삽입된다. 일 실시예에서, 코드는 다수의 엔트리들 및 다수의 엑시트(exit)들을 포함한다. 그 결과, 시작 원자 영역 및 종료 원자 영역 인스트럭션이 각각의 엔트리 포인트 및 각각의 엑시트 포인트에서 각각 삽입될 수 있다. 그러나, 영역이 원자임을 나타내는 임의의 알려진 방법이 이용될 수 있다.
Figure pct00004
의사 코드 D : 삽입된 조건부 커밋 코드를 갖는 코드 영역
블록(220)에서, 조건부 커밋 포인트가 결정된다. 다수의 조건부 커밋 포인트들이 최적화될 코드의 영역 내에서 결정/할당되지만, 설명의 용이성을 위해 단지 하나의 커밋 포인트만이 이하에 보다 상세히 기술된다. 조건부 커밋 포인트를 결정하는 것은, 조건부 커밋 포인트들 사이의 하드웨어 자원들의 소모(running out)를 피하고자 하는 임의의 알려진 할당/결정 알고리즘에 기초할 수 있다. 제1 예로서, 조건부 커밋 포인트가 루프 내에 삽입되어, 조건부 커밋 포인트를 매 반복시마다 조우하도록 한다. 여기서, 조건부 커밋 포인트가 루프의 시작부에 결정될 수 있다. 다른 예로서, 코드의 동적인 프로파일링은 때때로 하드웨어 자원들의 소모를 초래하는 실행 경로들을 나타낸다. 그러므로, 조건부 커밋 포인트들은 그러한 경로들의 실행 동안 자원들의 소모를 피하기 위해 그러한 실행 경로들에 할당된다. 유사하게, 독점하거나 또는 자원을 무겁게 하는 것으로 알려진 실행 경로들은 그것들에 할당된 조건부 커밋 포인트들을 가질 수 있다.
블록(225)에서, 조건부 커밋 코드가 적어도 조건부 커밋 포인트에서 삽입된다. 조건부 커밋 코드는 다음 커밋 포인트까지를 통해 실행을 지원하기에 불충분한 하드웨어 자원들이 존재하는 것으로 결정되는 경우, 리사이즈, 즉, 트랜잭션의 조기 커밋을 초래한다. 도 2b를 간단히 참조하면, 조건부 커밋 코드를 삽입하기 위한 흐롬도의 실시예가 도시된다. 흐름(226)에서, 조건부 커밋 인스트럭션이 조건부 커밋 포인트에서 삽입된다. 의사 코드 D로부터 볼 수 있듯이, 조건부 커밋 인스트럭션은, 일 실시예에서, 원자 영역 내에서 커밋 포인트 L1에서 삽입된 영역 검사 인스트럭션을 포함한다.
제1 예로서, 영역 검사 인스트럭션 또는 조건부 브랜치 인스트럭션과 같은 조건부 커밋 인스트럭션은 브랜치 타겟 어드레스에 대한 참조를 포함한다. 그리고, 다음 커밋 포인트까지를 통한 실행을 지원하기에 불충분한 자원들이 존재함을 결정하는 결과로서, 조건부 커밋 인스트럭션에 응답하여 실행은 브랜치 타겟 어드레스로 점프한다. 여기서, 조건부 커밋 코드는 브랜치 타겟 어드레스에서의 커밋 코드를 또한 포함한다. 본질적으로, 이러한 예에서, 조건부 커밋 인스트럭션은 충분한 자원들이 존재하는지를 결정하기 위한 테스트/질의를 시작하기 위한 것이다. 그리고, 브랜치 타겟 어드레스에서의 코드는 불충분한 자원들이 존재할 때 트랜잭션을 조기에 커밋하기 위한 것이다. 따라서, 블록(227)에서, 커밋 인스트럭션이 브랜치 타겟 어드레스에 삽입된다.
의사 코드 D에서, 제1 영역_커밋(region_commit) 인스트럭션이 B4에서 원자 영역의 엑시트/종료 포인트에서 삽입되고, 제2 영역_커밋이 블록 B6에서 브랜치 타겟 어드레스 포인트 L2에서 삽입된다. 여기서, L1에서의 영역_검사(region_check) 인스트럭션에 응답하여 불충분한 자원들이 결정된다면, 실행은 영역_검사 인스트럭션에 의해 참조된 브랜치 타겟 어드레스(B6)로 점프한다. 트랜잭션 라이브러리 또는 아키텍쳐 조직형 커밋 인스트럭션 내의 커밋 기능에 대한 호출과 같은 영역_커밋 인스트럭션이 원자 영역을 (엔드포인트 B4 이전에) 조기에 커밋하도록 실행된다. 더욱이, 블록(228)(의사 코드 D로부터의 B7)에서, 제2 시작 원자 영역 인스트럭션(region_start)이 영역_커밋 인스트럭션 이후에 삽입된다. 그 결과, 원자 영역의 실행이 B3에서 시작된다(region_start). 그리고, L1에서 영역_검사 인스트럭션에 의해 불충분한 자원들이 결정되거나 또는 엔드포인트 B4를 조우할 때까지 계속된다. 그러나, 불충분한 하드웨어 자원들이 L1에서 결정된다면, 원래의 트랜잭션이 리사이징, 즉, 커밋 포인트 L2, B6에서 커밋된다. 그 다음, 제2 원자 영역이 B7에서 시작되고, 커밋 포인트 B4 또는 자원들이 L1에서 다시 제한될 때까지 영역 실행이 제2 트랜잭션으로서 계속된다. 따라서, 단일 원자 영역이 하드웨어 자원들의 소모를 피하기 위해 보다 작은 트랜잭션들로 동적으로 리사이징되고, 그것은 이전에 소프트웨어 실행으로의 중단 또는 연장을 초래할 것이다.
조건부 커밋 인스트럭션은 임의의 정보를 포함할 수 있음을 주지해야 한다. 예를 들어, 전술한 바와 같이, 조건부 커밋 인스트럭션은, 일 실시예에서, 의사 코드 D에서 코드 B2를 통한 루프 동안 이용될 엔트리들의 예상되는 수와 같은, 다음 커밋 포인트까지의 예상되는 하드웨어 자원 사용량을 포함한다. 여기서, 이러한 예상되는 사용량은 루프 B2의 다른 반복에 대한 실행을 지원하기에 충분한 자원들이 존재하는지를 결정시에 이용된다. 특정한 예시적인 예로서, 예상되는 사용량은 다음 커밋 포인트까지 코드의 영역의 실행에 응답하여 고유하게 터치될 것으로 예상되는 저장 구조에서의 엔트리들의 수를 포함한다.
또한, 조건부 코드는 조건부 커밋 인스트럭션으로 제한되지 않는다. 예를 들어, 하드웨어가 사용량을 결정하고, 그러한 사용량을 레지스터(도 5를 참조하여 보다 상세히 기술됨)에 위치시키는 실시예에서, 조건부 코드는 레지스터로부터 사용량을 판독/로드하고, 사용량을 평가하고, 의사 코드 D로부터 B6 및 B7과 유사한 코드를 커밋 및 재시작하도록 분기하는 점프 또는 브랜치 동작을 발행하는 동작을 포함할 수 있다. 다른 실시예에서, 소프트웨어는 하드웨어와 통신하거나 하드웨어에게 질의하는 대신에, 하드웨어 사용량을 평가할 수 있다. 그러한 시나리오에서, 조건부 코드는 그러한 평가를 수행하기 위한 코드를 포함한다. 예를 들어, 도 6을 참조하여 보다 상세히 기술되는 카운트가, 조건부 커밋을 수행하기 전에 루프의 반복들의 수를 제한하기 위해 소프트웨어의 실행을 통해 유지된다. 이러한 예에서, 카운트를 유지하기 위해 실행될 코드는 조건부 커밋 코드로서 고려될 수 있다.
블록(230)에서, 프로그램 코드의 섹션이 최적화된다. 의사 코드 E는 최적화 이후의 코드의 예를 도시한다.
Figure pct00005
의사 코드 E : 최적화 이후의 코드 영역
원자 영역의 구분 및 조건부 커밋 코드의 삽입이 일부 실시예에서 프로그램 코드를 최적화하는 것으로 고려되지만, 프로그램 코드의 섹션은 실행 이점들을 얻기 위해 다른 실시예들에서 더 최적화되고, 트랜잭션 실행의 메모리 순서화 보호에 의존한다. 특정 예로서, 로드 및 저장이 PRLE(Partial Redundancy Load Elimination) 및 PDSE(Partial Dead Store Elimination)를 이용하여 루프의 밖에서 호이스팅 및 싱크된다. 의사 코드 E는 PRLE가 [r2] 및 [r2+4] 로드들을 호이스팅하고, PDSE가 [r2+4] 저장을 싱크한 이후의 원자 영역을 도시한다. 일 실시예에서, 추가의 메모리 순서화 규칙들이 적용됨을 주지해야 한다. 여기서, 영역 시작 및 커밋을 통한 메모리 순서화를 위반하는 메모리 최적화가 없도록 보장하는 것이 바람직할 수 있다. 이것의 예는 의사 코드 E에서 볼 수 있으며, [r2+4] 저장은 B6에서 영역_커밋 이전에 삽입되고, [r2] 및 [r2+4] 로드들은 B7에서의 영역_시작 인스트럭션 이후에 다시 삽입된다. 그 결과, 영역이 조기 커밋(조건부 커밋 포인트로 리사이징)된다면, 영역이 B6에서 커밋되기 전에 [r2+4] 저장이 수행된다. 그리고, [r2] 및 [r2+4] 로드들이 B7에서의 새로운 트랜잭션의 재시작 이후에 수행된다.
로드 및 저장 최적화가 위에서 논의되었지만, 임의의 알려진 코드 최적화 기법들이 이용될 수 있다. 코드 최적화의 몇 가지 추가의 예들은, 전부는 아닌 리스트이며 순수하게 예시로서, 루프 최적화, 소프트웨어 파이프라이닝, 데이터 흐름 최적화, 코드 생성 최적화, 경계 검사 제거, 브랜치 오프셋 최적화, 데드 코드 제거 및 점프 스레딩을 포함한다.
도 3a를 참조하면, 원자 코드를 동적으로 리사이징하기 위한 흐름도의 실시예가 도시된다. 블록(305)에서, 최적화된 프로그램 코드를 포함하는 트랜잭션(원자 영역)이 실행된다. 일 실시예에서, 최적화된 프로그램 코드가 실행시간 동안에 동적으로 최적화되는데, 즉, 동적 최적화 코드가 실행시간에서 실행되어 실행을 위한 시간에서만 "온 더 플라이(on the fly)"로 프로그램 코드를 최적화한다. 이러한 유형의 동적 최적화 또는 컴파일이 정적 컴파일 동안과 같이 전체 프로그램을 알지 못하지만, 섹션들에서의 코드의 부분들을 컴파일/최적화할 수 있다.
블록(310)에서, 영역 검사 인스트럭션을 조우하게 된다. 일 실시예에서, 영역 검사 인스트럭션을 조우하는 것은 인스트럭션을 디코딩하는 디코드 로직을 포함한다. 그러나, 조우하는 것은 인스트럭션(또는 인스트럭션의 동작)을 수신하거나 또는 서비스하는 파이프라인의 임의의 단(stage)을 지칭할 수 있다. 예를 들어, 영역 검사 인스트럭션을 조우하는 것은 그 대신에, 인스트럭션과 관련된 동작에 대한 버퍼에서의 엔트리의 할당, 동작의 디스패치, 인스트럭션을 위한 동작들 또는 마이크로 동작들을 수행하기 위한 실행 유닛을 갖는 인스트럭션의 실제 실행, 또는 파이프라인의 임의의 다른 알려진 단을 지칭할 수 있다. 전술한 바와 같이, 영역 검사 인스트럭션은, 일 실시예에서, 하드웨어에 질의하기 위한 프로세서의 디코더들에 의해 인식가능한 ISA의 부분이다. 질의는 단순히 사용량에 대해 하드웨어에 질의하기 위한 로드일 수 있다. 그리고, 소프트웨어는 하드웨어로부터의 더 이상의 개입없이 충분한 자원들이 이용가능한지를 결정한다. 반대로, 질의는 원자 영역의 실행을 계속하기 위해 충분한 자원들이 존재하는지를 결정하기 위해 하드웨어에 대한 요청을 포함할 수 있다. 여기서, 질의는 불충분한 자원들이 존재하는 경우 하드웨어가 분기하는 타겟 어드레스를 제공한다. 또한, 질의는 영역 검사 인스트럭션이 충분한 자원들이 이용가능한지를 결정시에 이용하기 위해 하드웨어에 대한 예상되는 사용량을 또한 제공하는 경우, 보다 많이 수반될 수 있다.
영역 검사 인스트럭션에 응답하여, 블록(315)에서, 영역 검사를 위한 포인트에서, 하드웨어 유닛(들)이, 다음 조건부 커밋 포인트까지와 같이, 트랜잭션의 영역을 완료하기에 충분한 자원들을 갖는지가 결정된다. 충분한 하드웨어 자원들이 존재하는지 여부를 결정하는 것은 임의의 방법으로 실제로 측정되거나 또는 근사화될 수 있다. 제1 예로서, 하드웨어 자체가 사용량 레벨을 추적 및/또는 결정한다. 그리고, 하드웨어, 펌웨어, 소프트웨어, 또는 그들의 조합이, 사용량 레벨/메트릭이 트랜잭션의 영역을 완료하기에 충분한 이용가능성을 포함하는지를 결정한다. 그러나, 사용량 레벨은 소프트웨어의 지시로도 순수하게 근사화/측정될 수도 있음을 주지해야 한다. 이러한 경우, 측정은 하드웨어가 그 자신의 추적을 수행하는 전술한 예만큼 정확하지 않을 수 있지만, 추가적인 하드웨어 후크(hook)들이 측정을 지원하기 위해 추가되지 않아도 된다.
도 3b를 잠시 참조하면, 트랜잭션의 영역의 실행을 완료하기에 충분한 자원들이 있는지를 결정하기 위한 흐름도의 실시예가 도시된다. 흐름(350)에서, 하드웨어 유닛, 또는 다수의 하드웨어 유닛들의 예상되는 사용량이 결정된다. 하드웨어, 펌웨어, 소프트웨어, 또는 그들의 조합이 예상되는 사용량을 결정하는데 이용될 수 있다.
하나의 시나리오에서, 트랜잭션을 포함하는 프로그램 코드의 실행이 프로파일링된다. 프로파일링 동안, 제한된 자원들로 인한 중단들의 수, 중단없는 커밋, 및/또는 하드웨어 사용량이 추적된다. 그리고, 후속적으로, 컴파일러와 같은 코드가 과거의 실행 프로파일들에 기초하여 예상되는 사용량의 힌트들 또는 제안들을 제공한다. 다른 시나리오에서, 예상되는 사용량이 평가를 포함할 수 있다. 예를 들어, 하드웨어 유닛이 저장 버퍼라면, 예상되는 사용량은, 이러한 상황에서, 코드 영역에서의 고유한 저장들(새로운 저장 버퍼 엔트리에서의 할당하는 저장 동작들)의 수를 포함한다. 본질적으로, 코드에서의 저장들의 수는 코드 영역의 실행 동안에 이용될 저장 버퍼 엔트리들의 수를 평가한다. 그러나, 예상되는 사용량을 결정하는 것은 소프트웨어 프로파일링 또는 평가로 제한되지 않는다. 그 대신에, 하드웨어가 유사한 프로파일링 또는 평가를 수행할 뿐만 아니라, 코드와 함께 동작하여 예상되는 사용량을 결정할 수 있다.
유사하게, 흐름(355)에서, 하드웨어 유닛의 이용가능한 사용량이, 하드웨어, 소프트웨어, 펌웨어, 또는 그들의 조합으로 결정된다. 위에서의 예를 계속하여, 조건부 커밋 인스트럭션이 하드웨어에게, 32 엔트리 저장 버퍼의 예상되는 사용량이 평가 또는 과거의 프로파일링에 기초하여 10 저장 버퍼 엔트리를 포함함을 알려주는 것으로 가정한다. 그 다음, 그의 헤드 및 테일 포인터를 이용하는 저장 버퍼는 20 엔트리들이 현재 할당(12 이용가능 엔트리들)됨을 결정할 수 있다. 이러한 결정으로부터, 흐름(360)에서 비교가 수행될 수 있다. 그리고, 이용가능한 엔트리들의 수는 예상되는 사용량보다 크기 때문에, 흐름(360)에서, 실행을 계속하기 위한 충분한 자원이 존재하는 것으로 결정된다. 대안적으로, 9 엔트리만이 이용가능하다면, 흐름(370)에서 충분한 자원들이 존재하지 않는 것으로 결정된다.
그러나, 비교는 하드웨어 자원에서 정확하게 충분한 공간이 이용가능함을 보장하는 것으로 제한되지 않는다. 그 대신에, 버퍼 구역이 임계값들의 이용을 통해 제공될 수 있다. 예를 들어, 사용량이 높거나(임계값 초과), 이용가능성이 낮은 경우(임계값 미만), 유사한 결정들이 흐름들(365, 370)에서 행해질 수 있다. 특정한 예시적인 예로서, 6 엔트리들의 버퍼 구역이 이용가능성을 위해 이용됨을 가정한다. 이러한 경우, 이용될 예상되는 엔트리들의 수가 10이고, 20개는 32 엔트리 버퍼에서 이용된다면, 단지 12 엔트리만이 이용가능하다. 그러므로, 10 엔트리들의 예상되는 사용량이 할당되었다면, 단지 2 엔트리만이 이용가능하게 남을 것이다. 이용가능한 것으로 남겨진 6 엔트리의 버퍼 구역이 이용되므로, 흐름(370)에서 불충분한 자원들이 결정된다. 그 대신에, 20 엔트리들이 이용가능하다면(단지 12 엔트리들이 이용됨), (흐름(365)에서와 같이) 충분한 자원들이 존재하는데, 그것은 코드 영역에 대해 10 엔트리들을 할당하는 것은 여전히 10개의 이용가능한 엔트리들을 남겨두기 때문이다.
또한, 사용량 및 이용가능성은 스레드 우선순위 및 사용량을 고려할 수 있다. 여기서, 다수의 스레드들이 하드웨어 자원에 대한 액세스를 공유한다면, 자원은 파티션되거나 또는 완전히 공유될 수 있다. 그 결과, 예상되는 사용량에 비교한 사용량 및 이용가능성은 이러한 공유를 고려하여, (다른 스레드에 대한 충분한 이용가능성을 남기지 않으면서) 하나의 스레드가 하드웨어 자원을 독점하지 않도록 한다. 예를 들어, 2개의 스레드가 파티셔닝을 통해 캐시에 대한 액세스를 공유한다면, 하나의 스레드로부터의 트랜잭션이 캐시의 엔트리들의 절반으로 제한될 수 있다. 그러므로, 사용량 및 이용가능성은 전체 캐시 대신에, 캐시의 절반에 대한 것으로 된다.
전술한 내용은 저장 버퍼를 참조하며, 캐시를 간단히 참조하지만, 사용량/이용가능성은 저장 버퍼, 로드 버퍼, 캐시 메모리, 희생 캐시, 레지스터 파일, 큐, 실행 유닛, 또는 다른 알려진 프로세서 하드웨어와 같은 하드웨어 자원(들)의 임의의 하나 또는 조합에 관한 것일 수 있다. 예를 들어, 하드웨어 자원이 캐시 메모리를 포함한다면, 예상되는 사용량은 터치/이용될 캐시 라인들의 수를 포함할 수 있고, 사용량은 데이터를 유지하는 캐시 라인들의 수 또는 공유되고, 제한되거나 또는 수정되는 캐시 라인들의 수와 같은 일관성 상태에 있는/있지 않은 캐시 라인들의 수를 포함할 수 있으며, 이용가능성은 무효 일관성 상태와 같은 특정 일관성 상태에 있는/있지 않은 이용가능한 엔트리들 또는 라인들의 수를 포함할 수 있다. 또한, 이용가능성/사용량은 이용가능성/사용량을 측정하는 하드웨어를 참조하여 더 기술된다. 그러나, 전술한 바와 같이, 사용량 및 이용가능성은 직접 또는 간접적으로 측정될 수 있을 뿐만 아니라, 소프트웨어, 하드웨어 또는 그들의 조합에 의해 평가될 수 있다.
도 3a를 참조하면, 영역을 완료하기 위한 충분한 자원들이 존재하는 것으로 결정된다면, 실행 흐름은 흐름(305)으로 리턴된다. 즉, 다음 조건부 커밋 포인트까지 실행이 계속되며, 그 포인트에서 하드웨어 자원들의 평가가 다시 수행될 수 있다. 또한, 충분한 자원들이 존재하지 않는 것으로 결정된다면, 흐름(320)에서 트랜잭션은 트랜잭션의 종료 이전에 커밋된다(동적으로 리사이징). 그리고, 일 실시예에서, 중단없는 실행을 제공하기 위해, 새로운 트랜잭션이 흐름(325)에서 시작되어, 원자 실행을 계속한다. 여기서, 단일의 보다 큰 트랜잭션이, 보다 많은 실행 공간을 제공하기 위해 가상 또는 시스템 메모리 내로 연장되지 않고서 하드웨어에 의해 처리될 수 있는 보다 작은 트랜잭션들로 본질적으로 동적으로 분할된다.
도 4를 참조하면, 트랜잭션들의 실행을 지원하기 위한 논리 블록들의 실시예가 도시된다. 도시된 바와 같이, 메모리(405)는 OS(Operating System) 코드, 하이퍼바이저 코드, 애플리케이션 코드, 동적 컴파일러 코드 등과 같은 프로그램 코드(410)를 유지하도록 구성된다. 예로서, 프로그램 코드(410)는 도 2a-2b에 따라 (실행시간 또는 부분적인 프로그램 컴파일에서) 동적으로 최적화될 애플리케이션 코드의 적어도 일부분을 포함한다. 실행시간 동안, 동적 리사이징을 지원하기 위한 코드를 갖는 트랜잭션들을 갖는 최적화된 코드를 포함하는 코드(410)가 실행된다. 일 실시예에서, 프로그램 코드(410)는, 전술한 바와 같이, 영역 검사 인스트럭션과 같은 조건부 커밋 인스트럭션(415)을 포함한다.
여기서, 디코더들(425)(프로세서의 디코드 로직)이 조건부 커밋 인스트럭션(415)을 인식하도록 구성된다. 예를 들어, 디코드 로직(425)은 인스트럭션 세트 아키텍쳐의 일부로서 오피코드(418)를 식별하기 위해 설계 및 상호접속된다. 그 결과, 특정의 (사전정의된) 동작들/마이크로 동작들이 동작 코드(오피 코드)(418)를 포함하는 조건부 인스트럭션(415)을 디코딩하는 디코더들(425)에 응답하여, 로직(430), 하드웨어(435), 및 실행 로직(440)에 의해 수행된다. 도시된 바와 같이, 조건부 인스트럭션(415)은 예상되는 하드웨어 사용량(하드웨어 사용량 메트릭)(416) 및 브랜치 어드레스(420)(다른 타겟 어드레스에 대한 코드 내의 베이스 어드레스 및 오프셋과 같은 어드레스 위치)에 대한 참조를 포함한다.
디코더들(425)이 조건부 인스트럭션(415)을 디코딩/조우할 때, 일 실시예에서, 하드웨어는 조건부 커밋 인스트럭션(415)에 의해 나타내진 실행된 하드웨어 사용량을 수용하도록 이용가능한 충분한 하드웨어 자원들이 존재하는지를 결정한다. 임의의 알려진 방법 및 장치를 이용하여, 하드웨어 자원 사용량 및 충분한 자원들이 하드웨어 자원들의 예상되는 사용량을 수용하도록 이용가능한지를 결정할 수 있다. 또한, 그러한 결정을 구현하기 위한 일 실시예의 예시를 제공하기 위해, 특정한 예가 이하에 기술된다.
여기서, 디코더들(425)이 조건부 인스트럭션(415)을 수신할 때, 다른 동작들/마이크로 동작들이 프로세서 파이프라인 내의 로직(430) 및 디코더들(425)에 의해 수행된다. 예를 들어, 디코더들(425)은 조건부 커밋 인스트럭션(415)을, 수행될 동작들의 트레이스와 같은 복수의 동작들(마이크로 동작들)로 디코딩할 수 있다. 전술한 내용으로부터, 트레이스는 디코딩 이후에 트레이스 캐시에 저장/형성될 수 있음을 주지해야 한다. 예를 들어, 동작들 중 하나가 하드웨어 자원의 사용량 레벨을 나타내기 위해 레지스터의 판독 또는 하드웨어(435)로부터의 로드를 포함한다면, 로직(430)은 로드 버퍼 내의 엔트리를 할당하고, 실행 로직(440) 상의 로드의 실행을 스케쥴링할 수 있다.
더욱이, 하드웨어(435)는 조건부 인스트럭션(415)에 응답하여 제공되고, 결정되거나 또는 로딩될 그러한 사용량 레벨(435)을 결정하도록 구성된다. 위의 내용으로부터, 결정된 사용량 레벨을 가질 수 있는 트랜잭션 실행을 지원하는 하드웨어의 많은 예들은, 캐시 메모리, 추론적 캐시 메모리, 저장 버퍼, 로드 버퍼, 레지스터 파일, 추론적 레지스터 파일, 체크포인트 레지스터 파일 등을 포함한다. 그 결과, 인스트럭션(415)은 하나 이상의 하드웨어 자원들에 대해 하나 이상의 예상되는 사용량 메트릭을 포함할 수 있다. 그리고, 분리된 하드웨어 또는 자원들 자체가 그들의 사용량 레벨을 추적하도록 구성된다. 예를 들어, 캐시 메모리에 대한 캐시 제어 로직은, 일 실시예에서, 캐시 메모리에 유지된 무효 캐시 라인들의 수 또는 캐시 메모리 내의 이용가능한 라인들의 수와 같은 캐시 메모리의 사용량 레벨을 추적하도록 구성된다.
그 다음, 결정된 하드웨어 사용량 레벨과 비교한 예상되는 사용량 레벨에 기초하여, 조기 커밋(동적 리사이징) 없이 트랜잭션의 실행을 계속하기 위한 충분한 자원들이 존재하는지를 결정한다. 그리고, 조기 커밋이 수행된다면, 도시된 예에서, 실행 로직(440)은, 조건부 커밋 인스트럭션(415)에 의해 제공된 것으로서, 브랜치 타겟 어드레스(420)로 점프한다. 전술한 바와 같이, 브랜치 타겟 어드레스는, 실행될 때, 트랜잭션을 조기에 커밋하고, 원자 실행을 계속하기 위해 다른 트랜잭션을 재시작하는 코드를 포함할 수 있다.
특정한 예시적인 예로서, 조건부 커밋 인스트럭션(415)이 디코더들(425)에 의해 수신되는 것으로 가정한다. 그리고, 조건부 인스트럭션(415)은 10 저장 버퍼 엔트리 및 10 캐시 라인의 예상되는 사용량 메트릭(416)을 포함한다. 하드웨어(435)(트랜잭션 캐시 메모리 및 저장 버퍼)는 그들의 사용량 레벨을 결정한다. 이들 하드웨어 엔티티들은 사용량을 연속적으로 추적할 수 있고, 그들은 조건부 커밋 인스트럭션(415)에 의한 질의/요청시에 그러한 사용량을 제공한다. 또는, 로직은 조건부 커밋 인스트럭션(415)으로부터 요청이 수신될 때 사용량을 실제로 결정할 수 있다. 어느 방식으로든, 하드웨어 사용량 레벨/메트릭(436)이, 실행 로직(440)에 의한 동작을 위한 정보를 유지하는 레지스터와 같은 저장 요소에 제공된다. 그 다음, 하드웨어 사용량 레벨(436) 및 예상되는 하드웨어 메트릭(416)이 비교되어, 조기 커밋 없이 실행을 계속하기 위한 충분한 자원들이 이용가능한지를 결정한다. 위의 내용으로부터, 비교는 버퍼 구역, 임계값, 또는 직접적인 비교를 이용하여, 설계자의 임의의 알고리즘 선호도에 기초하여 충분한 자원들이 이용가능한지를 결정할 수 있다.
여기서, 저장 버퍼가 32 저장 버퍼 엔트리 중 16개를 이용하고(16개의 이용가능한 엔트리), 트랜잭션 캐시가 트랜잭션 액세스된 것으로서 마킹된 64 엔트리 중 60개를 갖는 것으로 가정한다(트랜잭션은 이들 라인들을 이미 액세스하였으며, 그러한 라인의 대체는 정보의 손실을 초래하여 소프트웨어 트랜잭션 실행으로의 중단 또는 연장을 초래하는데, 즉, 4개의 이용가능한 엔트리가 됨). 그리고, 설계자 알고리즘은 엔트리들의 예상되는 수를 고려한 이후에 4개의 이용가능한 엔트리가 되어야 함을 지정한다. 그러한 경우, 10개의 예상되는 저장 버퍼 엔트리 및 16개의 이용가능한 엔트리인 경우, 다음 조건부 커밋 포인트까지 원자 실행을 수용하기 위해 저장 버퍼에 충분한 이용가능한 공간이 존재한다. 또한, 트랜잭션 액세스된 것으로 마킹되지 않은 단지 4개의 캐시 엔트리가 존재하여, 충분하지 않은 트랜잭션 캐시 공간이 존재한다. 그 결과, 점프 실행 유닛과 같은 실행 로직(440)은 브랜치 타겟 어드레스(420)로 점프하여, 트랜잭션을 조기에 커밋(트랜잭션을 동적으로 감소시킴)하고 다른 트랜잭션을 재시작하기 위해 코드를 페치, 디코딩 및 실행한다.
위에서의 예들은 예상되는 하드웨어 사용량 메트릭 및 브랜치 타겟 어드레스들을 포함하는 조건부 커밋 인스트럭션을 참조하여 기술되었음을 주지해야 한다. 그러나, 조건부 커밋 인스트럭션은, 코드의 실행을 지원하기 위한 충분한 하드웨어 이용가능성이 존재하는지를 하드웨어가 평가 또는 추정하도록 하는 임의의 인스트럭션을 포함할 수 있다. 예를 들어, 조건부 커밋 인스트럭션은 단지 조건부 점프 인스트럭션일 수 있으며, 하드웨어는 트랜잭션이 커밋되어야 하는지를 결정하기 위해 코드의 과거의 하드웨어 프로파일링에 대하여 현재의 사용량 레벨을 평가한다. 그리고, 평가를 수행한 이후의 하드웨어는 조건부 커밋 인스트럭션에 의해 제공된 브랜치 어드레스로 점프할 수 있다.
다른 실시예에서, 하드웨어는 트랜잭션이 커밋됨을 비동기적으로 (특정 조건부 커밋 인스트럭션에 결합되거나 또는 응답하지 않고서) 결정할 수 있음을 주지해야 한다. 여기서, 프로세서가 트랜잭션 코드를 실행하고, 오버플로우 이벤트(이미 트랜잭션으로 마킹되는 엔트리의 제거와 같은 하드웨어 자원에 공간이 남지 않았음을 나타내는 이벤트)가 발생될 때, 하드웨어는 하드웨어 트랜잭션을 커밋하고, 임의의 더 좋은 것을 아는 코드 없이 새로운 트랜잭션을 재시작할 수 있다.
다음, 도 5를 참조하면, 트랜잭션의 동적인 리사이징을 지원하기 위한 하드웨어의 다른 실시예가 도시된다. (도 4에 관하여) 이전에, 결정된 하드웨어 사용량 레벨/메트릭은 실행 로직(440)에 의한 동작을 위해 이용될 레지스터와 같은 저장 요소에 위치될 수 있는 것으로 기술되었다. 그러한 예와 유사하게, 결정된 하드웨어 사용량 레벨/메트릭은 레지스터(550)와 같은 저장 요소 내로 유사하게 로딩될 수 있다. 그러나, 일 실시예에서, MSR(Model Specific Register)을 포함할 수 있는 레지스터(550)는, 하드웨어 자원 이용가능성의 평가를 수행하기 위해, 사용자 레벨 애플리케이션 코드와 같은 프로그램 코드에 의해 (그것에 노출되어) 액세스가능하도록 구성된다. 이전의 예에서, 하드웨어는 소프트웨어로부터의 예상되는 사용량에 기초하여 평가를 수행한다. 그러나, 여기서 소프트웨어는 하드웨어(MSR(550))에 질의하고, 하나 이상의 하드웨어 자원들의 사용량 레벨을 수신할 수 있다. 그 다음, 소프트웨어는 그 자신의 가이드라인에 기초하여 다음 커밋 포인트에 대한 원자 실행을 계속하기에 충분한 자원들이 존재하는지를 결정할 수 있다. 이것은 사용자가 얼마나 많은 하드웨어를 이용할지를 결정할 수 있도록 하므로, 사용자에게 보다 많은 융통성을 제공할 수 있다. 그 결과, 프로세서 설계자는 프로세서가 보다 많은 제어를 유지해야 하는지의 여부 또는 사용자가 그러한 결정들을 수행할 수 있는지의 여부를 선택할 수 있다.
특정한 예시적인 예로서, 프로세서는 잠재적으로 동적인 리사이징을 위해 삽입/최적화된 트랜잭션을 포함하는 프로그램 코드(510)를 최적화 및 실행하기 위해 동적 컴파일러 코드를 실행하는 것으로 가정한다. 여기서, 프로세서(도시되지 않음)의 스레드에 대한 인스트럭션 포인터에 기초하여 프로세서(도시되지 않음)에 대한 페치 로직이 로드 동작(515)을 페치한다. 로드 버퍼 엔트리가 로드 버퍼에서의 로직(530)/하드웨어(535)에 할당된다. 로드는 로직(530)에 의해 스케쥴링되고 디스페치될 뿐만 아니라, 하드웨어(535)(캐시, 버퍼, 또는 레지스터 파일과 같은 트랜잭션 실행을 지원하는 자원)로부터 결정된 사용량 레벨(536)을 로딩하도록 실행 유닛(540)에 의해 실행된다. 로드 또는 이전의 인스트럭션은 동기적으로 하드웨어(535)가 이용도를 결정하고/하거나 이용도를 MSR(550)에 위치시키도록 할 수 있음을 주지해야 한다. 대안적으로, 하드웨어(535)는 (이벤트에 기초하여 또는 주기적 특성으로) 이용도 레벨을 MSR(550)에 비동기적으로 위치시킬 수 있다. 어떠한 방식으로든, 사용량 레벨은 동작(516)에 의해 판독 및 평가된다.
예를 들어, 동작(516)은 예상되는 사용량 레벨 또는 소프트웨어에 의해 정의된 다른 임계값 레벨을 갖는 로딩된 하드웨어 사용량 레벨을 평가하는 부울(Boolean) 표현을 포함할 수 있다. 사실상, 부울 표현은 바로 이하에서 보다 상세히 기술되는 조건부 서술 및/또는 점프 인스트럭션(517)의 일부일 수 있다. 여기서, 하드웨어 사용량 레벨의 평가가, 트랜잭션이 조기 커밋되어야 함을 나타낸다면, 오피코드(517o)를 통해 디코더들(525)에 의해 인식된 것으로서의 점프 인스트럭션(517)이 실행되어, 전술한 바와 같은, 목적지 어드레스(520)로 분기되어, 트랜잭션을 커밋하고 다른 트랜잭션을 재시작한다.
이제 도 6을 참조하면, 트랜잭션들의 동적 리사이징을 지원하기 위한 하드웨어의 다른 실시예가 도시된다. 일 실시예에서, 카운터(650)는 루프(615)의 실행을 통한 반복들의 수를 카운트하도록 구성된다. 카운터(650)는 하드웨어, 소프트웨어, 펌웨어, 또는 그들의 조합으로 구현될 수 있다. 예를 들어, 카운터(650)는 값을 유지하는 레지스터일 수 있다. 그리고, 소프트웨어 코드가 루프를 통한 각각의 반복시에 현재 값을 판독하고, 현재의 값을 새로운 값으로 수정(증가/감소)하고, 새로운 값을 레지스터에 저장한다. 본질적으로, 소프트웨어는 카운터를 유지한다. 그러나, 하드웨어 카운터는 마찬가지로 루프의 각각의 반복의 시작 또는 종료시에 증가/감소될 수 있다.
일 실시예에서, 카운터(650)의 카운터 값을 이용하여 트랜잭션의 조기 커밋이 발생되는 때를 결정한다. 예를 들어, 카운터(650)는 그것이 임계값에 도달할 때까지 루프의 반복의 수를 카운트한다. 임계값에 도달할 때, 카운터는 만료되거나 또는 오버플로우되어 조기 커밋을 초래한다. 카운터는 0에서 시작하여, 임계값에 도달(오버플로잉)할 때까지 카운트 업하거나, 또는 소정이 값에서 시작하여, 0으로 카운트 다운(만료 또는 언더플로우잉)됨을 주지해야 한다.
임계 값(또는 제로로 감소하는 카운터에 대한 시작 값)이 임의의 방식으로 결정될 수 있다. 그것은 하드웨어에 포함되거나 또는 소프트웨어에 의해 설정되는 정적인 사전정의된 값일 수 있다. 여기서, 정적인 사전정의된 값은 프로세서에 포함된 하드웨어의 유형 또는 크기뿐만 아니라, 실행되는 코드의 유형 또는 크기와 같은 임의의 알려진 특성에 기초하여 하드웨어 또는 소프트웨어에 의해 지능적으로 선택될 수 있다. 또는, 보수적인 값(conservative value)과 같은 정적인 사전정의된 값이 느리게 선택되어, 반복의 수를, 롤백(roll-back)이 상당히 감소되는 작은 충분한 수로 제한한다.
대안적인 실시예로서, 임계값(시작 값)이 동적으로 선택되고 변경가능하게 된다. 여기서, 하드웨어, 소프트웨어, 또는 그들의 조합은 임의의 특성(들)에 기초하여 초기 시작 값(임계값)을 선택할 수 있다. 예를 들어, 이용가능한 캐시 라인 또는 저장 버퍼 엔트리의 수(예를 들면, 32)는, 임계값(예를 들면, 4)을 결정하기 위해 코드의 단일 루프 반복에서의 저장들의 수(예를 들면, 8)의 카운트에 의해 나누어진다. 일 실시예에서, 저장들의 수의 평가는, 다수의 저장들이 단일의 캐시 라인만을 터치할 수 있으므로, 합리적으로 보수적이다. 그러므로, 보다 공격적인 초기 값이 이용될 수 있다. 다른 예로서, 코드 또는 하드웨어가 코드 크기/유형, 하드웨어 유닛 크기/유형, 또는 루프의 실행이 완료를 위한 충분한 자원들을 갖도록 보장하는 다른 알려진 요인에 기초하여, 공격적 또는 보수적 값을 선택한다. 더욱이, 하드웨어 또는 소프트웨어는 코드를 프로파일하여, 시작/임계 값을 제공할 수 있다. 여기서, 임계값 수를 포함하는 소트트웨어 힌트가 루프 시작의 실행 이전에 제공되고, 카운터가 해당 임계값 수에 기초하여 설정된다. 또는, 하드웨어는 코드를 유사하게 프로파일하고, 코드의 영역의 프로파일 히스토리에 기초하여 카운터를 설정할 수 있다.
일 실시예에서, 카운터를 초기화한 이후에, 임계값(시작 값)이, 루프의 실행 분석(코드 프로파일링 또는 롤백 결정)에 기초하여 조절되는 것과 같이 동적으로 수정된다. 본질적으로, 일 실시예에서, 카운터(650)는 제한된 하드웨어 자원들로 인해 롤백 또는 수용가능한 수의 롤백이 발생되기 이전에 실행될 수 있는 루프(615)의 반복들의 수를 평가하는데 이용된다. 따라서, 수용가능한 수의 롤백보다 더 많이 발생된다면, 이전의 임계값이 감소되어, 커밋이 발생되기 전에 반복의 수를 감소시킴으로써 롤백의 수를 감소시키게 된다. 이러한 시나리오에서, 너무 빈번한 롤백은 실행 시간을 낭비하며, 잠재적으로 지연을 초래한다. 그러나, 임계값이 (비효율적인 원자 실행을 초래하는 여전히 풍부한 자원이 이용가능할 때 트랜잭션을 조기에 비본질적으로 커밋하는) 너무 보수적이지 않도록 보장하기 위해, 임계값은, 일 실시예에서, 롤백이 발생될 때까지 증가된다. 증가/감소는 단일의, 다수의 또는 지수적 증가로 발생될 수 있음을 주지해야 한다. 예로서, 시작 값이 처음에 63으로 설정되는 것으로 가정한다(즉, 64개의 반복이 커밋 이전에 허용됨). 하드웨어 제약으로 인해 다수의 중단/롤백이 검출될 때, 임계값은 62로 감소된다. 후속하는 롤백시에, 그것은 실행이 효율적으로 완료하도록 하는 균형된 시작 값이 결정될 때까지, 2(60), 4(56), 8(48) 등에 의해 더 감소된다.
도 6의 설명은 조건부 커밋 인스트럭션에 대한 특정한 참조 없이 루프 반복의 수를 카운트하기 위한 카운터를 참조하여 이루어졌음을 주지해야 한다. 여기서, 임계값에 도달하는 카운터는 하드웨어를 통해 비동기적으로 커밋을 시작할 수 있다. 그러나, 다른 실시예에서, 카운터(650)는 도 5 및 6으로부터의 조건부 커밋 코드와 함께 동작한다. 예로서, 카운터는 이용가능한 하드웨어 자원들의 양을 결정/평가하는 하드웨어 메카니즘일 수 있으며, 조건부 커밋 인스트럭션은 하드웨어 카운터에 기초하여 커밋 코드로 점프하도록 한다. 예를 들어, 카운터(650)가 9로 초기화되는 것으로 가정한다(조건부 커밋이 발생되어야 하기 전에 10 반복이 허용됨). 그리고, 루프(615)의 모든 반복시에, 조건부 점프 인스트럭션과 같은 조건부 커밋 인스트럭션이 실행되어, 카운터가 만료(0에 도달됨)하는 경우, 브랜치 타겟 어드레스로 점프한다. 10번째 반복이 완료되고, 조건부 점프가 실행될 때, 실행 흐름은 실행 원자 영역의 헌신을 위해 타겟 어드레스로 점프한다.
카운터는 개별적인 하드웨어 유닛들의 정확한 특정 사용량 레벨 측정이 아니지만, 그것은 잠재적으로 보다 많은 모든 포함하는 평가이다. 전술한 바와 같이, 임계값의 동적인 조절을 통해, 하드웨어 제한에 기초하여 롤백을 감소시키기 위한 최적의 반복 수가 발견될 수 있다. 따라서, 임의의 이전에 식별되지 않은 하드웨어 제한이 롤백을 초래한다면, 동적인 카운터 임계값이 그것을 캐치할 수 있고, 설계자 또는 프로그래머에 의한 개별적인 식별은 그러한 식별되지 않은 원인을 남겨둘 수 있다. 더욱이, 카운터는 단위 레벨 입도 뿐만 아니라, 도를 넘는 광역적 입도 둘다를 제공하기 위해 특정 하드웨어 유닛 이용도 측정과 함께 이용될 수도 있다.
이전의 설명은 기본적으로 하드웨어 자원들이 고갈되기 전에 트랜잭션들을 조건부로 커밋하는 것에 초점을 맞추었다. 또는, 실행을 지원하기에 충분한 자원들이 이용가능한지를 결정하기 위해 예상되는 이용도에 대하여 하드웨어 이용도를 결정한다. 그러나, 일부 실시예에서, 원자 영역을 통해 실행하는 것이 바람직할 수 있다. 그리고, (사용자 인스트럭션, 이벤트 또는 하드웨어 정의 시간에 응답하여) 주기적으로 원자 영역을 체크포인트한다. 그러므로, 실제 하드웨어 제한, 예외, 중단 또는 다른 결함을 조우할 때에, 원자 영역은 최근의 중간의 체크포인트로 롤백되고, 자유 자원들로 커밋될 수 있다. 본질적으로, 포워드 룩킹 평가(forward-looking estimation)을 행하고, 트랜잭션을 선행적으로 커밋하는 대신에, 일 실시예에서, 트랜잭션은 전체 트랜잭션의 중단 및 재시작을 통상적으로 요구하는 실제 자원 제한을 조우할 때에만 리사이징된다. 이것은 롤백이 발생되는 경우, 그것이 롤백되는 수용가능한 양의 실행이도록 보장하기 위해 트랜잭션 내에서 다수의 체크포인트들을 수행함으로써 달성된다.
도 7a를 참조하면, 트랜잭션 내에 추론적 체크포인트들을 제공하는 것을 포함하는 코드 최적화 방법에 대한 흐름도의 실시예가 도시된다. 블록(705)에서, 최적화될 프로그램 코드의 섹션이 식별된다. 도 2a의 설명과 유사하게, 코드의 섹션/영역은 섹션에 관한 사용자 식별/힌트, 프로그램 분석, 코드 프로파일링, 코드 속성들(특정 유형, 포맷, 순서, 또는 영역의 특성 - 루프 또는 저장의 수 -), 또는 최적화될 코드 영역을 식별하는 다른 알려진 방법에 기초하여 식별될 수 있다. 일 실시예에서, 코드는 이진 코드를 포함한다. 그리고, 이진 코드의 실행 동안, 그것은 동적으로 최적화된다. 그 결과, 실행을 위한 최적화 동안, 이진 코드에서 루프를 조우하게 된다. 그러므로, 롤백이 실행의 큰 손실을 초래하지 않는 체크포인트들 사이의 거리가 충분히 작도록 보장하기 위해 루프가 최적화되도록(추론적 체크포인트 삽입) 결정된다. 예로서, 아래의 의사 코드 F는 최적화될 코드 영역의 예를 도시한다.
Figure pct00006
의사 코드 F : 최적화될 코드 영역
도 2a의 설명과 또한 유사하게, 흐름들(710, 715)에서, 코드의 영역이 구분된다(섹션의 시작부에 시작 원자 영역 인스트럭션을 삽입 및 섹션의 끝에 종료 원자 영역 인스트럭션을 삽입). 그리고, 전술한 바와 같이, 코드 영역은 다수의 엔트리 및 다수의 엑시트를 포함할 수 있다. 블록(720)에서, 프로그램 코드 내의 추론적 체크포인트 위치가 결정된다. 다수의 추론적 체크포인트가 최적화될 코드의 영역 내에 결정/할당될 수 있지만, 설명의 용이성을 위해 단지 하나의 체크포인트만이 이하에 보다 상세히 기술된다.
추론적 체크포인트를 결정하는 것은 원자 영역 내의 롤백 영향을 최소화하기 위한 임의의 알려진 할당/결정 알고리즘에 기초할 수 있다. 제1 예로서, 추론적 체크포인트가 루프 내에 삽입되어, 추론적 체크포인트를 매 반복시마다 조우하게 된다. 여기서, 추론적 체크포인트는 루프의 시작부인 것으로 또는 루프의 에지에서 결정될 수 있다. 다른 예로서, 코드의 동적 프로파일링은 때로는 하드웨어 자원들의 소모를 초래하거나 또는 높은 인스트럭션 카운트들을 갖는 실행 경로들을 나타낸다. 그러므로, 추론적 체크포인트들이 그러한 실행 경로들에 할당되어, 긴 실행 경로 내의 중단으로 인한 전체 원자 영역의 롤백을 피하도록 한다. 유사하게, 독점하거나 또는 자원을 무겁게 하는 것으로 알려진 실행 경로들이 그들에 할당된 추론적 체크포인트들을 가질 수 있다. 본질적으로, 전체 트랜잭션 및 전체 트랜잭션의 관련된 롤백 이전의 종래의 체크포인트 대신에, 보다 작은 롤백(덜 낭비된 실행)이 트랜잭션 내의 체크포인트들(로컬, 내부적, 또는 일시적 체크포인트들)을 이용함으로써 수행된다. 그 결과, 보다 큰 영역들이 최적화될 수 있다. 그리고, 자원 제한을 조우할 때, 보다 작은 롤백이 수행된다. 또한, 롤백 포인트에서, 트랜잭션이 잠재적으로 커밋되고, 결과적인 결함들이 처리되고, 다른 트랜잭션들이 재시작된다.
흐름(725)에서, 추론적 체크포인트 코드가 추론적 체크포인트 위치에 삽입된다. 추론적 체크포인트 코드는 메모리, 캐시 메모리 및/또는 레지스터 파일과 같은 추론적 하드웨어 자원들을 체크포인트하기 위한 것이다. 그리고, 일 실시예에서, 추론적 체크포인트 코드는 후속하는 중단 상태에 응답하여 체크포인트에 대한 하드웨어 자원들을 복구시키기 위한 코드를 또한 포함할 수 있다. 도 7b를 간단히 참조하면, 추론적 체크포인트 코드를 삽입하기 위한 흐름도의 실시예가 도시된다. 의사 코드 G는 추론적 체크포인트 코드의 삽입 이후의 코드의 예시적인 예를 또한 도시한다.
Figure pct00007
의사 코드 G : 추론적 체크포인트 코드가 삽입된 이후의 코드 영역
흐름(726)에서, 추론적 체크포인트 인스트럭션/동작(B5에서의 L1)이 추론적 체크포인트(B2, B5의 루프 백 에지)에서 삽입된다. 일 실시예에서, 추론적 체크포인트 인스트럭션은 추론적 하드웨어 자원들의 체크포인트(현재의 스냅샷)을 개시하기 위한 임의의 인스트럭션을 포함한다. 예를 들어, 추론적 체크포인트 인스트럭션은 프로세서의 디코더들에 의해 인식가능하다. 그리고, 일단 디코딩되고, 스케쥴링되고, 실행되면, 추론적 레지스터 파일, 저장 버퍼, 또는 둘다, 체크포인트 추론적 레지스터 파일 및 추론적 캐시와 같은 체크포인트 저장 구조들 내로 체크포인트된다(현재 상태의 스냅샷).
더욱이, 일 실시예에서, 추론적 체크포인트 코드는 현재의 롤백을 초래한 동일한 롤백 상황을 잠재적으로 피하기 위한 일부의 동작을 수행하는 일부의 다른 코드를 또한 포함한다. 예를 들어, 제한된 하드웨어 자원들로 인한 롤백이 발생되고, 완화 동작이 취해지지 않는다면, 하드웨어 제한을 매 시간마다 조우하게 되어, 포워드 진행이 행해지지 않게 된다.
예로서, 의사 코드 H에서의 좌측의 코드가 최적화되는 것으로 가정한다.
Figure pct00008
의사 코드 H : 최적화될 코드 영역
여기서, 최적화된 코드 내의 롤백을 처리하는 방법에 대해 다수의 시나리오가 존재한다. 제1 예로서, 아래의 의사 코드 I에 의해 도시된 바와 같이, 추론적 체크포인트 인스트럭션이, 추론적 체크포인트에 대한 롤백 이후의 통상적인 루프 실행 또는 재실행 사이를 구별할 수 있는 조건부(브랜치) 인스트럭션과 쌍으로 된다. 브랜치 인스트럭션은, 실행될 때, 이전에 체크포인트된 상태를 롤백하기 위한 임의의 알려진 방식으로 롤백을 처리하기 위해 상이한 실행 경로로 점프한다.
Figure pct00009
의사 코드 I : 추론적 체크포인트 인스트럭션과 브랜치 인스트럭션의 페어링
이하의 의사 코드 J에 도시된 다른 시나리오에서, 추론적 체크포인트 인스트럭션이, 일부 실시예에서 위에서 기술된 단일의 체크포인트 및 브랜치 인스트럭션 내로, 브랜치 인스트럭션과 결합된다.
Figure pct00010
의사 코드 J : 추론적 체크포인트 인스트럭션과 브랜치의 결합
의사 코드 G의 설명을 참조하면, 일 실시예에서, 추론적 체크포인트 코드는 실행될 때, 체크포인트 저장 구조들로부터 최근의 체크포인트의 정확한 상태를 복구 또는 복원하기 위해, 코드(B5)를 수리(fix-up)(롤백, 복구, 재구성, 복원 등으로 지칭될 수도 있음)하는 것을 또한 포함한다. 전술한 다른 시나리오들은, 일 실시예에서, 추론적 체크포인트 코드 및/또는 수리 코드로 고려될 수도 있음을 주지해야 한다. 또한, 의사 코드 G에 도시된 바와 같이, 수리 코드는 트랜잭션/원자 영역을 커밋하기 위한 커밋 코드(B6)를 포함할 수도 있다. 본질적으로, 추론적 체크포인트 코드는 추론적 하드웨어를 체크포인트한다. 그리고, 추론적 하드웨어의 소모 또는 중단을 초래하는 이벤트(중단, 동적 단정, 메모리 앨리어스 검사 등)와 조우할 때, 체크포인트 코드는 추론적 하드웨어에서의 정확한 상태를 복원한다. 또한, 재실행 및 계속된 실행에 대해 추론적 하드웨어를 해방(free up)시키기 위해, 트랜잭션이 선택적으로 커밋된다. 이러한 설명으로부터, 수리 코드에 도달하는 것은 다수의 방식으로 행해질 수 있다. 예로서, 수리 코드는 (1) 체크포인트 저장 구조들이 추론적 하드웨어를 체크포인트할 충분한 공간을 갖지 않는 추론적 체크포인트 동작의 실행, (2) 추론적 하드웨어가 수용할 수 없는 추론적 동작의 실행, (3) 추론적 실행 동안의 예외, 또는 (4) 트랜잭션 내의 일시적 내부 체크포인트에 대한 롤백을 초래하는 임의의 다른 이벤트로부터 입력될 수 있다.
더욱이, 추론적 체크포인트는 체크포인팅이 결함, 예외, 또는 다른 예측할 수 없는 원인으로 인한 임의의 그러한 롤백/중단을 상당히 싸게 만들면서(전체 원자 영역의 시작 대신에 체크포인트에 대한 리턴시에 실행이 덜 소모됨), 추론적 자원들이 부족으로 인한 중단들을 피하는 것과 같은 다른 이점들을 제공하기 위해 조건부 커밋과 결합될 수 있다. 아래의 의사 코드 K는 그러한 결합의 한 가지 예를 도시한다.
Figure pct00011
의사 코드 K : 추론적 체크포인트와 조건부 커밋의 결합
더욱이, 일 실시예에서, 조건부 커밋 인스트럭션은, 이하의 의사 코드에 도시된 바와 같이, 추론적 체크포인트를 알게 된다.
Figure pct00012
의사 코드 L : 추론적 체크포인트를 아는 조건부 커밋
이러한 경우, 시스템이 (전술한 바와 같이) 자원들을 소모하려고 하거나, 또는 (실행이 추론적 체크포인트로 롤백한 이후에) 실행이 롤백 리플레이인 경우, 영역_검사(조건부 커밋) 인스트럭션이 L2로 점프한다.
또한, 추론적 체크포인트 및 조건부 커밋 인스트럭션들이 함께 이용될 수 있을 뿐만 아니라, 인스트럭션들 자체가, 일 실시예에서, 이하의 의사 코드 M에 도시된 바와 같이 결합된다.
Figure pct00013
의사 코드 M : 추론적 체크포인트 및 조건부 커밋에 대한 하나의 인스트럭션
여기서, 결합된 인스트럭션이 실행될 때, 체크포인트가 수행되고, 조건부 커밋이 평가된다(하드웨어가 자원들에 대해 소모 또는 런 로우(run low)하는 경우 커밋). 여기서, 시스템이 추론적 자원들에 대해 런 로우하거나, 또는 실행이 기록된 추론적 체크포인트로 롤백하는 경우, 실행은 L2로 점프하고, (이러한 예에서) 추론적 자원들을 커밋하고 결과적인 결함들을 서비스함으로써 그것을 처리한다.
이전의 설명은 이전의 (또는 최근의 추론적) 체크포인트에 대한 롤백을 참조하였지만, 일단 하드웨어가 런 로우되면, 결합이 검출되고, 예외가 발생되거나, 또는 다른 예측할 수 없는 이벤트가 중단을 초래하고, 다른 경로들이 그러한 중단에 응답하여 조사될 수 있다. 사실상, 일 실시예에서, 중단시에, 하드웨어, 소프트웨어, 또는 그들의 조합이 다음에 무엇을 해야할 지를 결정한다. 예를 들어, 하드웨어 생성 결함/이벤트와 같은 결함이 원자 실행 동안에 발생되는 것으로 가정한다. 원자 실행이 중단된다. 그리고, 통상적으로, 결함의 유형을 결정하고 결함을 서비스하기 위해, 제어가 소프트웨어로 핸드오버(handed over)된다.
여기서, 핸들러와 같은 소프트웨어가, 결함의 유형, 가장 최근의 추론적 체크포인트에 대한 롤백시의 어려움, 인스트럭션들의 수 또는 가장 최근의 추론적 체크포인트 대신에 마지막 커밋 포인트에 대한 롤백에 의해 손실된 실행의 양, 또는 리턴을 위해 프로그램에서의 실행의 포인트를 선택시의 다른 알려진 요인과 같은 임의의 수의 요인들에 기초하여 다음에 무엇을 해야할지를 결정할 수 있다. 본질적으로, 이러한 예시적인 예에서, 핸들러와 같은 소프트웨어가, 실행이 원자 영역의 시작, 원자 영역 내의 마지막 커밋 포인트, 또는 원자 영역 내의 마지막 추론적 체크포인트에 대해 롤백되어야 하는지를 결정한다. 그리고, 예들은 결정을 행하는 소프트웨어에 초점을 두었지만, 하드웨어도 그러한 결정을 행할 수 있다. 일 실시예에서, 새로운 인스트럭션(추론적_롤백)이, 결정을 행할 때에 이용된다. 여기서, 추론적_롤백 인스트럭션은 프로그램 코드에서의 적절한 것(추론적 체크포인트 또는 최근의 커밋 포인트)에 대한 리턴에서의 결과들을 디코딩 및 실행한 임의의 정보를 포함한다.
본 명세서에서 기술된 코드는 동일한 블록, 영역, 프로그램, 또는 메모리 공간 내에서 공동 배치되지 않아도 됨을 주지하는 것이 중요하다. 사실상, 추론적 체크포인트 동작은 메인 프로그램 코드 내의 루프백 에지(loop-back edge)에서 삽입될 수 있다. 그리고, 가장 가까운 체크포인트에 대한 롤백에 대한 코드를 포함하고, 선택적으로 트랜잭션을 커밋하는 수리 코드가, 라이브러리 또는 코드의 다른 부분에 위치될 수 있다. 여기서, 메인 프로그램 코드가 실행된다. 그리고, 수리 코드가 입력될 때, 라이브러리 코드의 하나 이상의 기능들에 대한 호출이 실행되어, 롤백 및 커밋을 수행하게 된다. 또한, 하드웨어는 소프트웨어의 지시 없이, 유사한 체크포인트 동작들을 수행할 수 있다. 여기서, 하드웨어는 주기적으로 또는 이벤트 구동 기초로, 추론적 하드웨어를 투명하게 체크포인트한다. 그리고, 추론적 하드웨어의 소모에 응답하여, 프로세서는 가장 마지막 체크포인트에 대한 실행을 롤백하고, 트랜잭션을 커밋하고, 트랜잭션을 재시작하고, 체크포인트와 롤백 포인트 사이의 인스트럭션들을 리플레이한다. 소프트웨어의 관점으로부터, 실행은 통상적으로 계속되며, 하드웨어는 모든 자원 제약들 및 재실행을 처리한다. 또한, 하드웨어와 소프트웨어 사이의 임의의 레벨의 협동을 또한 이용하여, 로컬, 내부적 트랜잭션 체크포인트를 달성할 수 있다.
도 7a를 참조하면, 블록(730)에서, 프로그램 코드의 섹션이 최적화된다. 이하의 의사 코드 N은 최적화 이후의 의사 코드 M으로부터의 코드 영역의 예를 도시한다.
Figure pct00014
의사 코드 N : 추론적 체크포인트 및 조건부 커밋에 대한 단일의 인스트럭션을 포함하는 최적화된 코드
최적화의 다른 예로서, 이하의 의사 코드 O는 최적화(의사 코드 G로부터의 코드 영역의 최적화)의 다른 예를 도시한다.
Figure pct00015
의사 코드 O : 최적화 이후의 코드 영역
전술한 바와 같이, 임의의 알려진 최적화 기법이 원자 영역 내의 코드에 대해 수행될 수 있다. 전부는 아닌 리스트이며, 순수하게 예시적인 코드 최적화의 몇 가지의 예들은, PRLE, PDSE, 루프 최적화, 데이터 흐름 최적화, 코드 생성 최적화, 경계 검사 제거, 브랜치 오프셋 최적화, 데드 코드 제거, 및 점프 스레딩을 포함한다. 의사 코드 O에서, B6에서의 커밋 이후에, 다른 트랜잭션이 B6에서 시작되고, 실행이 B2에서 계속된다. 다른 실시예들(도시되지 않음)에서, 코드는 B3에서 재입력될 수 있다. 원자 영역의 구분 및 조건부 커밋의 삽입은, 일부 실시예에서 프로그램 코드를 최적화하는 것으로 고려될 수도 있다.
다음, 도 8을 참조하면, 트랜잭션의 실행 동안 메모리를 추론적으로 체크포인팅하는 방법에 대한 흐름도의 실시예가 도시된다. 흐름(805)에서, 트랜잭션이 실행된다. 일례로서, 트랜잭션은 코드 최적화 보장 원자성(atomicity) 부근에 트랜잭션을 삽입하기 위해 실행시간 동안 동적으로 최적화되는 이진 코드에 있다.
흐름(810)에서, 트랜잭션으로부터의 추론적 체크포인트 인스트럭션을 조우하게 된다. 또한, 추론적 체크포인트 인스트럭션은, 도 7a-7b를 참조하여 전술한 바와 같이, 추론적 체크포인트에서 최적화기에 의해 실행시간 동안 삽입될 수 있다. 프로세서는 (전형적으로, 사전지정된/정의된 동작 코드를 검출하는 디코더에 의해) 추론적 체크포인트 인스트럭션을 인식한다. 그리고, 추론적 체크포인트 인스트럭션에 응답하여, 추론적 레지스터 파일이 흐름(815)에서 체크포인트 (추론적) 레지스터 파일에서 체크포인팅된다. 또한, 추론적 캐시가 흐름(820)에서 저장 버퍼를 체크포인팅할 충분한 공간을 포함하는지의 여부가 결정된다. 충분한 공간이 이용가능하다면, 흐름(825)에서 저장 버퍼는 추론적 캐시에서 체크포인팅된다. 그러나, 충분한 공간이 없다면, 수리/롤백 절차(이하에 보다 상세히 기술되는 블록들(845-855))가 수행된다.
그 결과, 트랜잭션의 실행 동안에 단기 롤백 이벤트를 조우한다면, 현재의 실행을 위해 이용되는 저장 버퍼 및 추론적 레지스터 파일은 체크포인팅된 상태로 복구될 수 있다. 예로서, 흐름(830)에서, 저장 동작을 조우하게 된다. 흐름(835)에서, 저장 버퍼가 저장 동작을 위해 할당되도록 이용가능한 엔트리와 같은 이용가능한 엔트리를 포함하는지가 결정된다. 그리고, 쉽게 이용가능한 엔트리가 존재하거나, 또는 할당해제 및 재할당될 수 있는 엔트리가 존재한다면, 블록(840)에서 엔트리가 그렇게 할당된다. 그러나, 이용가능한 저장 버퍼 엔트리가 없다면, 롤백 절차(블록들(845-855))가 수행된다.
롤백/복원 절차(845-855)는 이전의 체크포인트로부터 정확한 아키텍쳐 상태를 복구하는 것이다. 여기서, 롤백은 커밋되지 않은(광역적으로 가시적으로 되지 않은) 추론적 실행 동안이다. 따라서, 광역적 가시 상태(비추론적 저장 구조들)가 동일하게 유지되어야 한다. 그러나, 현재의 추론적 실행을 지원하는 추론적 하드웨어 구조들이 복구된다. 추론적 캐시는 저장 버퍼로부터 가장 최근의 체크포인트까지의 추론적 업데이트들을 이미 유지하고 있으므로, 저장 버퍼는 블록(850)에서 플러시된다. 즉, 트랜잭션의 시작으로부터 가장 최근의 체크포인트까지의 저장들은 추론적 캐시에 유지된다. 그리고, 가장 최근의 체크포인트로부터 현재의 실행 포인트(롤백의 개시)까지의 저장들은 저장 버퍼에 유지된다. 그러므로, 롤백되는 그러한 저장들은 저장 버퍼로부터 간단하게 폐기된다.
또한, 추론적 레지스터 파일이 체크포인트 레지스터 파일로부터 복구된다. 여기서, 추론적 레지스터 파일은 가장 최근의 체크포인트로부터의 것들을 포함하는 트랜잭션의 시작부로부터의 모든 업데이트들을 유지하므로, 추론적 레지스터 파일은 체크포인트 레지스터 파일로부터의 값들로 리로딩된다. 원래의 체크포인트가 전체 추론적 레지스터 파일의 카피를 포함한다면(단지 추론적 실행 동안 수정된 레지스터들만을 선택적으로 저장하는 것이 아님), 체크포인트 레지스터 파일은 추론적 레지스터 파일로서 리라벨링(이용)될 수 있고, 이전의 추론적 레지스터 파일은 플러시되고, 후속하여 체크포인트 레지스터 파일로서 이용될 수 있다. 또는, 추론적 레지스터 파일이 추론적 체크포인트 레지스터 파일에 대해 (하나 또는 몇 사이클에서) 플러시 카피된다.
흐름(860)에서, 트랜잭션은 선택적으로 커밋될 수 있다. 롤백 절차가 예외, 추론적 캐시에서의 공간 부족, 또는 저장 버퍼에서의 공간 부족에 응답하여 달성되기 때문에, 트랜잭션은 그러한 자원들을 해방하도록 커밋될 수 있다. 여기서, 저장 버퍼 및 추론적 캐시 업데이트들이 비추론적 캐시 메모리로 커밋되어, 그러한 자원들을 해방하게 된다(흐름들(875-880)에 도시됨). 그리고, 유사하게, 추론적 레지스터 파일이 비추론적 레지스터 파일로 커밋되고, 추가의 추론적 실행을 위해 그것을 해방한다(흐름들(875-880)에 도시됨). 더욱이, 트랜잭션의 완전한 중단이 수행된다면(865), 저장 버퍼 및 추론적 캐시가 플러시되어, 블록(870)에서의 프리-트랜잭션(비추론적) 상태로 그들을 복구시킨다.
도 9를 참조하면, 추론적 체크포인팅을 지원하도록 구성된 하드웨어의 논리적 표현의 실시예가 도시된다. 디코더들(디코드 로직)(910)은 추론적 체크포인트 인스트럭션(SCPI)(905)을 인식하도록 구성 또는 상호접속된다. 예를 들어, 도 9의 하드웨어를 포함하는 프로세서에 대한 인스트럭션의 사전정의된 포맷이 하드웨어로 지정 및 설계될 수 있다. 그리고, 지정된 비트 패턴들을 갖는 인스트럭션의 일부분이 지정된 인스트럭션들(그 중 하나가 SCPI(905)임)에 대응한다.
그 다음, SCPI에 응답하여, 추론적 저장 구조에 유지된 추론적 값들(935)이, 추론적 체크포인트 저장 구조에서의 추론적 체크포인트 값들(940)로서 체크포인팅된다. 실행 로직(920)은 SCPI(920)를 실행하기 위해 디코더들에 연결되는 것으로서 도시된다. 또한 명백하게, 때로는 디코딩과 실행 사이에 많은 파이프라인 단들이 존재할 수 있다. 예를 들어, SCPI는 트레이스 캐시 내의 동작의 트레이스로 디코딩될 수 있으며, 그러한 동작들은 버퍼들에 큐잉되고, 스케쥴링되고, 디스패치되고, 실행되어, 본 명세서에서 기술된 동작들/방법들을 수행할 수 있다.
위에서 간단히 언급한 바와 같이, 체크포인트는 소정의 시점에서의 값들의 상태의 스냅샷, 또는 그러한 시점에서의 값의 상태를 복원하기에 적어도 충분한 정보를 포함한다. 따라서, 체크포인트는, 일 실시예에서, 추론적 값들(935)의 전체 카피를 추론적 체크포인트 값들(940)로서 포함한다. 여기서, 추론적 값들(935)은 추론적 레지스터 파일로부터의 추론적 레지스터 파일 값들을 포함할 수 있고, 추론적 체크포인트 값들(940)은 시간에 있어서 가장 최근의 체크포인트에서의 추론적 레지스터 파일의 카피를 포함한다. 다른 예로서, 추론적 체크포인트 값들은 마지막 체크포인트 이후에 수정된 추론적 값들(935)만을 포함한다. 여기서, 추론적 값들(935)은 추론적 레지스터 파일로부터의 추론적 레지스터 파일 값들을 포함할 수 있고, 추론적 체크포인트 값들(940)은 마지막 체크포인트 이후에 수정된 추론적 레지스터 파일에서의 레지스터들로부터만의 마지막 체크포인트로부터의 추론적 레지스터 파일 값들을 포함한다. 또다른 예로서, 추론적 체크포인트 값들(940)은 원자 영역의 시작부로부터 시간에 있어서의 체크포인트까지의 모든 값들을 포함하고, 추론적 값들(935)은 체크포인트로부터 현재의 실행 포인트까지의 추론적 값들 전부를 포함한다. 여기서, 저장 버퍼는 추론적 캐시에 유지되는 (시작으로부터 마지막 체크포인트까지의) 보다 오래된 값들에 추가되는 추론적 값들(935)을 유지할 수 있다.
도 10을 참조하면, 레지스터 파일의 추론적 체크포인팅을 지원하도록 구성된 하드웨어의 논리적 표현의 다른 실시예가 도시된다. 위에서의 설명과 유사하게, 디코더들(1010) 및 실행 로직(1020)은 SCPI(1005)를 각각 수신, 인식 및 실행하도록 구성된다. SCPI(1005)에 응답하여, 추론적 레지스터 파일(1035)은 추론적 체크포인트 레지스터 파일(1040) 내로 체크포인팅된다. 전술한 바와 같이, 체크포인트는 체크포인트 레지스터 파일(1040) 내로의 레지스터 파일(1035)의 플래시 카피를 포함할 수 있다. 또는, 파일(1035)에서의 레지스터가 수정될 때, 오래된 값이 레지스터 파일(1040) 내로 체크포인팅된다. 여기서, SCPI(1005)에 응답하여 값들을 카피하는 대신에, 파일(1035)에서의 그들의 카운터파트의 수정시에 카피된 파일(1040)로부터의 오래된 체크포인트 값들이 클리어되거나 또는 무효한 것으로 마킹된다. 실행이 계속될 때, 수정된 레지스터들은 파일(1040)에서 다시 체크포인팅된다.
가장 최근의 체크포인트에 대한 (도 8의 블록(820)에서와 같이 추론적 캐시에서의 공간 부족, 도 8의 블록(840)에서와 같은 저장 버퍼에서의 공간의 부족, 예외, 또는 다른 롤백 이벤트로부터의) 롤백에 응답하여, 체크포인팅된 값들은 (수정되거나 또는 완전히 카피되었든 간에) 추론적 체크포인트 레지스터 파일(1040)로부터 추론적 레지스터 파일(1035) 내로 복구된다. 그러나, 트랜잭션의 중단과 같은 트랜잭션 영역의 가장 처음에 대한 롤백이 존재한다면, 추론적 레지스터 파일(1035)은, 일 실시예에서, 비추론적 레지스터 파일(1030)로부터 리로딩된다. 본질적으로, 추론적 파일(1035)은 동작하는 추론적 레지스터 파일이다. 그러므로, 트랜잭션은 추론적 레지스터 파일(1035)과 함께 동작(판독 및 기록)한다. 그러므로, 트랜잭션의 시작부에서 로드가 재실행된다면, 비추론적 값들이 리로딩되지 않는다면, 로드는 중단 이전에 추론적 레지스터 파일(1035)에 유지되었던 이후에 수정된 추론적 값을 부주의하게 로딩할 수 있다.
또한, 트랜잭션의 커밋에 응답하여, 추론적 레지스터 파일(1035)은 비추론적 레지스터 파일(1030)로 커밋(카피)된다. 여기서, 추론적 업데이트들이 비추론적 결과로서 광역적으로 가시적으로 만들어진다. 다시, 전체 레지스터 파일(1035)은 비추론적 레지스터 파일(1030)로 카피될 수 있다. 또는, 수정된 추론적 레지스터 파일(1035)에서의 레지스터들만이 비추론적 레지스터 파일(1030)로 카피될 수 있다.
도 11을 참조하면, 캐시 메모리의 추론적 체크포인팅을 지원하도록 구성된 하드웨어의 논리적 표현의 다른 실시예가 도시된다. 도 9-10에 관해 전술한 바와 같이, 디코더들(1110) 및 실행 로직(1120)은 SCPI(1105)를 디코딩 및 실행하도록 구성된다. 여기서, 실행 로직(1120)은, 원자 영역으로부터의 추론적 저장들을 실행할 때, 저장 버퍼(1140)를 이용하여 추론적 업데이트들을 유지한다. 이전의 저장들로부터 로딩하는 동일 영역(로컬 스레드)으로부터의 로드들은 저장 버퍼(1140)에 유지된 추론적 값들로부터 로딩됨을 주지해야 한다. 따라서, 인플라이트(in-flight) 저장 메카니즘의 유사한 로드가 실행 로직(1120)의 로드 실행 유닛들과 저장 버퍼(1140) 사이에 이용될 수 있다. 그러나, 저장 버퍼(1140)에서의 저장의 어드레스에 대한 비추론적 또는 논-로컬(non-local) 로드들이 캐시(1130)에 유지된 비추론적 값을 수신하고, 저장 버퍼(1140)에서의 값을 수신하지 않는다. 또한, 원자 영역으로부터, 체크포인팅되거나 또는 추론적 캐시(1135)로 이동된 저장의 어드레스로의 판독/로드가 존재한다면, 추론적 캐시 값은 직접적으로 또는 저장 버퍼(1140)를 통해 로드에 제공되어야 한다.
SCPI(1105)에 응답하여, 버퍼(1140)에서의 저장 버퍼 업데이트들이 추론적 캐시(1135)로 이동된다. 그 결과, 추론적 캐시(1135)가 원자 영역의 시작부로부터 가장 현재의 체크포인트까지 추론적 업데이트들을 유지한다. 그리고, 저장 버퍼(1140)는 가장 현재의 체크포인트로부터 현재의 실행 체크포인트까지의 추론적 업데이트들을 유지한다. 따라서, 원자 영역의 커밋시에, 추론적 캐시(1135) 및 저장 버퍼(1140)에서의 모든 업데이트들이 비추론적 캐시(1130)로 커밋/이동/카피된다. 도시된 바와 같이, 이러한 커밋은 추론적 캐시(1135)에 대해 저장 버퍼(1140)를 커밋하고, 비추론적 캐시(1130)에 대해 추론적 캐시(1135)를 커밋함으로써 수행된다. 그러나, 저장 버퍼(1140) 및 추론적 캐시(1135) 둘다로부터의 업데이트들은, 다른 실시예에서, 비추론적 캐시(1130)에 직접적으로 제공된다. 커밋 이후에, 업데이트들은 광역적으로 가시적으로 되고, 메모리 계층구조(1150)(상위 레벨 메모리들 및 가정의 위치로)를 통해 전달될 수 있다.
더욱이, 가장 최근의 체크포인트에 대한 로컬 내부적 롤백에 응답하여, 저장 버퍼(1140)가 플러시된다. 전술한 바와 같이, 일 실시예에서, 저장 버퍼(1140)는 가장 최근의 체크포인트로부터 현재의 실행 포인트까지의 업데이트들을 기본적으로 유지한다. 그러므로, 롤백시에, 그러한 업데이트들은 폐기된다. 일례에서, 로컬 롤백이, 원자 영역(도 8의 블록(840))으로부터 새로운 저장 동작을 수용할 수 없는 저장 버퍼(1140)에 응답하여 개시될 수 있음을 주지해야 한다. 그리고, 블록(820)에서, 가득차고 SCPI(1105)에 대해 저장 버퍼(1140) 업데이트들을 캐싱할 수 없는 추론적 캐시(1135)에 응답하여 롤백이 또한 개시될 수 있다. 또한, 중단(전체 원자 영역의 롤백)이 발생될 때, 저장 버퍼(1140) 및 추론적 캐시(1135)(원자 영역의 시작부로부터 현재 실행 포인트까지의 업데이트들) 둘다 플러시된다.
본 명세서에서 이용된 바와 같은 모듈은 임의의 하드웨어, 소프트에어, 펌웨어, 또는 그들의 조합을 지칭한다. 때때로, 분리된 것으로서 도시된 모듈 경계들은 일반적으로 변하는 것이며 잠재적으로 중첩된다. 예를 들어, 제1 및 제2 모듈은 하드웨어, 소프트웨어, 펌웨어, 또는 그들의 조합을 공유할 수 있으며, 잠재적으로 일부의 독립적인 하드웨어, 소프트웨어, 또는 펌웨어를 유지한다. 일 실시예에서, 로직 이라는 용어의 이용은 트랜지스터들, 레지스터들과 같은 하드웨어, 또는 프로그램가능 로직 디바이스와 같은 다른 하드웨어를 포함한다. 그러나, 다른 실시예에서, 로직은 펌웨어 또는 마이크로 코드와 같은, 하드웨어와 통합된 소프트웨어 또는 코드를 또한 포함한다.
본 명세서에서 이용된 바와 같이, 값은 수(number), 상태, 논리 상태, 또는 이진 논리 상태의 임의의 알려진 표현을 포함한다. 때때로, 로직 레벨들, 로직 값들, 또는 논리 값들의 이용은, 단순히 이진 로직 상태들을 나타내는 1들 및 0들로서 지칭된다. 예를 들어, 1은 높은 로직 레벨을 지칭하고, 0은 낮은 로직 레벨을 지칭한다. 일 실시예에서, 트랜지스터 또는 플래시 셀과 같은 저장 셀은 단일의 논리 값 또는 다수의 논리 값들을 유지할 수 있다. 그러나, 컴퓨터 시스템들에서의 값들의 다른 표현들이 이용되어 왔다. 예를 들어, 10진수 10은 이진 값 1010 및 16진법 문자 A로서 표현될 수 있다. 따라서, 값은 컴퓨터 시스템에 유지될 수 있는 정보의 임의의 표현을 포함한다.
더욱이, 상태들은 값들 또는 값들이 부분들에 의해 표현될 수 있다. 예로서, 논리 1과 같은 제1 값은 디폴트 또는 초기 상태를 나타낼 수 있고, 논리 0과 같은 제2 값은 비디폴트 상태를 나타낼 수 있다. 또한, 리세트 및 세트 라는 용어들은, 일 실시예에서, 디폴트 및 업데이트된 값 또는 상태를 각각 지칭한다. 예를 들어, 디폴트 값은 잠재적으로 높은 논리 값, 즉, 리세트를 포함하고, 업데이트된 값은 잠재적으로 낮은 논리 값, 즉, 세트를 포함한다. 값들의 임의의 조합을 이용하여 임의의 수의 상태들을 나타낼 수 있음을 주지해야 한다.
위에서 개시된 방법들, 하드웨어, 소프트웨어, 펌웨어 또는 코드의 실시예들은, 프로세싱 요소에 의해 실행가능한 기계 액세스가능 또는 기계 판독가능 매체 상에 저장된 인스트럭션들 또는 코드를 통해 구현될 수 있다. 기계 액세스가능/판독가능 매체는 컴퓨터 또는 전자 시스템과 같은 기계에 의해 판독가능한 형태로 정보를 제공(즉, 저장 및/또는 송신)하는 임의의 메카니즘을 포함한다. 예를 들어, 기계 액세스가능 매체는 SRAM(static RAM) 또는 DRAM(dynamic RAM)과 같은 RAM, ROM, 자기 또는 광학 저장 매체, 플래시 메모리 디바이스들, 전기 저장 디바이스들, 광학 저장 디바이스들, 음향 저장 디바이스들, 전달된 신호(예를 들면, 반송파, 적외선 신호, 디지털 신호)들을 유지하기 위한 다른 형태의 저장 디바이스들 등을 포함한다.
본 명세서 전체를 통해, "일 실시예" 또는 "실시예"에 대한 참조는, 실시예와 관련하여 기술된 특정한 특징, 구조, 또는 특성이 본 발명의 적어도 일 실시예에 포함됨을 의미한다. 따라서, 본 명세서 전체를 통해 다양한 위치에서 "일 실시예에서" 또는 "실시예에서" 라는 문구의 출현은, 그 모두가 동일한 실시예를 지칭할 필요는 없다. 더욱이, 특정한 특징들, 구조들 또는 특성들은 하나 이상이 실시예에서 임의의 적절한 방식으로 결합될 수 있다.
전술한 명세서에서, 특정한 예시적인 실시예들을 참조하여 상세한 설명이 제공되었다. 그러나, 첨부된 특허청구범위에 개시된 바와 같은 본 발명의 보다 넓은 사상 및 영역을 벗어나지 않고서도, 본 발명에 대한 다양한 수정 및 변경이 가능함을 명백히 알 것이다. 따라서, 명세서 및 도면들은 제한적인 의미라기보다는 예시적인 의미로 간주된다. 더욱이, 실시예 및 다른 예시적인 언어에 대한 앞에서의 이용은 동일한 실시예 또는 동일한 예를 지칭할 필요는 없으며, 상이하고 개별적인 실시예들 뿐만 아니라, 잠재적으로 동일한 실시예를 지칭할 수 있다.

Claims (46)

  1. 코드를 포함하는 기계 판독가능 매체로서,
    상기 코드는 기계에 의해 실행될 때, 상기 기계로 하여금,
    최적화될 프로그램 코드의 섹션을 식별하고,
    상기 프로그램 코드의 섹션 내의 조건부 커밋 포인트(conditional commit point)를 결정하고,
    상기 조건부 커밋 포인트를 결정하는 것에 응답하여, 상기 조건부 커밋 포인트에 조건부 커밋 인스트럭션을 삽입하고,
    상기 최적화될 프로그램 코드의 섹션을 식별하는 것에 응답하여, 상기 프로그램 코드의 섹션을 최적화하는 동작을 수행하도록 하는
    기계 판독가능 매체.
  2. 제 1 항에 있어서,
    상기 최적화될 프로그램 코드의 섹션을 식별하는 것은 상기 프로그램 코드의 동적 프로파일링을 기초로 하고,
    상기 조건부 커밋 포인트를 결정하는 것은, 상기 프로그램 코드의 섹션 내의 루프의 시작부에서 상기 조건부 커밋 포인트를 할당하고, 동적 프로파일링에 기초하여 실행 경로에서 상기 조건부 커밋 포인트를 할당하며, 하드웨어 자원들을 독점하는 것으로 알려진 실행 경로에서 상기 조건부 커밋 포인트를 할당하는 것으로 구성되는 그룹으로부터 선택된 할당 알고리즘에 기초하는
    기계 판독가능 매체.
  3. 제 1 항에 있어서,
    상기 조건부 커밋 인스트럭션은 조건부 브랜치 인스트럭션을 포함하고, 상기 조건부 브랜치 인스트럭션은, 실행될 때, 제 1 브랜치로서 상기 프로그램 코드의 섹션의 실행을 계속하거나, 또는 제 2 브랜치로서 조건부 커밋 코드 위치로 점프하는
    기계 판독가능 매체.
  4. 제 3 항에 있어서,
    상기 코드는, 상기 기계에 의해 실행될 때, 상기 기계로 하여금,
    상기 프로그램 코드의 섹션의 시작부에 제 1 영역 시작 인스트럭션을 삽입하고,
    상기 프로그램 코드의 섹션의 끝에 제 1 커밋 인스트럭션을 삽입하고,
    상기 조건부 커밋 코드 위치에 제 2 커밋 인스트럭션을 삽입하고,
    상기 제 2 커밋 인스트럭션 이후 상기 조건부 커밋 코드 위치에 제 2 영역 시작 인스트럭션을 삽입하는 동작을 또한 수행하도록 하는
    기계 판독가능 매체.
  5. 제 4 항에 있어서,
    상기 프로그램 코드의 섹션을 최적화하는 것은, 메모리 순서화(ordering)를 위반하는 로드를 상기 제 1 영역 시작 인스트럭션 및 제 2 영역 시작 인스트럭션 위로 호이스팅(hoisting)하지 않고 메모리 순서화를 위반하는 저장을 상기 제 1 커밋 인스트럭션 및 제 2 커밋 인스트럭션 아래로 싱킹(sinking)하지 않으면서 상기 코드의 섹션을 동적으로 최적화하는 것을 포함하는
    기계 판독가능 매체.
  6. 실행시간(runtime) 동안 코드를 동적으로 최적화하는 방법에 있어서,
    최적화될 프로그램 코드의 섹션을 식별하는 단계와,
    상기 최적화될 프로그램 코드의 섹션을 식별하는 것에 응답하여, 상기 프로그램 코드의 섹션의 적어도 일부분을 원자 영역(atomic region)으로서 구분하는 단계와,
    상기 원자 영역 내의 조건부 커밋 포인트를 결정하는 단계와,
    상기 조건부 커밋 포인트를 결정하는 것에 응답하여, 상기 조건부 커밋 포인트에 영역 검사 인스트럭션을 삽입하는 단계와,
    상기 최적화될 프로그램 코드의 섹션을 식별하는 것에 응답하여, 상기 프로그램 코드의 섹션을 최적화하는 단계를 포함하는
    방법.
  7. 제 6 항에 있어서,
    상기 프로그램 코드의 섹션의 적어도 일부분을 원자 영역으로서 구분하는 단계는, 상기 코드의 섹션의 적어도 일부분의 시작부에 시작 트랜잭션 인스트럭션을 삽입하고, 상기 코드의 섹션의 적어도 일부분의 끝에 종료 트랜잭션 인스트럭션을 삽입하는 단계를 포함하는
    방법.
  8. 제 6 항에 있어서,
    상기 프로그램 코드의 섹션을 최적화하는 단계는, PRLE(Partial Redundancy Load Elimination), PDSE(Partial Dead Store Elimination), 루프 최적화, 데이터 흐름 최적화, 코드 생성 최적화, 경계 검사 제거(bounds checking elimination), 브랜치 오프셋 최적화(branch offset optimization), 데드 코드 제거(dead code elimination) 및 점프 스레딩(jump threading)으로 구성되는 그룹으로부터 선택된 최적화 기법을 이용하여 상기 코드의 섹션을 최적화하는 단계를 포함하는
    방법.
  9. 제 6 항에 있어서,
    상기 영역 검사 인스트럭션은 조건부 브랜치 인스트럭션을 포함하고, 상기 조건부 브랜치 인스트럭션은, 실행될 때, 하드웨어에 질의하고, 상기 하드웨어의 질의에 대한 사전정의된 응답에 응답하여, 조기 영역 커밋 인스트럭션 및 영역 재시작 인스트럭션으로 분기하는
    방법.
  10. 제 6 항에 있어서,
    상기 영역 검사 인스트럭션을 삽입하는 단계는 상기 프로그램 코드의 섹션의 적어도 일부분 내의 루프의 시작부에서 수행되고,
    상기 영역 검사 인스트럭션은 상기 루프의 각각의 반복시에 실행되는
    방법.
  11. 코드를 포함하는 기계 판독가능 매체로서,
    상기 코드는 기계에 의해 실행될 때, 상기 기계로 하여금,
    동적으로 최적화된 프로그램 코드를 포함하는 트랜잭션을 실행하고,
    상기 트랜잭션의 실행을 지원하는 하드웨어 유닛이 상기 트랜잭션의 끝 이전에 영역 검사 포인트에서 상기 트랜잭션의 영역을 완료하는 데 이용가능한 충분한 자원들을 포함하는지를 판정하고,
    상기 트랜잭션의 실행을 지원하는 상기 하드웨어 유닛이 자원들에 대해 로우(low)인 것으로 결정하는 것에 응답하여 상기 영역 검사 포인트에서 상기 트랜잭션을 커밋하는 동작을 수행하도록 하는
    기계 판독가능 매체.
  12. 제 11 항에 있어서,
    상기 영역 검사 포인트에서 상기 트랜잭션을 커밋한 이후에 새로운 트랜잭션을 시작하는 것을 더 포함하는
    기계 판독가능 매체.
  13. 제 11 항에 있어서,
    상기 하드웨어 유닛은 저장 버퍼, 로드 버퍼, 캐시 메모리 및 레지스터 파일로 구성되는 그룹으로부터 선택된 유닛을 포함하는
    기계 판독가능 매체.
  14. 제 11 항에 있어서,
    상기 하드웨어 유닛은 캐시 메모리를 포함하고,
    상기 트랜잭션의 실행을 지원하는 하드웨어 유닛이 상기 트랜잭션의 영역을 완료하는 데 이용가능한 충분한 자원들을 포함하는지를 판정하는 것은, 상기 트랜잭션의 영역의 완료시에 터치될 예상되는 캐시 라인들의 수를 결정하고, 상기 캐시 메모리에서 이용가능한 엔트리들의 수를 결정하며, 상기 예상되는 캐시 라인들의 수를 이용가능한 캐시 라인들의 수와 비교하고, 상기 예상되는 캐시 라인들의 수를 상기 이용가능한 캐시 라인들의 수와 비교하는 것에 기초하여 상기 트랜잭션의 실행을 지원하는 상기 캐시 메모리가 상기 트랜잭션의 영역을 완료하는 데 이용가능한 충분한 자원들을 포함하는 것으로 판정하는 것을 포함하는
    기계 판독가능 매체.
  15. 제 14 항에 있어서,
    상기 영역의 완료시에 터치될 예상되는 캐시 라인들의 수를 결정하는 것은 상기 트랜잭션에 삽입된 컴파일러 힌트에 기초하고,
    상기 컴파일러 힌트는 상기 트랜잭션의 영역의 이전 실행들의 동적인 프로파일링에 기초하는
    기계 판독가능 매체.
  16. 코드를 포함하는 기계 판독가능 매체로서,
    상기 코드는 기계에 의해 실행될 때, 상기 기계로 하여금,
    최적화될 프로그램 코드의 섹션을 식별하고,
    상기 프로그램 코드의 섹션 내의 추론적 체크포인트(speculative checkpoint)를 결정하고,
    상기 추론적 체크포인트를 결정하는 것에 응답하여, 상기 추론적 체크포인트에 추론적 체크포인트 코드를 삽입하고,
    상기 최적화될 프로그램 코드의 섹션을 식별하는 것에 응답하여, 상기 프로그램 코드의 섹션을 최적화하는 동작을 수행하도록 하는
    기계 판독가능 매체.
  17. 제 16 항에 있어서,
    상기 최적화될 프로그램 코드의 섹션을 식별하는 것은 상기 프로그램 코드의 동적 프로파일링을 기초로 하고,
    상기 추론적 체크포인트를 결정하는 것은, 상기 프로그램 코드의 섹션 내의 루프의 루프백 에지(loop-back edge)에서, 상기 프로그램 코드의 섹션 내의 루프의 시작부에 상기 추론적 체크포인트를 할당하고, 동적 프로파일링에 기초하여 실행 경로에 상기 추론적 체크포인트를 할당하며, 하드웨어 자원들을 독점하는 것으로 알려진 실행 경로에 상기 추론적 체크포인트를 할당하고, 추론적 하드웨어 자원들의 소모(running out)를 피하기 위해 실행 경로에 상기 추론적 체크포인트를 할당하는 것으로 구성되는 그룹으로부터 선택된 할당 알고리즘에 기초하는
    기계 판독가능 매체.
  18. 제 16 항에 있어서,
    상기 코드는, 상기 기계에 의해 실행될 때, 상기 기계로 하여금 상기 프로그램 코드의 섹션에 시작 원자 영역 인스트럭션을 삽입하고, 상기 프로그램 코드의 섹션에 종료 원자 영역 인스트럭션을 삽입하는 동작을 또한 수행하도록 하는
    기계 판독가능 매체.
  19. 제 16 항에 있어서,
    상기 추론적 체크포인트 코드는 추론적 체크포인트 동작을 포함하고, 상기 추론적 체크포인트 동작은, 실행될 때, 상기 기계로 하여금 체크포인트 저장 구조들에서의 추론적 레지스터 파일 및 저장 버퍼를 체크포인팅하도록 하고,
    상기 코드는, 상기 기계에 의해 실행될 때, 상기 기계로 하여금 상기 코드의 섹션의 실행 동안 상기 저장 버퍼가 자원들을 소모한 것에 응답하여, 상기 추론적 레지스터 파일의 체크포인트에 대한 롤백(roll-back)을 위해 수리 코드(fix-up code)를 삽입하는 동작을 또한 수행하도록 하는
    기계 판독가능 매체.
  20. 제 16 항에 있어서,
    상기 프로그램 코드의 섹션을 최적화하는 것은, PRLE, PDSE, 루프 최적화, 데이터 흐름 최적화, 코드 생성 최적화, 경계 검사 제거, 브랜치 오프셋 최적화, 데드 코드 제거 및 점프 스레딩으로 구성되는 그룹으로부터 선택된 최적화 기법을 이용하여 코드의 섹션을 최적화하는 것을 포함하는
    기계 판독가능 매체.
  21. 최적화될 프로그램 코드의 섹션을 식별하는 단계와,
    상기 최적화될 프로그램 코드의 섹션을 식별하는 것에 응답하여, 상기 프로그램 코드의 섹션의 적어도 일부분을 원자 영역으로서 구분하는 단계와,
    상기 원자 영역 내의 추론적 체크포인트를 결정하는 단계와,
    상기 추론적 체크포인트를 결정하는 것에 응답하여, 상기 추론적 체크포인트에 추론적 체크포인트 코드를 삽입하는 단계와,
    상기 최적화될 프로그램 코드의 섹션을 식별하는 것에 응답하여, 상기 프로그램 코드의 섹션을 최적화하는 단계를 포함하는
    방법.
  22. 제 21 항에 있어서,
    상기 프로그램 코드의 섹션의 적어도 일부분을 원자 영역으로서 구분하는 단계는, 상기 코드의 섹션의 적어도 일부분의 시작부에 시작 트랜잭션 인스트럭션을 삽입하고, 상기 코드의 섹션의 적어도 일부분의 끝에 종료 트랜잭션 인스트럭션을 삽입하는 단계를 포함하는
    방법.
  23. 제 21 항에 있어서,
    상기 추론적 체크포인트 코드는 추론적 체크포인트 동작을 포함하고, 상기 추론적 체크포인트 동작은, 실행될 때, 기계로 하여금 추론적 체크포인트 레지스터 파일에서의 추론적 레지스터 파일을 체크포인팅하고 추론적 캐시에서의 저장 버퍼를 체크포인팅하도록 하며,
    상기 코드는, 상기 기계에 의해 실행될 때, 상기 기계로 하여금 상기 코드의 섹션의 적어도 일부분의 실행 동안 상기 추론적 캐시 또는 상기 저장 버퍼가 자원들을 소모한 것에 응답하여, 상기 추론적 체크포인트 레지스터 파일에 유지된 상기 추론적 레지스터 파일의 체크포인트에 대한 롤백을 위해 수리 코드를 삽입하는 동작을 또한 수행하도록 하는
    방법.
  24. 제 23 항에 있어서,
    상기 저장 버퍼가 상기 코드의 섹션의 적어도 일부분의 실행 동안 자원들을 소모한 것은 상기 저장 버퍼가 상기 코드의 섹션의 적어도 일부분의 실행 동안 어떠한 이용가능한 엔트리들도 포함하지 않는 것을 포함하고,
    상기 추론적 캐시가 상기 자원들을 소모한 것은, 상기 기계가 상기 추론적 체크포인트 동작을 실행시에 상기 추론적 캐시가 상기 저장 버퍼로부터의 엔트리들을 유지하기에 충분한 이용가능한 엔트리들을 포함하지 않는 것을 포함하는
    방법.
  25. 제 21 항에 있어서,
    상기 프로그램 코드의 섹션을 최적화하는 단계는, PRLE, PDSE, 루프 최적화, 데이터 흐름 최적화, 코드 생성 최적화, 경계 검사 제거, 브랜치 오프셋 최적화, 데드 코드 제거 및 점프 스레딩으로 구성되는 그룹으로부터 선택된 최적화 기법을 이용하여 코드의 섹션을 최적화하는 단계를 포함하는
    방법.
  26. 코드를 포함하는 기계 판독가능 매체로서,
    상기 코드는 기계에 의해 실행될 때, 상기 기계로 하여금,
    동적으로 최적화된 프로그램 코드를 포함하는 트랜잭션을 실행하고,
    상기 트랜잭션 내의 체크포인트에서 추론적 레지스터 파일을 체크포인트 레지스터 파일로 체크포인팅하고,
    상기 트랜잭션을 실행하는 것을 지원하는 하드웨어 유닛이 자원들에 대해 로우인 것으로 결정하고,
    상기 하드웨어 유닛이 자원들에 대해 로우인 것으로 결정하는 것에 응답하여, 상기 체크포인트 레지스터 파일을 상기 추론적 레지스터 파일로 복원하고 저장 버퍼를 플러싱(flushing)하는 동작을 수행하도록 하는
    기계 판독가능 매체.
  27. 제 26 항에 있어서,
    상기 트랜잭션 내의 체크포인트에서 추론적 레지스터 파일을 체크포인트 레지스터 파일로 체크포인팅하는 것은 추론적 체크포인트 인스트럭션을 실행하는 것에 응답한 것이고,
    상기 코드는, 상기 기계에 의해 실행될 때, 상기 기계로 하여금 추론적 체크포인트 인스트럭션을 실행하는 것에 또한 응답하여 상기 트랜잭션 내의 상기 체크포인트에서 저장 버퍼를 추론적 캐시로 체크포인팅하는 동작을 또한 수행하도록 하는
    기계 판독가능 매체.
  28. 제 27 항에 있어서,
    상기 하드웨어 유닛은 상기 저장 버퍼를 포함하고,
    상기 트랜잭션을 실행하는 것을 지원하는 하드웨어 유닛이 자원들에 대해 로우인 것으로 결정하는 것은, 상기 저장 버퍼가 상기 트랜잭션으로부터의 저장과 조우시에 자원들에 대해 로우이고, 상기 저장 버퍼가 이용가능한 저장 버퍼 엔트리를 포함하지 않는 것으로 결정하는 것을 포함하는
    기계 판독가능 매체.
  29. 제 28 항에 있어서,
    상기 하드웨어 유닛은 추론적 캐시를 또한 포함하고,
    상기 트랜잭션을 실행하는 것을 지원하는 하드웨어 유닛이 자원들에 대해 로우인 것으로 결정하는 것은, 추론적 체크포인트 인스트럭션을 실행하는 것에 또한 응답하여 상기 트랜잭션 내의 체크포인트에서 상기 저장 버퍼를 상기 추론적 캐시로 체크포인팅시에, 상기 저장 버퍼로부터의 엔트리들을 유지하기에 충분한 이용가능한 엔트리들을 포함하지 않는 것에 응답하여 상기 추론적 캐시가 자원들에 대해 로우인 것으로 결정하는 것을 포함하는
    기계 판독가능 매체.
  30. 제 26 항에 있어서,
    상기 코드는, 상기 기계에 의해 실행될 때, 상기 기계로 하여금 상기 하드웨어 유닛이 자원들에 대해 로우인 것으로 결정하는 것에 응답하여 상기 체크포인트 레지스터 파일을 상기 추론적 레지스터 파일로 복원하고 상기 저장 버퍼를 플러싱하는 것에 응답하여, 상기 트랜잭션의 일부분의 영역 커밋을 수행하는 동작을 또한 수행하도록 하는
    기계 판독가능 매체.
  31. 제 26 항에 있어서,
    상기 하드웨어 유닛이 자원들에 대해 로우인 것으로 결정하는 것에 응답하여 상기 체크포인트 레지스터 파일을 상기 추론적 레지스터 파일로 복원하고 상기 저장 버퍼를 플러싱하는 것은, 상기 하드웨어 유닛이 자원들에 대해 로우인 것으로 결정하고, 상기 복원이 상기 하드웨어 유닛과 관련된 요인들에 기초하여 가장 최근의 커밋된 포인트 대신에 상기 체크포인트 레지스터 파일과 관련된 체크포인트에 대한 것임을 결정하기 위해 코드를 실행하며, 상기 복원이 상기 체크포인트 레지스터 파일과 관련된 체크포인트에 대한 것이라고 결정하는 것에 응답하여 상기 체크포인트 레지스터 파일을 상기 추론적 레지스터 파일로 복원하고 상기 저장 버퍼를 플러싱하는 것을 포함하는
    기계 판독가능 매체.
  32. 디코딩된 추론적 체크포인트 인스트럭션을 획득하기 위해 추론적 체크포인트 인스트럭션을 디코딩하도록 구성된 디코드 로직과,
    상기 디코딩된 추론적 체크포인트 인스트럭션을 실행하도록 구성된 실행 로직과,
    최적화된 코드를 포함하는 소프트웨어 스레드의 원자 영역의 시작 이전으로부터의 소프트웨어 스레드와 관련된 비추론적 값들을 유지하도록 구성된 제 1 메모리와,
    상기 원자 영역의 실행 동안 및 상기 디코딩된 추론적 체크포인트 인스트럭션이 상기 실행 로직에 의해 실행된 이후 상기 소프트웨어 스레드와 관련된 추론적 값들을 유지하도록 구성된 제 2 메모리와,
    상기 실행 로직이 상기 디코딩된 추론적 체크포인트 인스트럭션을 실행하는 것에 응답하여 상기 제 2 메모리로부터의 추론적 체크포인트 값들을 유지하도록 구성된 제 3 메모리를 포함하는
    장치.
  33. 제 32 항에 있어서,
    상기 제 1 메모리는 비추론적 레지스터 파일을 포함하고, 상기 제 2 메모리는 추론적 레지스터 파일을 포함하며, 상기 제 3 메모리는 추론적 체크포인트 레지스터 파일을 포함하는
    장치.
  34. 제 33 항에 있어서,
    상기 추론적 레지스터 파일이 상기 원자 영역의 실행 동안 및 상기 디코딩된 추론적 체크포인트 인스트럭션이 상기 실행 로직에 의해 실행된 이후의 소프트웨어 스레드와 관련된 추론적 값들을 유지하도록 구성되는 것은, 상기 추론적 레지스터 파일이 상기 원자 영역의 실행 동안 및 상기 디코딩된 추론적 체크포인트 인스트럭션이 상기 실행 로직에 의해 실행된 이후 상기 소프트웨어 스레드와 관련된 추론적 아키텍쳐 상태 값들을 유지하도록 구성되는 것을 포함하고,
    상기 추론적 체크포인트 레지스터 파일이, 상기 실행 로직이 상기 디코딩된 추론적 체크포인트 인스트럭션을 실행하는 것에 응답하여 상기 추론적 레지스터 파일로부터의 추론적 체크포인트 값들을 유지하도록 구성되는 것은, 상기 추론적 체크포인트 레지스터 파일이, 상기 실행 로직이 상기 추론적 레지스터 파일로부터 상기 추론적 체크포인트 레지스터 파일로의 상기 추론적 체크포인트 인스트럭션을 실행시에 상기 소프트웨어 스레드와 관련된 상기 아키텍쳐 상태 값들을 추론적 체크포인트 아키텍쳐 상태 값들로서 로딩하도록 구성되는 것을 포함하는
    장치.
  35. 제 32 항에 있어서,
    상기 추론적 체크포인트 인스트럭션과 관련된 체크포인트에 대한 불충분한 하드웨어 자원들에 기초한 롤백에 응답하여, 추론적 체크포인트 레지스터 파일에 유지될 추론적 체크포인트 아키텍쳐 상태 값들이 상기 추론적 레지스터 파일로 리로딩되고, 상기 원자 영역의 커밋에 응답하여, 상기 추론적 레지스터 파일에 유지될 상기 추론적 아키텍쳐 상태 값들이 비추론적 레지스터 파일로 로딩되며, 상기 원자 영역의 시작에 대한 롤백에 응답하여, 상기 비추론적 레지스터 파일에 유지될 비추론적 값들은 상기 추론적 레지스터 파일로 로딩되는
    장치.
  36. 제 32 항에 있어서,
    상기 제 1 메모리는 캐시 메모리를 포함하고, 상기 제 2 메모리는 버퍼를 포함하며, 상기 제 3 메모리는 추론적 캐시 메모리를 포함하는
    장치.
  37. 제 32 항에 있어서,
    버퍼가 상기 원자 영역의 실행 동안 및 상기 디코딩된 추론적 체크포인트 인스트럭션이 상기 실행 로직에 의해 실행된 이후 상기 소프트웨어 스레드와 관련된 추론적 값들을 유지하도록 구성되는 것은, 상기 버퍼가 상기 원자 영역의 실행 동안 및 상기 디코딩된 추론적 체크포인트 인스트럭션이 상기 실행 로직에 의해 실행된 이후 상기 소프트웨어 스레드와 관련된 추론적 메모리 값들을 유지하도록 구성되는 것을 포함하고,
    추론적 캐시 메모리가 상기 실행 로직이 상기 디코딩된 추론적 체크포인트 인스트럭션을 실행하는 것에 응답하여 상기 버퍼로부터의 추론적 체크포인트 값들을 유지하도록 구성되는 것은, 상기 추론적 캐시 메모리가 상기 실행 로직이 상기 버퍼로부터 상기 추론적 캐시 메모리로의 상기 추론적 체크포인트 인스트럭션을 실행시에 상기 소프트웨어 스레드와 관련된 추론적 메모리 값들을 추론적 체크포인트 메모리 값들로서 로딩하도록 구성되는 것을 포함하는
    장치.
  38. 제 32 항에 있어서,
    상기 원자 영역의 커밋에 응답하여, 버퍼 및 추론적 캐시는 추론적 메모리 값들 및 추론적 체크포인트 메모리 값들을 캐시 메모리로 로딩하도록 구성되고,
    상기 추론적 체크포인트 인스트럭션과 관련된 체크포인트에 대한 롤백에 응답하여, 상기 버퍼는 플러싱되도록 구성되며,
    상기 원자 영역 이전의 포인트에 대한 롤백에 응답하여, 상기 버퍼 및 상기 추론적 캐시는 플러싱되도록 구성되는
    장치.
  39. 제 32 항에 있어서,
    상기 디코드 로직, 실행 로직, 제 1 메모리, 제 2 메모리 및 제 3 메모리는 멀티프로세싱 요소 마이크로프로세서 내에 포함되고, 상기 멀티프로세싱 요소 마이크로프로세서는 SDRAM(Synchronous Dynamic Random Access Memory), ROM 및 플래시 메모리로 구성되는 그룹으로부터 선택된 시스템 메모리를 포함하는 컴퓨터 시스템 내에 연결되도록 구성되는
    장치.
  40. 디코딩된 추론적 체크포인트 인스트럭션을 획득하기 위해 추론적 체크포인트 인스트럭션을 디코딩하도록 구성된 디코드 로직과,
    상기 디코딩된 추론적 체크포인트 인스트럭션을 실행하도록 구성된 실행 로직과,
    원자 영역의 실행 동안 추론적 업데이트들을 유지하도록 구성된 저장 버퍼와,
    상기 실행 로직이 상기 디코딩된 추론적 체크포인트 인스트럭션을 실행하는 것에 응답하여 상기 저장 버퍼로부터의 상기 추론적 업데이트들을 체크포인팅하도록 구성된 추론적 캐시와,
    상기 원자 영역의 시작 이전으로부터의 비추론적 값들을 유지하도록 구성된 비추론적 캐시를 포함하되,
    상기 추론적 캐시로부터의 상기 추론적 업데이트들은 상기 원자 영역의 커밋에 응답하여 상기 비추론적 캐시로 로딩되는
    장치.
  41. 제 40 항에 있어서,
    상기 추론적 캐시 및 상기 저장 버퍼는 상기 원자 영역의 커밋에 응답하여 상기 비추론적 캐시를 추론적 업데이트들로 업데이트하도록 또한 구성되는
    장치.
  42. 제 40 항에 있어서,
    상기 저장 버퍼는 상기 추론적 체크포인트 인스트럭션과 관련된 체크포인트에 대한 롤백 또는 상기 원자 영역의 시작에 대한 롤백에 응답하여 플러싱되도록 또한 구성되는
    장치.
  43. 제 42 항에 있어서,
    상기 추론적 캐시는 상기 원자 영역의 시작에 대한 롤백에 응답하여 플러싱되도록 또한 구성되는 장치.
  44. 제 43 항에 있어서,
    상기 추론적 캐시는 상기 추론적 캐시가 상기 저장 버퍼로부터의 상기 추론적 업데이트들을 유지하기에 충분한 엔트리들을 포함하지 않는 것에 응답하여, 상기 저장 버퍼로부터의 상기 추론적 업데이트들의 상기 체크포인트를 완료하는 데 이용가능한 추론적 캐시 엔트리들이 충분하지 않음을 나타내도록 또한 구성되고,
    상기 저장 버퍼는 상기 원자 영역으로부터의 저장과 조우시에 어떠한 저장 버퍼 엔트리도 이용가능하지 않다는 것에 응답하여 어떠한 저장 버퍼 엔트리도 이용가능하지 않음을 나타내도록 또한 구성되며,
    상기 원자 영역 내의 체크포인트에 대한 롤백은, 상기 추론적 캐시가 상기 저장 버퍼로부터의 상기 추론적 업데이트들의 체크포인트를 완료하는 데 이용가능한 추론적 캐시 엔트리들이 충분하지 않음을 나타내거나 또는 상기 저장 버퍼가 상기 원자 영역으로부터의 저장과 조우시에 어떠한 저장 버퍼 엔트리도 이용가능하지 않다는 것에 응답하여 어떠한 저장 버퍼 엔트리도 이용가능하지 않음을 나타내는 것에 응답하여 개시되는
    장치.
  45. 제 42 항에 있어서,
    상기 비추론적 캐시는 상기 원자 영역으로부터의 추론적 판독에 응답하여 엔트리를 로드 버퍼에 제공하도록 또한 구성되는
    장치.
  46. 제 42 항에 있어서,
    상기 비추론적 캐시는 상위 레벨 메모리로부터의 라인들을 캐싱하도록 구성되고, 상기 상위 레벨 메모리는 SDRAM, ROM 및 플래시 메모리로 구성되는 그룹으로부터 선택되는
    장치.
KR1020137007502A 2010-09-25 2011-09-26 하드웨어 제한에 기초한 조절가능한 트랜잭션 크기를 이용하여 코드를 동적으로 최적화하는 장치, 방법 및 시스템 KR101524446B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/890,638 2010-09-25
US12/890,638 US20120079245A1 (en) 2010-09-25 2010-09-25 Dynamic optimization for conditional commit
PCT/US2011/053337 WO2012040742A2 (en) 2010-09-25 2011-09-26 Apparatus, method, and system for dynamically optimizing code utilizing adjustable transaction sizes based on hardware limitations

Publications (2)

Publication Number Publication Date
KR20130063004A true KR20130063004A (ko) 2013-06-13
KR101524446B1 KR101524446B1 (ko) 2015-06-01

Family

ID=45871871

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020137007502A KR101524446B1 (ko) 2010-09-25 2011-09-26 하드웨어 제한에 기초한 조절가능한 트랜잭션 크기를 이용하여 코드를 동적으로 최적화하는 장치, 방법 및 시스템

Country Status (8)

Country Link
US (1) US20120079245A1 (ko)
EP (1) EP2619655B1 (ko)
JP (1) JP5592015B2 (ko)
KR (1) KR101524446B1 (ko)
CN (1) CN103140828B (ko)
AU (1) AU2011305091B2 (ko)
TW (1) TWI571799B (ko)
WO (1) WO2012040742A2 (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101533042B1 (ko) * 2015-02-11 2015-07-09 성균관대학교산학협력단 데이터 일관성을 보장하기 위한 컴퓨팅 장치 및 방법

Families Citing this family (63)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2480285A (en) * 2010-05-11 2011-11-16 Advanced Risc Mach Ltd Conditional compare instruction which sets a condition code when it is not executed
US8549504B2 (en) * 2010-09-25 2013-10-01 Intel Corporation Apparatus, method, and system for providing a decision mechanism for conditional commits in an atomic region
US20130159673A1 (en) * 2011-12-15 2013-06-20 Advanced Micro Devices, Inc. Providing capacity guarantees for hardware transactional memory systems using fences
US8893094B2 (en) 2011-12-30 2014-11-18 Intel Corporation Hardware compilation and/or translation with fault detection and roll back functionality
US9075727B2 (en) 2012-06-14 2015-07-07 International Business Machines Corporation Reducing penalties for cache accessing operations
US9015423B2 (en) 2012-06-14 2015-04-21 International Business Machines Corporation Reducing store operation busy times
US9244846B2 (en) * 2012-07-06 2016-01-26 International Business Machines Corporation Ensuring causality of transactional storage accesses interacting with non-transactional storage accesses
US9262170B2 (en) * 2012-07-26 2016-02-16 International Business Machines Corporation Out-of-order checkpoint reclamation in a checkpoint processing and recovery core microarchitecture
US9612834B2 (en) * 2012-09-27 2017-04-04 Texas Instruments Deutschland Gmbh Processor with variable instruction atomicity
WO2014047828A1 (en) * 2012-09-27 2014-04-03 Intel Corporation Method and apparatus to schedule store instructions across atomic regions in binary translation
US9384002B2 (en) * 2012-11-16 2016-07-05 International Business Machines Corporation Speculative finish of instruction execution in a processor core
US9189433B2 (en) 2012-12-18 2015-11-17 International Business Machines Corporation Tracking a relative arrival order of events being stored in multiple queues using a counter
US9047092B2 (en) * 2012-12-21 2015-06-02 Arm Limited Resource management within a load store unit
US9135177B2 (en) 2013-02-26 2015-09-15 Apple Inc. Scheme to escalate requests with address conflicts
US9448800B2 (en) 2013-03-14 2016-09-20 Samsung Electronics Co., Ltd. Reorder-buffer-based static checkpointing for rename table rebuilding
US9304863B2 (en) 2013-03-15 2016-04-05 International Business Machines Corporation Transactions for checkpointing and reverse execution
US9547594B2 (en) * 2013-03-15 2017-01-17 Intel Corporation Instructions to mark beginning and end of non transactional code region requiring write back to persistent storage
US9116719B2 (en) * 2013-06-27 2015-08-25 Intel Corporation Partial commits in dynamic binary translation based systems
WO2015030819A1 (en) 2013-08-30 2015-03-05 Hewlett-Packard Development Company, L.P. Completion packet return
CA2830605A1 (en) 2013-10-22 2015-04-22 Ibm Canada Limited - Ibm Canada Limitee Code versioning for enabling transactional memory region promotion
US9459849B2 (en) 2014-01-17 2016-10-04 International Business Machines Corporation Adaptive cloud aware just-in-time (JIT) compilation
US9317379B2 (en) * 2014-01-24 2016-04-19 International Business Machines Corporation Using transactional execution for reliability and recovery of transient failures
US20150242216A1 (en) * 2014-02-27 2015-08-27 International Business Machines Corporation Committing hardware transactions that are about to run out of resource
US9558032B2 (en) 2014-03-14 2017-01-31 International Business Machines Corporation Conditional instruction end operation
US9454370B2 (en) * 2014-03-14 2016-09-27 International Business Machines Corporation Conditional transaction end instruction
US10120681B2 (en) 2014-03-14 2018-11-06 International Business Machines Corporation Compare and delay instructions
US20150278123A1 (en) * 2014-03-28 2015-10-01 Alex Nayshtut Low-overhead detection of unauthorized memory modification using transactional memory
US9569212B2 (en) * 2014-03-28 2017-02-14 Intel Corporation Instruction and logic for a memory ordering buffer
US9785442B2 (en) 2014-12-24 2017-10-10 Intel Corporation Systems, apparatuses, and methods for data speculation execution
US10387156B2 (en) * 2014-12-24 2019-08-20 Intel Corporation Systems, apparatuses, and methods for data speculation execution
US10303525B2 (en) 2014-12-24 2019-05-28 Intel Corporation Systems, apparatuses, and methods for data speculation execution
US10061583B2 (en) 2014-12-24 2018-08-28 Intel Corporation Systems, apparatuses, and methods for data speculation execution
US10942744B2 (en) 2014-12-24 2021-03-09 Intel Corporation Systems, apparatuses, and methods for data speculation execution
US10061589B2 (en) 2014-12-24 2018-08-28 Intel Corporation Systems, apparatuses, and methods for data speculation execution
US10387158B2 (en) * 2014-12-24 2019-08-20 Intel Corporation Systems, apparatuses, and methods for data speculation execution
US10540524B2 (en) * 2014-12-31 2020-01-21 Mcafee, Llc Memory access protection using processor transactional memory support
US9792124B2 (en) 2015-02-13 2017-10-17 International Business Machines Corporation Speculative branch handling for transaction abort
US9858074B2 (en) * 2015-06-26 2018-01-02 International Business Machines Corporation Non-default instruction handling within transaction
US9703537B2 (en) * 2015-11-02 2017-07-11 International Business Machines Corporation Method for defining alias sets
US10459727B2 (en) * 2015-12-31 2019-10-29 Microsoft Technology Licensing, Llc Loop code processor optimizations
US9542290B1 (en) 2016-01-29 2017-01-10 International Business Machines Corporation Replicating test case data into a cache with non-naturally aligned data boundaries
US10169180B2 (en) 2016-05-11 2019-01-01 International Business Machines Corporation Replicating test code and test data into a cache with non-naturally aligned data boundaries
CN109564525B (zh) * 2016-06-28 2023-05-02 亚马逊技术有限公司 按需网络代码执行环境中的异步任务管理
US10055320B2 (en) 2016-07-12 2018-08-21 International Business Machines Corporation Replicating test case data into a cache and cache inhibited memory
GB2555628B (en) * 2016-11-04 2019-02-20 Advanced Risc Mach Ltd Main processor error detection using checker processors
US10223225B2 (en) 2016-11-07 2019-03-05 International Business Machines Corporation Testing speculative instruction execution with test cases placed in memory segments with non-naturally aligned data boundaries
US10261878B2 (en) 2017-03-14 2019-04-16 International Business Machines Corporation Stress testing a processor memory with a link stack
GB2563588B (en) * 2017-06-16 2019-06-26 Imagination Tech Ltd Scheduling tasks
GB2563587B (en) 2017-06-16 2021-01-06 Imagination Tech Ltd Scheduling tasks
GB2560059B (en) * 2017-06-16 2019-03-06 Imagination Tech Ltd Scheduling tasks
GB2570110B (en) 2018-01-10 2020-04-15 Advanced Risc Mach Ltd Speculative cache storage region
US10853115B2 (en) 2018-06-25 2020-12-01 Amazon Technologies, Inc. Execution of auxiliary functions in an on-demand network code execution system
US11099870B1 (en) 2018-07-25 2021-08-24 Amazon Technologies, Inc. Reducing execution times in an on-demand network code execution system using saved machine states
US11119673B2 (en) 2018-08-12 2021-09-14 International Business Machines Corporation Optimizing synchronous I/O for zHyperLink
US11943093B1 (en) 2018-11-20 2024-03-26 Amazon Technologies, Inc. Network connection recovery after virtual machine transition in an on-demand network code execution system
US11861386B1 (en) 2019-03-22 2024-01-02 Amazon Technologies, Inc. Application gateways in an on-demand network code execution system
US11714760B2 (en) * 2019-05-24 2023-08-01 Texas Instmments Incorporated Methods and apparatus to reduce bank pressure using aggressive write merging
US11119809B1 (en) 2019-06-20 2021-09-14 Amazon Technologies, Inc. Virtualization-based transaction handling in an on-demand network code execution system
US11714682B1 (en) 2020-03-03 2023-08-01 Amazon Technologies, Inc. Reclaiming computing resources in an on-demand code execution system
CN112231246A (zh) * 2020-10-31 2021-01-15 王志平 一种处理器缓存结构的实现方法
US11593270B1 (en) 2020-11-25 2023-02-28 Amazon Technologies, Inc. Fast distributed caching using erasure coded object parts
US11789829B2 (en) * 2021-04-27 2023-10-17 Capital One Services, Llc Interprocess communication for asynchronous tasks
US20230289075A1 (en) * 2022-03-14 2023-09-14 Western Digital Technologies, Inc. Data Storage Device and Method for Host-Initiated Transactional Handling for Large Data Set Atomicity Across Multiple Memory Commands

Family Cites Families (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6658656B1 (en) * 2000-10-31 2003-12-02 Hewlett-Packard Development Company, L.P. Method and apparatus for creating alternative versions of code segments and dynamically substituting execution of the alternative code versions
US7131119B2 (en) * 2001-05-30 2006-10-31 International Business Machines Corporation Code optimization
US6862664B2 (en) * 2003-02-13 2005-03-01 Sun Microsystems, Inc. Method and apparatus for avoiding locks by speculatively executing critical sections
US20050071438A1 (en) * 2003-09-30 2005-03-31 Shih-Wei Liao Methods and apparatuses for compiler-creating helper threads for multi-threading
WO2009076324A2 (en) * 2007-12-10 2009-06-18 Strandera Corporation Strand-based computing hardware and dynamically optimizing strandware for a high performance microprocessor system
US7496735B2 (en) * 2004-11-22 2009-02-24 Strandera Corporation Method and apparatus for incremental commitment to architectural state in a microprocessor
US7984248B2 (en) * 2004-12-29 2011-07-19 Intel Corporation Transaction based shared data operations in a multiprocessor environment
US7882339B2 (en) * 2005-06-23 2011-02-01 Intel Corporation Primitives to enhance thread-level speculation
JP2009508187A (ja) * 2005-08-01 2009-02-26 サン・マイクロシステムズ・インコーポレーテッド クリティカルセクションをトランザクション的に実行することによるロックの回避
US20080005332A1 (en) * 2006-06-08 2008-01-03 Georgia Tech Research Corporation Method for Opportunistic Computing
US7802136B2 (en) * 2006-12-28 2010-09-21 Intel Corporation Compiler technique for efficient register checkpointing to support transaction roll-back
US8060728B2 (en) * 2007-05-14 2011-11-15 Apple Inc. Generating stop indicators during vector processing
US7966459B2 (en) * 2007-12-31 2011-06-21 Oracle America, Inc. System and method for supporting phased transactional memory modes
US20100199269A1 (en) * 2008-02-05 2010-08-05 Panasonic Corporation Program optimization device and program optimization method
CN101266549B (zh) * 2008-03-19 2010-10-20 华为技术有限公司 插入代码的方法、装置
US9372718B2 (en) * 2008-07-28 2016-06-21 Advanced Micro Devices, Inc. Virtualizable advanced synchronization facility
US8166481B2 (en) * 2008-10-20 2012-04-24 Microsoft Corporation Transaction processing in transactional memory
JP5547208B2 (ja) * 2008-11-24 2014-07-09 インテル コーポレイション シーケンシャル・プログラムを複数スレッドに分解し、スレッドを実行し、シーケンシャルな実行を再構成するシステム、方法および装置
US20110208921A1 (en) * 2010-02-19 2011-08-25 Pohlack Martin T Inverted default semantics for in-speculative-region memory accesses
US8688963B2 (en) * 2010-04-22 2014-04-01 Oracle International Corporation Checkpoint allocation in a speculative processor
US9880848B2 (en) * 2010-06-11 2018-01-30 Advanced Micro Devices, Inc. Processor support for hardware transactional memory
US8560816B2 (en) * 2010-06-30 2013-10-15 Oracle International Corporation System and method for performing incremental register checkpointing in transactional memory

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101533042B1 (ko) * 2015-02-11 2015-07-09 성균관대학교산학협력단 데이터 일관성을 보장하기 위한 컴퓨팅 장치 및 방법

Also Published As

Publication number Publication date
AU2011305091A1 (en) 2013-03-14
EP2619655A4 (en) 2015-03-04
JP5592015B2 (ja) 2014-09-17
WO2012040742A3 (en) 2012-06-14
CN103140828A (zh) 2013-06-05
TWI571799B (zh) 2017-02-21
CN103140828B (zh) 2015-09-09
EP2619655A2 (en) 2013-07-31
EP2619655B1 (en) 2017-11-08
WO2012040742A2 (en) 2012-03-29
JP2013537334A (ja) 2013-09-30
TW201218080A (en) 2012-05-01
US20120079245A1 (en) 2012-03-29
AU2011305091B2 (en) 2014-09-25
KR101524446B1 (ko) 2015-06-01

Similar Documents

Publication Publication Date Title
US9817644B2 (en) Apparatus, method, and system for providing a decision mechanism for conditional commits in an atomic region
KR101524446B1 (ko) 하드웨어 제한에 기초한 조절가능한 트랜잭션 크기를 이용하여 코드를 동적으로 최적화하는 장치, 방법 및 시스템
JP6095670B2 (ja) コンピュータ・システム内のオペランド活性情報の維持
US20170235579A1 (en) Processor for speculative execution event counter checkpointing and restoring
JP5547208B2 (ja) シーケンシャル・プログラムを複数スレッドに分解し、スレッドを実行し、シーケンシャルな実行を再構成するシステム、方法および装置
JP2013541094A5 (ko)
US20100274972A1 (en) Systems, methods, and apparatuses for parallel computing
US20140047219A1 (en) Managing A Register Cache Based on an Architected Computer Instruction Set having Operand Last-User Information
US10936314B2 (en) Suppressing branch prediction on a repeated execution of an aborted transaction
US11347513B2 (en) Suppressing branch prediction updates until forward progress is made in execution of a previously aborted transaction

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20180427

Year of fee payment: 4

LAPS Lapse due to unpaid annual fee