KR20110050725A - 순차적 프로그램을 다수의 스레드로 분해하고 이 스레드를 실행하며 순차적 실행을 재구성하는 장치, 방법 및 머신-판독가능 저장 매체 - Google Patents

순차적 프로그램을 다수의 스레드로 분해하고 이 스레드를 실행하며 순차적 실행을 재구성하는 장치, 방법 및 머신-판독가능 저장 매체 Download PDF

Info

Publication number
KR20110050725A
KR20110050725A KR1020117007725A KR20117007725A KR20110050725A KR 20110050725 A KR20110050725 A KR 20110050725A KR 1020117007725 A KR1020117007725 A KR 1020117007725A KR 20117007725 A KR20117007725 A KR 20117007725A KR 20110050725 A KR20110050725 A KR 20110050725A
Authority
KR
South Korea
Prior art keywords
thread
instruction
instructions
threads
memory
Prior art date
Application number
KR1020117007725A
Other languages
English (en)
Other versions
KR101292439B1 (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 KR20110050725A publication Critical patent/KR20110050725A/ko
Application granted granted Critical
Publication of KR101292439B1 publication Critical patent/KR101292439B1/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
    • 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
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • 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/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
    • 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/3861Recovery, e.g. branch miss-prediction, exception handling
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/457Communication

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

순차적 프로그램을 다수의 스레드로 분해하고, 이러한 스레드를 실행하며, 스레드의 순차적 실행을 재구성하는 시스템, 방법 및 장치가 설명된다. 복수의 데이터 캐시 유닛(DCU)은 추론적으로 실행된 스레드의 국부적으로 퇴거된 인스트럭션을 저장한다. 병합 레벨 캐시(MLC)는 DCU의 라인으로부터의 데이터를 병합한다. 코어간 메모리 일관성 모듈(ICMC)은 MLC에서 추론적으로 실행된 스레드의 인스트럭션을 전역적으로 퇴거시킨다.

Description

순차적 프로그램을 다수의 스레드로 분해하고 이 스레드를 실행하며 순차적 실행을 재구성하는 장치, 방법 및 머신-판독가능 저장 매체{SYSTEMS, METHODS, AND APPARATUSES TO DECOMPOSE A SEQUENTIAL PROGRAM INTO MULTIPLE THREADS, EXECUTE SAID THREADS, AND RECONSTRUCT THE SEQUENTIAL EXECUTION}
본 발명의 실시예는 전반적으로 정보 처리 분야에 관한 것으로서, 보다 구체적으로는, 컴퓨팅 시스템 및 마이크로프로세서에서의 필드 멀티-스레드 실행(field multithreaded execution)에 관한 것이다.
단일 스레드 프로세서는 인스트럭션 레벨 병렬화(instruction level parallelism: ILP)를 이용함으로써 최근 수십 년 동안 상당한 성능 개선을 보여 주었다. 그러나, 이러한 종류의 병렬화는 때때로 활용하기가 곤란하며, 과도한 전력 소비 및 설계 복잡성을 가져올 수 있는 복잡한 하드웨어 구조를 요구한다. 더욱이, 이러한 복잡성 및 전력 면에서의 증가는 수익절감(diminishing returns)을 가져온다. 칩 멀티-프로세서(chip multiprocessor: CMP)는 합당한 전력 비용(power budget) 하에 추가적인 프로세서 성능 개선을 제공하기 위해 유망한 대안으로 부상하였다.
본 발명의 실시예는 첨부한 도면의 도에 제한사항이 아니라 실례로서 예시되며, 도면에서 유사한 참조기호는 유사한 구성요소를 나타낸다.
도 1은 세립 멀티-스레딩 시스템(fine-grained multithreading system)의 적어도 하나의 실시예의 하드웨어 및 소프트웨어 구성요소를 예시한 블록도,
도 2는 SpMT를 이용하는 예시적인 흐름도,
도 3은 4개의 기본 블록으로 형성된 소형 루프의 예시적인 세립 스레드 분해를 예시한 도면,
도 4는 데이터 의존성 그래프(Data Dependence Graphs: "DDGs")로 도시된 2개의 데이터 의존성을 가지며, 2개의 프로세싱 코어에서 실행될 2개의 스레드의 실례를 예시한 도면,
도 5는 제어 흐름을 고려한 스레드 파티셔닝 결과의 상이한 세 가지 실례를 예시한 도면,
도 6은 몇몇 실시예의 분해 방식에 대한 개요를 예시한 도면,
도 7은 최적화기에서 세립 SpMT를 이용하는 프로그램 코드를 생성하는 방법의 실시예를 예시한 도면,
도 8은 예시적인 멀티-레벨 그래프를 예시한 도면,
도 9는 조대화 방법(coarsening method)의 실시예를 예시한 도면,
도 10은 조대화 방법의 의사 코드 표현(pseudo-code representation)의 실시예를 예시한 도면,
도 11은 FIFO 큐 내로 커밋되는 스레드의 실시예를 예시한 도면,
도 12는 최적 영역에 대한 POP 마크를 판정하는 방법의 실시예를 예시한 도면,
도 13은 해먹(hammock)을 갖는 루프를 이용하는 실례를 예시한 도면,
도 14는 POP 마크를 이용하여 흐름을 재구성하도록 하는 방법의 실시예를 예시한 도면,
도 15는 스레드 정렬 재구성 메커니즘의 실시예가 채용될 수 있는 멀티-코어 시스템의 실시예를 예시한 블록도,
도 16은 협력 모드에서 동작하는 타일의 실례를 예시한 도면,
도 17은 본 발명의 적어도 하나의 실시예에 따라 추론적 멀티-스레딩(speculative multithreading)을 지원하는 예시적인 메모리 계층을 예시한 블록도,
도 18은 저장이 최적 모드에서 전역적으로 퇴거될 때 일어날 동작들의 방법의 실시예를 예시한 도면,
도 19는 로드(load)가 최적 모드에서 전역적으로 퇴거되려고 할 때 일어날 동작들의 방법의 실시예를 예시한 도면,
도 20은 ICMC의 실시예를 예시한 도면,
도 21은 체크포인팅 메커니즘의 ROB의 적어도 하나의 실시예를 예시한 도면,
도 22는 레지스터 체크포인팅 하드웨어의 적어도 하나의 실시예를 예시한 블록도,
도 23은 체크포인트를 이용하는 실시예를 예시한 도면,
도 24는 스레드 레벨 재구성을 이용하는 마이크로프로세서의 실시예를 예시한 도면,
도 25는 본 발명의 일 실시예가 이용될 수 있는 전면 버스(front side bus: FSB) 컴퓨터 시스템을 예시한 도면,
도 26은 본 발명의 일 실시예에 따른 시스템의 블록도,
도 27은 본 발명의 실시예에 따른 시스템 실시예의 블록도,
도 28은 본 발명의 실시예에 따른 시스템 실시예의 블록도이다.
본 발명의 실시예는, 순차적 프로그램(sequential program)을 다수의 실행 스레드 또는 스트림으로 분해하고 이들을 병렬로 실행하며 순차적 실행을 재구성(reconstruct)하는 기술에 관한 것이다. 예를 들어, 본 명세서에서 설명되는 실시예 중 몇몇 실시예는 그들이 임의적으로 다수의 스레드에 할당되었을 때 순차적인 인스트럭션 순서를 재구성하는 것을 허용한다. 따라서, 본 명세서에서 설명되는 이들 실시예는 순차적 프로그램을 다수의 실행 스레드 또는 스트림으로 분해하는 임의의 기술과 함께 이용될 수 있다. 구체적으로, 그들은 본 명세서에서 인스트럭션 단위(instruction granularity)로 추론적 스레드(speculative threads)로 분해된 애플리케이션의 순차적 순서를 재구성하는 데 이용될 수 있다.
추론적 멀티-스레딩은 순차적 코드 조각이 상이한 코어에서 또는 동일한 코어의 상이한 로직 프로세서(기능 유닛)에서 병렬로 실행될 스레드로 분해되는 병렬화 기술(parallelization technique)이다. 추론적 멀티-스레딩("SpMT")은 단일 스레드 성능을 신장(boost)시키는 다중 코어 또는 기능 유닛에 영향을 줄 수 있다. SpMT는 실행 시간 조건에 따라 자동으로 커밋되거나 스쿼시(squash)될 수 있는 스레드를 지원한다.
이후에 상이한 코어에서 실행되는 스레드의 콘텍스트에서 설명되겠지만, 본 명세서에서 설명되는 개념은 추론적 멀티-스레딩형 실행(speculative multi-threading-like execution)에도 적용 가능하다. 즉, 본 명세서에서 설명되는 개념은 동일한 코어의 상이한 SMT 로직 프로세서에서 실행되는 추론적 스레드에도 적용 가능하다.
세립 SpMT 패러다임(Fine-Grain SpMT Paradigm)
추론적 멀티-스레딩은 단일 스레드 성능을 신장시키도록 다중 코어에 영향을 준다. 그것은 실행 시간 조건에 따라 자동으로 커밋되거나 스쿼시될 수 있는 스레드를 지원한다. 통상적인 추론적 멀티-스레딩 방식에서, 각각의 스레드는 큰 청크(chunk)의 연속 인스트럭션들(예를 들어, 루프 반복(loop iteration) 또는 기능 호출(function call))을 실행한다. 개념적으로, 이것은 동적 인스트럭션 스트림을 청크로 파티셔닝(partition)하고 그들을 병렬로 실행하는 것과 동등하다. 그러나, 이러한 종류의 파티셔닝은 스레드들 사이에 너무 많은 의존성(dependency)을 갖게 하여, 활용 가능한 TLP를 제한하고 성능에 해를 끼친다. 세립 SpMT에서, 인스트럭션은 통상적인 스레딩 방식보다 더 미세한 단위로 스레드들 사이에 분배될 수 있다. 이러한 관점에서, 이 새로운 모델은 이전의 스레딩 패러다임의 슈퍼세트(superset)이며, 통상적인 방식보다 TLP를 더욱 양호하게 활용할 수 있다.
하기에 설명되는 것은, 다중 하드웨어 콘텍스트, 즉 프로세싱 코어를 이용하여 단일 스레드 애플리케이션의 속도를 증가시키는 정적 또는 동적 최적화기를 이용하는 추론적 멀티-스레딩 패러다임의 실시예이다. 순차적 코드 또는 동적 스트림은, 큰 청크의 연속적 인스트럭션들이 스레드에 할당되는 통상적인 스레딩 기술과 대조적으로, 매우 미세한 단위(개별적 인스트럭션 레벨)에서 다수의 추론적 스레드로 분해된다. 이러한 유연성(flexibility)은 순차적 애플리케이션에서 TLP의 활용을 허용하되, 이러한 애플리케이션에서는 통상적인 파티셔닝 방식은 성능을 제한할 수 있는 많은 스레드간 데이터 의존성에 처하게 된다. 이것은 또한 스레드의 작업 균형(work balance)을 개선할 수 있고/있거나 활용될 수 있는 메모리 레벨 병렬화의 양을 증가시킬 수 있다.
스레드간 데이터 의존성의 존재 시, 그들을 관리할 세 가지의 상이한 접근법, 즉 (1) 명시적 스레드간 통신을 이용하는 접근법, (2) 이러한 의존성을 국부적으로 충족하는 사전 계산 슬라이스(복제된 인스트럭션)를 이용하는 접근법, 및/또는 (3) 그들을 무시하여, 어떠한 의존성도 추측하지 않으며, 하드웨어가 잠재적 위반(potential violation)을 검출하게 하는 접근법이 설명된다. 이 세립 스레딩에서, 스레드 내부에서의 제어 흐름은 국부적으로 관리되며, 그것에 할당된 인스트럭션의 실행에 영향을 미치는 스레드 내 그러한 브랜치를 포함하는 것만을 요구한다. 따라서, 코어 전단은 스레드의 제어 흐름을 다루거나 브랜치 예측 오류를 관리하기 위해 임의의 추가 하드웨어를 요구하지 않으며, 각각의 코어는 (명시적 스레드간 통신에 의해 유발되는 동기화 지점을 제외하고) 인스트럭션을 독립적으로 페치(fetch)하고, 실행하며, 커밋한다.
도 1은 세립 멀티-스레딩 시스템의 적어도 하나의 실시예에 대한 하드웨어 및 소프트웨어 구성요소를 예시한 블록도이다. 원래의 스레드(101)는, 컴파일러, 최적화기 등과 같이 스레드 생성용 모듈 또는 모듈들(103)을 포함하는 소프트웨어 내로 제공된다. 스레드 또는 그것의 영역은 모듈 또는 모듈들(105)에 의해 다수의 스레드로 분해된다. 각각의 스레드는 자기의 코어/하드웨어 콘텍스트(107)에서 실행될 것이다. 이들 코어/콘텍스터(107)는 원래의 프로그램 순서 또는 그것의 서브세트를 재구성하는 로직(109), 메모리 상태에 대한 로직(111), 레지스터 상태에 대한 로직(113), 및 그 밖의 로직(115)과 같은 여러 가지의 상이한 로직 요소에 연결된다.
도 2는 SpMT를 이용하는 예시적인 흐름을 예시한다. 블록(201)에서는, 순차적 애플리케이션(프로그램)이 컴파일러, 최적화기 또는 그 밖의 개체에 의해 수신된다. 이 프로그램은 실행가능 코드 또는 소스 코드의 형태일 수 있다.
블록(203)에서 순차적 애플리케이션의 적어도 일부분은 하나 이상의 최적 영역을 형성하는 세립 스레드로 분해된다. 이러한 분해의 실시예는 하기에 설명되며, 이것은 컴파일러, 최적화기 또는 그 밖의 개체에 의해 수행될 수 있다.
블록(205)에서, 순차적 애플리케이션은 정상적으로 실행된다. 애플리케이션이 최적 영역에 진입해야 하는지에 대한 판정이 블록(207)에서 이루어진다. 통상적으로, 스펀 인스트럭션(spawn instruction)은 최적 영역의 시작을 나타낸다. 이 인스트럭션 또는 그 등가물은 통상적으로 프로그램의 실행 이전에, 예를 들면 컴파일러에 의해 추가된다.
코드가 정상적으로 처리된다면, 그것은 블록(205)에 있다. 그러나, 스펀 인스트럭션이 있었다면, 최적 영역에 대해 하나 이상의 스레드가 생성되고 블록(211)에서 최적 영역의 완성에 관한 판정 때까지 블록(209)에서 프로그램은 협력 (추론적 멀티-스레딩) 모드로 실행된다.
최적 영역의 완성 시에, 그것은 커밋되고 애플리케이션의 정상적인 실행이 블록(213)에서 계속된다.
세립 스레드 분해(Fine-Grain Thread Decomposition)
세립 스레드 분해는 스레드들 사이에 개별 인스트럭션을 유연하게 배분하는 순차적 코드 또는 동적 스트림으로부터의 스레드 생성이다. 이것은 동적 최적화기에 의해 구현될 수도 있고, 또는 컴파일 시간에 정적으로 구현될 수도 있다.
도 3은 4개의 기본 블록(A, B, C, D)으로 형성된 소형 루프의 예시적인 세립 스레드 분해를 예시한다. 각각의 기본 블록은 Ai, Bi, Ci 및 Di로 표기되는 여러 인스트럭션으로 구성된다. 도면의 좌측은, 루프의 원래의 제어 흐름 그래프(Control Flow Graph: "CFG") 및 콘텍스트 오버 타임(context over time)에서 실행될 때의 동적 스트림 조각을 도시한다. 도면의 우측은 각자의 콘텍스트를 갖는 2개의 스레드로의 한 가지 가능한 세립 스레드 분해의 결과를 도시한다. 병렬로 실행될 때의 각각의 최종 생성 스레드 및 그 동적 스트림의 CFG가 도면에 도시된다. 이 스레드 분해는, 큰 인스트럭션 청크가 스레드에 할당되는 통상적인 방식보다 더 유연하다(flexible)(일반적으로, 통상적인 스레딩 방식은 각각의 스레드에 루프 반복을 할당할 것이다). 루프가 실례로서 도 3에 도시되어 있지만, 세립 스레드 분해는 임의의 하이-레벨 코드 구조에 직교하며(orthogonal), 임의의 조각의 순차적 코드 또는 동적 스트림에 적용될 수 있다.
스레드들 간에 개별적인 인스트럭션을 분배하는 유연성은 그들을 생성하기 위한 상이한 정책을 구현하도록 하는 데 영향을 받을 수 있다. 순차적 코드 또는 동적 스트림의 스레드 분해에 기여하고 더 많은 스레드 레벨 병렬화를 활용하게 할 수 있는 정책들 중 몇몇은, (1) 인스트럭션이 스레드간 데이터 의존성의 양을 최소화시키도록 스레드에 할당되게 하는 정책, (2) 인스트럭션이 그들의 작업 로드(work load)의 균형을 맞추도록 스레드에 할당되게 하는 정책(세립 스레드 분해는 스레드의 균형을 맞추기 위한 결정이 인스트럭션 레벨에서 이루어질 수 있기 때문에 작업 로드 균형의 미세 조정을 허용한다), (3) 인스트럭션이 메모리 레벨 병렬화(memory level parallelism: "MLP")를 더 양호하게 활용하도록 스레드에 할당될 수 있게 하는 정책 중 하나 이상을 포함하지만, 이들로 제한되는 것은 아니다. MLP는 메모리 제한 애플리케이션(memory bounded applications)을 위한 병렬화 소스이다. 이들 애플리케이션의 경우, MLP에 대한 증가는 성능 면에서 상당한 증가를 초래할 수 있다. 세립 스레드 분해는 MLP를 증가시키기 위해 스레드들 간에 로드 인스트럭션을 분배하는 것을 허용한다.
스레드간 데이터 의존성 관리(Inter-thread Data Dependences Management)
추론적 멀티-스레딩 패러다임의 문제점 중 하나는 스레드간 데이터 의존성의 운용이다. 스레드들 간의 데이터 의존성을 해결하기 위한 두 가지 메커니즘, 즉 1) 사전 계산, 및 2) 통신이 하기에 설명된다.
제 1 메커니즘은 스레드간 데이터 의존성을 저지하고 그들을 국부적으로 충족시키도록 하는 사전 계산 슬라이스(pre-computation slices)(간략하게는, "피-슬라이스(pslice)")의 사용이다. 예를 들어, 스레드 T2에 의해 생성된 데이터를 필요로 하는 스레드 T1에 할당된 인스트럭션 "I"가 주어진다면, 그것의 피-슬라이스에 속하는 모든 요구된 인스트럭션(I가 필요로 하는 데이터를 생성하는 데 필요한 인스트럭션들의 서브세트)으로서 T1에 할당되지 않았던 것들은 T1으로 복제된다. 이러한 인스트럭션은 본 명세서에서 복제 인스트럭션이라고 지칭된다. 이들 복제 인스트럭션은 정규 인스트럭션으로 취급되며, 스레드에 할당된 나머지 인스트럭션과 함께 스케줄링될 수 있다. 결과적으로, 추론적 스레드에서, 복제 인스트럭션은 나머지 인스트럭션과 혼합되며, 스레드의 실행 시간을 최소화시키도록 재정렬될 수 있다. 또한, 값을 사전 계산하는 것은 그것의 피-슬라이스에 속하는 모든 인스트럭션을 복제하는 것을 암시하지는 않는데, 이는 그 값을 계산하는 데 요구되는 중간 데이터 중 몇몇이 상이한 스레드에서 계산될 수 있고, 이후에 설명되는 바와 같이 통신될 수 있기 때문이다.
두 번째로, 그러한 의존성은, (i) 그들을 국부적으로 충족시키기에는 너무 많은 복제 인스트럭션을 요구할 수 있거나, 또는 (ii) 실행 시간에 해를 끼치는 일 없이 소정 양의 사이클을 지연시킬 수 있는 것으로, 명시적 스레드간 통신을 통해 해결된다. 이것은 복제되어야 하는 인스트럭션의 양을 감소시키지만, (적어도 수신기 인스트럭션에서) 각각의 명시적 통신에 대한 동기화 포인트를 도입한다.
도 4는 데이터 의존성 그래프(Data Dependence Graphs: "DDGs")로서 도시되는 2개의 데이터 의존성을 갖는 2개의 프로세싱 코어에서 실행될 2개의 스레드의 실례를 예시한다. 그러나, 당업자라면, 본 명세서에서 설명된 재정렬 실시예는 보다 많은 수의 스레드 및/또는 분해된 스레드를 실행시킬 보다 많은 수의 코어 또는 로직 프로세서로의 분해를 수반하는 세립 멀티-스레딩과 함께 활용될 수 있다는 것을 인지할 것이다. 도면에서, 원은 인스트럭션이고, 화살표는 2개의 인스트럭션 사이의 데이터 의존성을 표현한다.
좌측에 있는 것은, 루프의 순차적 실행에 대한 인스트럭션의 예시적인 동적 실행 스트림 및 원래의 순차적 제어 흐름 그래프("CFG")이다. 이 CFG에서, 인스트럭션 "b" 및 "d"는 인스트럭션 "a"에 대한 데이터 의존성을 갖는다.
우측은 좌측의 순차적 루프 CFG에 대한 예시적인 스레드 분해를 나타낸다. 2개의 CFG 및 2개의 동적 실행 스트림은, 일단 루프가 인스트럭션 단위로 2개의 스레드로 분해되면 생성된다(인스트럭션 D1은 양측 스레드에서 복제된다). 이것은 2개의 분해된 스레드에 대한 분해 제어 흐름 그래프를 예시하며, 또한 루프의 분해된 스레드의 동시적 실행(concurrent execution)에 대한 인스트럭션의 가능한 동적 실행 스트림(dynamic execution streams) 샘플을 예시한다. 이것에 대해, 스펀 인스트럭션이 실행되고 스퍼너(spawner) 및 스퍼니(spawnee) 스레드는 2개의 실행 스트림 사이의 임의의 명시적 순서 없이 그들의 할당된 인스트럭션을 페치 및 실행하기 시작한다는 것을 전제로 한다. 우측은 실례에서 상이한 스레드 실행 스트림에 속하는 2개의 주어진 인스트럭션 사이의 순서를 아는 것이 사소한 것이 아니라는 것을 예시한다. 알 수 있는 바와 같이, 하나의 의존성은 스레드 1에서 하나의 복제 인스트럭션("a")을 요구하는 사전 계산 슬라이스를 통해 해결되며, 다른 의존성은 ("h"와 "f" 사이에서의) 명시적 통신을 통해 해결된다.
스레드 분해 시간에 예측되지 않은 추가 의존성이 실행 시간에 나타날 수 있다. 세립 SpMT를 구현하는 시스템(하드웨어, 펌웨어, 소프트웨어 및 이들의 조합)은 그러한 의존성 위반을 검출해야 하며, 위반 스레드(들)(offending thread(s))을 스쿼시하고 그것/그들의 실행을 재시작한다.
적어도 하나의 실시예의 경우, 분해된 인스트럭션 스트림으로부터의 순차적 실행의 재구성은 하드웨어에서 일어난다. 몇몇 실시예의 경우, 이 하드웨어 기능은 이후에 더욱 상세히 설명되는 코어 간 메모리 일관성 모듈(Inter-Core Memory Coherency Module: ICMC)에 의해 수행된다.
제어 흐름 관리(Control Flow Management)
세립 SpMT를 이용하여 인스트럭션을 병렬로 실행시키도록 인스트럭션 단위로 스레드에 인스트럭션을 분배할 때, 원래의 순차적 실행의 제어 흐름이 고려 및/또는 관리되어야 한다. 예를 들어, 제어 흐름은 추론적 스레드가 생성될 때 소프트웨어에 의해 관리될 수 있다. 이와 같이, 세립 SpMT를 이용하는 프로세서의 전단은, 세립 SpMT 스레드의 제어 흐름을 다루거나 브랜치 예측 오류를 관리하기 위한 임의의 추가 하드웨어를 요구하지 않는다. 오히려, 주어진 스레드에 대한 제어 추론은 적소에서 통상적인 예측 및 복구 메커니즘을 이용함으로써 그것이 실행하는 콘텍스트에서 국부적으로 관리된다.
세립 SpMT에서, 모든 스레드는 그것의 인스트럭션에 대한 제어 경로를 계산하는 데 필요로 하는 모든 브랜치를 포함한다. 주어진 스레드의 임의의 인스트럭션을 실행하는 데 요구되지만, 그 스레드에 원래 포함된 것은 아닌 이 브랜치가 복제된다. 모든 브랜치가 모든 스레드에서 필요로 되는 것이 아니라 그것의 인스트럭션의 실행에 영향을 미치는 것들만 필요하다는 점에 유의하라. 또한, 스레드에 브랜치 인스트럭션을 갖는 것은, SpMT 패러다임이 스레드간 통신을 허용하기 때문에 스레드 내 이 브랜치를 계산하는 데 필요로 되는 모든 인스트럭션이 마찬가지로 포함될 필요가 있다는 것을 의미하는 것은 아니다. 예를 들어, 가능한 시나리오는, 오직 하나의 스레드가 브랜치 조건을 계산하고 그것을 나머지 스레드와 통신시키는 것이다. 다른 시나리오는, 주어진 브랜치의 제어 흐름의 계산이 모든 스레드들 사이에 완전히 확산되는 것이다.
도 5는 제어 흐름을 고려할 때 스레드 파티셔닝의 결과에 대한 세 가지의 상이한 실례를 도시한다. 제어 흐름에 수반되는 인스트럭션은 밑줄이 쳐져 있고, 화살표는 명시적 스레드간 통신을 나타낸다. 알 수 있는 바와 같이, 브랜치(원래의 코드에서 Bz LABEL)는 세 가지 모든 경우에서 그것을 필요로 하는 모든 스레드(T1, T2) 내에 복제되었다. 단일 제어 흐름 계산(a)의 경우, 브랜치를 계산하는 인스트럭션은 T2에 의해 실행되고, 결과는 T1로 전달된다. 제어 흐름(b)의 전체 복제 시에 있어서, 계산은 양측 스레드(T1, T2)에서 복제되며, 명시적 통신은 필요하지 않다. 브랜치의 계산은 그것이 명시적으로 통신하는 상이한 스레드들 (실제로 브랜치에 상관이 없는 스레드를 포함함) 사이에서 분리될 수 있도록 프로그램에서의 임의의 다른 계산으로서 파티셔닝된다. 이것의 실례는 제어 흐름(c)의 분리 계산에 나타내어진다.
적어도 하나의 실시예의 경우, 순차적 코드 조각은 통상적인 툴에 의해 효율적으로 병렬화 수 없는 완전한 순차적 프로그램일 수 있다. 적어도 하나의 다른 실시예의 경우, 순차적 코드 조각은 병렬화된 애플리케이션의 일련의 부분일 수 있다. 추론적 멀티-스레딩은 멀티-코어 아키텍처가 단일 스레드 애플리케이션을 보다 신속하게 실행할 수 있는 복잡성-유효 광역 코어(complexity-effective very wide core)로서 동작하게 만든다.
본 명세서에서 설명되는 적어도 몇몇 실시예의 경우, 원래의 단일 스레드 애플리케이션의 전체 작업 또는 일부분은 각각의 스레드가 원래의 순차적 애플리케이션 또는 그것의 일부분에 대한 총 작업의 서브세트를 실행하는 여러 개의 추론적 스레드로 분해되었다는 것을 가정한다. 이러한 분해는, 예를 들면 외부 툴(예컨대, 동적 최적화기, 컴파일러 등)에 의해 수행될 수 있다.
단일 스레드 프로그램으로부터의 다수의 추론적 스레드 생성(Generating Multiple Speculative Threads From a Single-Threaded Program)
순차적 애플리케이션이 추론적 스레드로 분해되는 프로세싱의 시기는 본 명세서에서 "후기(anaphase)"라고 지칭된다. 설명을 위해, 이러한 분해는 컴파일 시간에 일어난다고 가정할 것이다. 그러나, 이미 언급된 바와 같이, 이러한 분해는 컴파일러 외에도 다른 외부 툴(예컨대, 동적 최적화기)를 통해 일어날 수 있다. 애플리케이션의 실행 시간 중 대부분을 커버하는 그들 영역에 대한 SpMT 스레드가 생성된다. 이 섹션에서는, 이 모델에서 고려되는 추론적 스레드가 먼저 설명되고, 관련된 실행 모델 및 마지막으로 그들을 생성하는 컴파일러 기술이 설명된다.
스레드간 의존성은 추론적 스레드들 사이에서 나타날 수 있다. 이러한 의존성은 하나의 추론적 스레드에서 생성된 값이 다른 추론적 스레드에서 요구될 때 발생한다. 스레드간 의존성은 코드를 분석함으로써 그리고/또는 프로파일 정보를 이용함으로써 컴파일 시간에 검출될 수 있다. 그러나, 모든 가능한 의존성이 컴파일 시간에 검출되는 것은 아니며, 스레드로의 분해는 추론적 방식으로 수행될 수 있다. 적어도 하나의 실시예의 경우, 하드웨어는, 상이한 추론적 스레드에 할당되며, 컴파일러가 스레드를 생성했을 때 고려되지 않은 2개의 인스트럭션 사이에서 실행 시간 동안 발생할 수 있는 메모리 의존성의 처리를 담당한다.
컴파일 시간에 식별되는 모든 스레드간 의존성에 대해, 적절한 코드가 추론적 스레드에서 생성되어 그들을 처리한다. 구체적으로, 다음의 기술, 즉 (i) 의존성이 명시적 통신에 의해 충족되는 기술, 또는 (ii) 소비되는 데이터를 생성하는 데 필요로 되는 인스트럭션들의 서브세트("라이브-인스(live-ins)")인 사전 계산 슬라이스(피-슬라이스)에 의해 의존성이 충족되는 기술 중 하나가 적용된다. 피-슬라이스에 포함되는 인스트럭션은 2개 이상의 스레드에 할당될 필요가 있을 수 있다. 따라서, 추론적 스레드는, 도 3에서의 인스트럭션 D1의 경우와 같이, 복제된 인스트럭션을 포함할 수 있다.
마지막으로, 각각의 추론적 스레드는 제어 흐름의 관점에서 볼 때 자립적이다. 이것은, 각각의 스레드가 자신의 실행을 분석하는 데 필요로 하는 모든 브랜치를 갖는다는 것을 의미한다. 이것을 달성하기 위해, 스레드의 인스트럭션의 실행에 영향을 주는 브랜치는 동일한 스레드에 배치될 필요가 있다는 것에 유의하라. 브랜치가 2개 이상의 스레드에 배치될 필요가 있다면, 그것은 복제된다. 이것은 또한 스레드가 생성될 때 컴파일러에 의해 다루어진다.
실행에 관하여, 추론적 스레드는 하기에 예시되는 바와 같은 멀티-코어 프로세서 상에서 협력적 방식으로 실행된다. 도 6에는 몇몇 실시예의 분해 방식에 대한 개요가 설명된다. 이 설명을 위해, (스레드 아이디 0("tid 0") 및 스레드 아이디 1("tid 1")에 대응하는) 추론적 스레드가 2개의 상이한 코어(예컨대, 도 15의 타일 참조) 또는 동일하거나 상이한 코어의 2개의 상이한 로직 프로세서에 의해 동시에 실행된다. 그러나, 당업자라면, 이와 다른 순차적 인스트럭션들의 세트의 동시적 실행을 수행하기 위한 타일이 3개 이상의 코어를 포함할 수 있다는 것을 인식할 것이다. 유사하게, 본 명세서에서 설명되는 기술은 코어마다 다수의 SMT 로직 프로세서를 포함하는 시스템에 적용 가능하다.
이미 설명된 바와 같이, 컴파일러 또는 유사 개체는 특정 영역(이 예시에서는 영역 B(610))이 추론적 멀티-스레딩을 적용하는 데 적합하다는 것을 검출한다. 그러면, 이 영역(610)은 영역(610)의 최적 버전(640)으로서 애플리케이션 코드의 다른 곳에서 맵핑되는 추론적 스레드(620, 630)로 분해된다.
스펀 인스트럭션(650)은 최적화된 영역(영역 B(610))에 진입하기 전에 원래의 코드에 삽입된다. 스펀 동작은 새로운 스레드를 생성하며, 스퍼너 및 스퍼니 추론적 스레드 양측 모두는 코드의 최적 버전(640)을 실행하기 시작한다. 도시된 실례의 경우, 스퍼너 스레드는 추론적 스레드들 중 하나(예컨대, 620)를 실행할 수 있고, 스퍼니 스레드는 다른 것(예컨대, 630)을 실행할 수 있다.
2개의 추론적 스레드가 협력 형태에 있을 때, 그들 사이의 동기화는 스레드간 의존성이 명시적 통신에 의해 충족될 때 발생한다. 그러나, 통신은, 적절한 통신 메커니즘이 적소에 있는 한, 오로지 소비자 측에서만의 동기화를 암시할 수 있다. 정규 메모리 또는 전용 로직은 그러한 통신에 이용될 수 있다.
한편, 위반, 제외 및/또는 인터럽트는 협력 모드에 있는 동안에 발생할 수 있으며, 추론적 스레드는 롤백(roll back)될 필요가 있을 수 있다. 이것은 소프트웨어 스레드에 대해 총체적으로 투명한(transparent) 방법으로 하드웨어에 의해 또는 컴파일 시간에 그것을 다루어지도록 하는 몇몇 여분의 코드(예컨대, 퇴거 코드(660)를 참조)를 포함함으로써 처리될 수 있다.
양측 스레드가 최종 인스트럭션에 도달할 때, 그들은 최적 영역으로 나가도록 동기화되고, 추론적 상태는 비추론적이 되며, 실행은 하나의 단일 스레드로 계속되고, 타일은 단일 모드로 재개된다. 본 명세서에서 사용되는 "타일"은 도 15와 관련하여 하기에 더욱 상세히 설명된다. 일반적으로, 타일은 그와 다른 순차적 인스트럭션들의 세트의 상이한 부분들을 동시에 실행하도록 작동하는 2개 이상의 코어로 이루어진 그룹이다(그럼에도 불구하고 이러한 순차적 인스트럭션에서 "상이한" 부분은 복제된 인스트럭션을 포함할 수 있다).
추론적 스레드는 통상적으로 컴파일 시간에 생성된다. 이와 같이, 컴파일러는, (1) 애플리케이션을 프로파일링하는 것, (2) 코드를 분석하고 병렬화를 위한 코드의 가장 편리한 영역을 검출하는 것, (3) 선택 영역을 추론적 스레드로 분해하는 것, (4) 최적 코드 및 롤백 코드를 생성하는 것을 담당한다. 그러나, 하기에 설명되는 기술은 이미 컴파일된 코드에 적용될 수 있다. 또한, 본 명세서에서 설명되는 기술은 비루프 코드 뿐 아니라 모든 타입의 루프에 적용될 수 있다. 적어도 하나의 실시예의 경우, 추론적 스레드가 생성되는 루프는 전개되지 않고/않거나 빈번히 실행되는 직렬 루틴(routines inlined)일 수 있다.
도 7은 최적화기에서 세립 SpMT를 이용하는 프로그램 코드를 생성하는 방법의 실시예를 예시한다. 블록(701)에서는 "원래의(original)" 프로그램 코드가 수신되거나 생성된다. 이 프로그램 코드는 통상적으로 여러 개의 코드 영역을 포함한다.
원래의 프로그램 코드는 블록(703)에서 데이터 의존성 그래프(DDG) 및 제어 흐름 그래프(CFG)를 생성하는 데 이용된다. 대안으로, DDG 및 CFG는 최적화기에 의해 수신될 수 있다.
이들 그래프는 멀티-스레드 추론적 실행에 대한 후보일 하나 이상의 영역을 찾기 위해 분석된다. 예를 들어, "핫(hot)" 영역은 SpMT가 유익할 것임을 나타낼 수 있다. 이 분석의 일부로서, DDG에서의 노드(예컨대, x86 인스트럭션) 및 에지는 그들의 동적 발생(dynamic occurrences) 및 인스트럭션들 사이에서 데이터 의존성(레지스터 또는 메모리)이 발생하는 횟수에 의해 가중되며, CFG의 제어 에지는 취해진 경로의 빈도에 의해 가중된다. 이 프로파일링 정보는 그래프에 추가되며, 양 그래프는 블록(705)에서 프로그램 의존성 그래프(PDG) 내에 축약된다. 다른 실시예에서는 그래프가 축약되지 않는다.
몇몇 실시예에서, PDG는 무엇보다도 코드 재정렬과 같은 안전한 데이터 흐름 및 제어 흐름 코드 변형, 일정한 지연, 루프 비전개, 및 루틴 특화(routine specialization)를 적용함으로써 최적화된다.
블록(707)에서는 조대화(coarsening)가 수행된다. 조대화 동안, 노드(인스트럭션)는 희망하는 수의 파티션(예를 들어, 2개의 스레드의 경우에는 2개의 파티션)만큼 많은 노드가 있을 때까지 더 큰 노드로 반복해서 축약된다(collapsed). 조대화는 비교적 양호한 파티션을 제공한다.
조대화 단계에서, 최종 그래프가 스레드만큼 많은 슈퍼노드를 갖게 될 때까지 그래프 크기는 노드 쌍을 슈퍼노드에 축약함으로써 반복해서 감소하는바, 스레드로의 첫 번째 인스트럭션 파티션을 설명한다. 이 과정 동안, 상이한 레벨의 슈퍼노드가 멀티-레벨 그래프에 생성된다(예시적인 멀티-레벨 그래프는 도 8에 예시된다). 주어진 레벨로부터의 노드는 그것보다 아래의 레벨로부터의 하나 이상의 노드를 포함한다. 이것은 도 8에서 알 수 있는데, 레벨 0에서의 노드는 개별 인스트럭션이다. 보다 조대화된 노드는 슈퍼노드라고 지칭되며, 노드 및 슈퍼노드라는 용어는 이 명세서 전반에 걸쳐서 상호 교환적으로 언급된다. 또한, 각각의 레벨은, 최저 레벨이 원래의 그래프(이 알고리즘 단계로 전달됨)를 포함하고 최상 레벨만이 생성하기를 원하는 스레드만큼 많은 슈퍼노드를 포함하는 방법으로 보다 적은 노드를 갖는다. 슈퍼노드에 속하는 노드는 동일한 스레드에 할당될 것이다.
그렇게 하기 위해, 실시예에서, 노드 쌍은 그래프에서 조대화시키도록 하는 레벨 i로 선택되고 슈퍼노드는 양측 노드를 포함하는 레벨 i+1로 확립되었다. 이것의 실례는 도 8에서 알 수 있는데, 레벨 0에서의 노드 a 및 b는 결합되어 레벨 1에서의 노드 ab를 형성한다. 이것은 모든 노드가 다음 레벨로 투영되었거나 더 이상 축약할 유효 쌍이 없을 때까지 반복된다. 이것이 발생할 때, 현재 레벨에서 축약되지 않은 노드는 단지 새로운 슈퍼노드로서 다음 레벨에 추가된다. 이 방법으로, 새로운 레벨이 완성되며, 알고리즘은 이 새로운 레벨에 대한 희망하는 수의 슈퍼노드(스레드)가 얻어질 때까지 반복된다.
그래프를 조대화할 때, 적어도 하나의 실시예의 경우, 임계 경로에 속하는 그들 인스트럭션의 통합물에 최고 우선권이 부여된다. 타이(tie)의 경우, 우선권은 보다 많은 수의 공통 선임(common ancestor)을 갖는 인스트럭션에 부여될 수 있다. 공통 선임의 수가 클수록, 연결성은 더 강해지며, 그에 따라 통상적으로는 그들을 동일한 스레드에 통합하는 것이 더 적절하다. 한편, 스레드들 간에 작업 로드를 적절히 분배하기 위해, 매우 낮은 우선권이, (1) (직접적으로 또는 간접적으로) 서로에게 의존하지 않는 노드들, (2) 비행성 로드(delinquent loads) 및 그들의 소비자의 통합물에게 부여된다. 프로파일링 동안에 L2 캐시(cache)에서 상당한 누락률(miss rate)을 갖는 로드는 비행성인 것으로 간주될 수 있다.
도 9는 조대화 방법의 실시예를 예시한다. 블록(920)에서, 멀티-레벨 그래프는 멀티-레벨 그래프의 제 1 레벨에 있는 영역의 인스트럭션에 따라 생성되며, 멀티-레벨 그래프의 현재 레벨은 0과 같은 초기 값으로 설정된다. 도 8을 참조하면, 이것은 멀티-레벨 그래프에서 L0일 것이다.
블록(930)에서, 파티션의 수가 희망 스레드의 수보다 많은지에 대한 결정이 이루어진다. 예를 들어, 파티션의 수가 2보다 큰가(2개의 스레드 대신 3개의 스레드가 생성될 것인가)?
파티션의 수가 획득되었다면, 조대화가 완료되었다. 그러나, 파티션의 수가 희망하는 것보다 많다면, 블록(940)에서 매트릭스가 생성된다. 또한, 실례로서 도 8을 참조하면, 레벨 0에서 파티션의 수는 9이고, 그에 따라 매트릭스는 다음 레벨(L1)을 생성하도록 생성될 필요가 있을 것이다.
실시예에서, 매트릭스의 생성은 3개의 서브루틴을 포함한다. 블록(971)에서, 매트릭스 M이 초기화되고, 그것의 값은 0으로 설정된다. 매트릭스 M은 노드들 사이의 관계에 따라 형성되는데, 이 경우 매트릭스 위치 M[i, j]는 노드 i와 노드 j 및 M[i, j]=M[j, i] 사이의 관계 비율을 설명한다. 이러한 비율은 0(최악의 비율)과 2(최상의 비율) 사이의 범위에 있는 값이며, 비율이 높을수록 2개의 노드는 보다 더 많이 관련된다. 모든 0으로 초기화된 후, 매트릭스 M의 셀은 사전 정의된 기준의 세트에 따라 충진된다. 이러한 기준 중 첫 번째 기준은, 캐시에서 종종 누락되기 쉽고 그에 따라 성능에 영향을 미치는 로드 인스트럭션인 비행성 로드의 검출이다. 실시예에서는, 임계치(예를 들어, 10%)보다 높은 누락율을 갖는 비행성 로드가 판정된다. 비행성 로드를 갖는 노드 및 그들의 사전 계산 슬라이스의 형성은 (이후에 설명되는) 개선이 그들의 소비자(consumer)로부터 이격된 그러한 로드를 모델링하게 하는 데 유리하다. 따라서, 비행성 로드를 소비자와 접속시키는 데이터 에지는 매우 낮은 우선권을 부여받는다. 실시예에서, 노드들의 비율은 다음의 슬랙(slack) 및 공통 전임 평가(common predecessor evaluations)와는 무관하게 매트릭스 M에서 0.1(매우 낮은 우선권)로 고정된다. 따라서, 비행성 노드로 식별된 노드의 경우는 0.1의 값을 부여받는다. 이것의 실시예의 의사 코드 표현은 도 10에 표현된다.
블록(972)에서, PDG의 각 에지의 슬랙이 계산되고, 그에 따라 매트릭스 M이 업데이트된다. 슬랙은 인스트럭션이 총 실행 시간에 영향을 주지 않고 그것의 실행을 지연시켜야 하는 특권이다. 이러한 슬랙을 계산하기 위해, 먼저, 각각의 인스트럭션에 대한 초기 디스패치 시간(earliest dispatch time)이 계산된다. 이 계산에 대해서는 오로지 데이터 의존성만이 고려된다. 또한, 상이한 반복들 사이의 의존성은 무시된다. 이것 다음에, 각 인스트럭션의 가장 최근의 디스패치 시간이 유사하거나 동일한 방법으로 계산된다. 각 에지의 슬랙은 각각 소비자 및 생산자 노드의 초기 디스패치 시간과 가장 최근의 디스패치 시간 사이의 차이로서 정의된다. 이 방법에서 슬랙을 갖지 않는 에지(제어 에지 및 반복간 의존성)는 디폴트 슬랙 값(예를 들어, 100)을 갖는다. 매우 낮은 슬랙을 갖는 에지에 의해 접속되는 2개의 노드 i 및 j는 임계 경로의 일부로서 간주되며, 보다 높은 우선권을 갖도록 축약될 것이다. 임계 에지는 0의 슬랙을 갖는 것들이며, 그러한 노드의 비율 M[i, j] 및 M[j, i]는 최상의 비율(예를 들어, 2.0)로 설정된다. 이것의 의사 코드 표현은 도 10에 나타내어진다.
매트릭스 M의 나머지 노드는 블록(973)에서 공통 선임을 찾음으로써 충진된다. 공유하는 각 노드 쌍(i, j)의 전임 인스트럭션의 수는 에지를 후방으로 선회시킴으로써 계산된다. 이것은, 의존적 인스트럭션을 동일한 스레드에 할당하고 독립적 인스트럭션을 상이한 스레드에 할당하는 데 도움을 준다. 실시예에서, 각 노드 쌍의 선행자 관계는 그들의 선임들의 교점과 그들의 선임들의 접합 사이의 비율로서 계산된다. 다음의 수학식은 노드 i와 j 사이의 비율(R)을 정의한다.
Figure pct00001
함수 P(i) 및 P(j)는 노드 i 또는 j를 포함하는 선행자 i 또는 j의 세트를 나타낸다. 실시예에서, P(i)에서의 각각의 선임 인스트럭션은 그것의 프로파일링된 실행 빈도에 의해 가중되어, 동적 인스트럭션 스트림에 대한 보다 깊은 영향을 갖는 인스트럭션에 더 많은 중요성을 부여한다.
이 비율은 소정 범위까지 2개의 노드가 어떻게 관련되는지에 대해 설명한다. 그래프를 후방으로 선회시킬 때 2개의 노드가 상당한 양의 노드를 공유한다면 그들이 많은 계산을 공유하며 그에 따라 그들을 동일한 스레드에 맵핑시키는 것이 합당하다는 것을 의미한다. 그들은 매트릭스 M에서 큰 관계 비율을 가져야 한다. 반면, 2개의 노드가 공통 선행자를 갖지 않는다면, 그들은 독립적이며, 상이한 스레드에 맵핑될 양호한 후보이다.
재발생의 존재 시, 많은 노드는 1.0의 비율을 갖는다(그들은 모든 선임을 공유한다). 이러한 이슈를 해결하기 위해, 비율은 2회 계산되는데, 한번은 통상적인 것이고, 두 번째는 상이한 반복들(재발생) 사이의 의존성을 무시한다. 최종 비율은 이들 2개의 합산이다. 이것은 획득된 스레딩의 품질을 개선하며, 동시에 성능을 증가시킨다. 최종 비율은 매트릭스 M의 나머지 셀을 충진하는 데 이용된다. 이것의 의사 코드 표현은 도 10에 표현된다.
3개의 제시된 기준 중 임의의 것은 양호한 스레드를 생성하도록 턴 온/오프될 수 있다는 점에 유의하라.
매트릭스 M이 블록(940)에서 충진될 때, 현재 레벨은 블록(950)에서 증분되며, 노드는 블록(960)에서 축약된다. 이러한 축약(collapse)은 노드 쌍을 새로운 슈퍼노드에 접합시킨다. 각각의 노드 쌍에 대해, 노드 쌍이 조건 집합을 충족한다면, 그들은 축약된다. 예를 들어, 실시예에서, 주어진 노드에 대해, 축약에 대한 조건은 노드 i 또는 j 중 어느 것도 이전 레벨로부터 현재 레벨로 축약되지 않았다는 것이다. 다른 실시예에서, M[i, j]의 값은 임의의 k에 대해 M[i, k]보다 기껏해야 5% 더 작아야 하고, 임의의 하나의 노드에 대해 M[l, j]보다 기껏해야 5% 더 작아야 한다. 다시 말해, 유효 쌍은 높은 비율 값을 갖는 것들이며, 노드는 오로지 그것의 최상의 선택안보다 기껏해야 5% 악화된 다른 노드와 파트너가 될 수 있다. 유효 파트너를 갖지 않는 그러한 노드는 다음 레벨로 투영되며, 하나의 노드는 오로지 레벨 당 한번 축약될 수 있다.
축약 후, 반복 과정은 블록(930)에서 파티션의 수에 대한 판정으로 복귀한다.
매트릭스의 크기가 감소함에 따라, 노드가 (원래의 노드가 상주하는) 레벨 0으로부터 2개 이상의 노드를 포함할 수 있으므로, 레벨 0에서의 모든 의존성은 나머지 레벨로 투영된다. 예를 들어, 도 8에서 레벨 1의 노드 ab는 노드 a 및 b와 노드 b 및 d 사이에서 레벨 0의 모든 의존성에 의해 노드 cd에 접속될 것이다. 따라서, 매트릭스 M은 모든 레벨에서 당연히 충진된다.
조대화의 완료 시, 멀티-레벨 그래프가 블록(709)에서 형성되었다. 실시예에서, 이 멀티-레벨 그래프는 블록(711)에서 재평가되고 개선된다. 개선은, 또한 최상위 레벨로부터 최하위 레벨까지 멀티-레벨 그래프의 레벨을 순회하며, 각각의 레벨에서 하나의 노드로부터 다른 파티션으로 이동함으로써 보다 양호한 파티션을 찾고자 하는 반복 과정이다. 이동의 실례는 도 8에 도시되어 있는데, 레벨 2에서 노드 efg가 스레드 0 또는 1에 있어야 하는지에 대한 결정이 이루어진다. 개선은 조대화 동안에 발견된 이미 "양호한" 파티션을 개선함으로써 보다 양호한 파티션을 찾아낸다. 각 개선 시도에서 관찰된 파티션은 분해된 인스트럭션을 포함할 뿐 아니라 각각의 스레드 내의 모든 브랜치를 포함하여 그들의 제어 독립적 실행과 요구되는 모든 통신 및 피-슬라이스를 허용하도록 한다. 따라서, 그것은 컴파일러가 스레드간 의존성을 어떻게 관리할지를 결정하는 개선 과정 중에 있다.
각각의 레벨에서, 커니핸-린(Kernighan-Lin: K-L) 알고리즘은 파티션을 개선하는 데 이용된다. K-L 알고리즘은 다음과 같이 작용한다. 레벨 1에서의 각 슈퍼노드에 대해, 객체 함수를 이용한 다른 스레드 tid로의 이동 n의 이득 F(n, tid)이 계산된다. 하나의 스레드로부터 다른 스레드로의 슈퍼노드 이동은 그 슈퍼노드에 속하는 모든 레벨 0 노드를 이동시키는 것을 암시한다. 그러면, 최고 F(n, tid)를 갖는 슈퍼노드가 선택되고 이동된다. 이것은 모든 슈퍼노드가 이동했을 때까지 반복된다. 노드는 2회 이동할 수 없다는 것에 유의하라. 또한, 새로운 솔루션이 객체 함수에 기초하여 이전의 것보다 불량하다 하더라도 모든 노드가 이동한다는 것에 유의하라. 이것은 K-L 알고리즘이 국부적인 최적의 솔루션을 극복하게 한다.
일단 모든 노드가 이동했다면, 그 레벨에서 라운드(round)가 완료된다. 레벨이 N개의 노드를 포함한다면, 라운드 동안에는 N+1개의 솔루션(파티션), 즉 노드 이동 당 하나의 솔루션에 초기의 솔루션을 더한 것이 존재한다. 이러한 솔루션 중 최상의 것이 선택된다. 최상의 솔루션이 초기의 것과는 상이하다면(즉, 최상의 솔루션이 적어도 하나의 노드를 이동시키는 것을 수반했다면), 다른 라운드가 동일한 레벨에서 수행된다. 즉, 현재 레벨에서 더 양호한 솔루션이 발견되었기 때문에, 현재 레벨에서 다른 잠재적 이동(movement)이 조사된다. 상위 레벨에서의 이동은 하위 레벨에서의 노드를 드래그한다는 것에 유의하라. 따라서, 솔루션이 레벨 1에서 발견될 때, 이것은 레벨 l-1에서의 시작점이다. 이 방법론의 이점은, 양호한 솔루션이 상위 레벨에서 발견될 수 있다는 것으로, 이 레벨에서는 수 개의 노드가 존재하고 K-L 알고리즘이 훌륭하게 작용한다. 하위 레벨에서는, 흔히, K-L이 스크래치로부터 양호한 솔루션을 발견하기에는 너무 많은 노드가 있지만, 알고리즘이 이미 양호한 솔루션을 갖고 시작하기 때문에 하위 레벨에서의 태스크는 세립 개선을 제공할 뿐이다. 일반적으로, 이득의 대부분은 상위 레벨에서 달성된다. 따라서, 발견적 방법은 하위 레벨을 선회하는 것을 회피하기 위해 희망에 따라 알고리즘의 계산 시간을 감소시키는 데 이용될 수 있다.
따라서, 주어진 레벨에서, 각각의 노드 n을 다른 스레드로 이동시키는 이점은, 객체 함수를 이용하고, 이동 필터링하며, 스레드간 의존성을 관찰함으로써 이루어진다. 실시예에서, 객체 함수를 갖는 파티션을 평가하기 전에, 이동 필터링 및 스레드간 의존성 평가가 수행된다.
주어진 레벨에서 모든 노드를 이동시키려는 시도는, 특히 PDG에 많은 노드가 있을 때 희생이 크다. 노드는 먼저 스레드들 사이에서의 작업부하 균형을 개선하는 것과 관련하여 보다 큰 영향을 가지며 그리고/또는 스레드간 의존성을 갖는 것들로 필터링될 수 있다. 작업로드 균형을 개선하기 위해, 작업로드 균형을 도울 수 있는 상측의 K개의 노드에 중점을 둔다. 작업로드 균형은, 주어진 스레드에 할당된 동적 인스트럭션의 최대 추정 수를 추정된 동적 인스트럭션의 총 수로 제산하고 주어진 스레드에 할당된 동적 인스트럭션의 총 수로 제산함으로써 계산된다. 스레드들 사이의 양호한 균형은 0.5일 수 있다. 상측의 L개의 노드는 스레드간 의존성의 수를 감소시키는 데 사용된다. 실시예에서, L 및 K는 10이다.
하나의 움직임에 의해 도출되는 파티션을 평가하기 전에, 스레드간 의존성으로 무엇을 할 것인지 및 몇몇 인스트럭션이 복제되어야 하는지의 여부에 대한, 제어 흐름의 가능한 재정렬을 포함한, 결정이 이루어진다. 이들은 명시적으로 통신되거나 인스트럭션 복제로 사전 계산될 수 있다. 몇몇 제어 인스트럭션은 모든 요구되는 브랜치 인스트럭션이 그들을 필요로 하는 스레드에 있도록 하는 방법으로 스레드에서 복제되어야 한다.
특정 파티션을 평가하기 전에, 알고리즘은 스레드간 의존성을 어떻게 관리할 것인지를 결정한다. 그들은, (1) 명시적 스레드간 통신(통신은 명시적 전송/수신 인스트럭션으로 또는 인스트럭션 힌트에 의해 마킹될 수 있으며, (적어도 수신기 단에서) 스레드들 사이에 동기화를 도입할 수 있음)을 이용함으로써 이행될 수 있고, (2) 사전 계산 슬라이스(사전 계산 슬라이스는 의존성을 국부적으로 충족시키는 데 필수적인 최소 인스트럭션으로 이루어지며, 이러한 인스트럭션은 통신을 회피하기 위해 다른 코어 내로 복제될 수 있음)를 이용하여 그러한 의존성을 국부적으로 충족시킴으로써 이행될 수 있으며, 및/또는 (3) 그것이 매우 빈번한 경우에는 어떠한 의존성도 추측하지 않으며, 그것이 발생하는 경우에는 하드웨어가 잠재적 위반을 검출하도록 무시될 수 있다.
의존성을 통신하는 것은, 생산자(producer)가 그것의 대응 코어의 ROB의 헤드에 도달할 때 통신된 값이 공유 L2 캐시(하기에 설명됨)를 통과하므로 비교적 비싸다. 한편, 초과량의 복제 인스트럭션은 추론적 스레드의 실행을 지연시키게 될 수 있고, 마찬가지로 성능에 영향을 미칠 수 있다. 따라서, 각각의 스레드간 의존성에 대해 가장 적절한 대안의 선택은 성능에 미치는 영향을 가질 수 있다.
실시예에서, 의존성을 사전 계산하는 결정은 가중된 양의 복제될 인스트럭션이 특정 임계치를 초과하지 않는 경우에 긍정적으로 이루어진다. 이와 다른 경우, 의존성은 명시적 통신에 의해 충족된다. 500의 값이 본 출원인의 실험에서 양호한 임계치인 것으로 밝혀졌지만, 다른 환경 및 실시예에서는 다른 값이 더 적절한 것일 수 있다.
스레드간 의존성이 제공되면, 알고리즘은, 의존성을 충족시키는 것으로 추정된 동적 복제 인스트럭션의 양이 임계치를 초과하는 경우에 그것을 명시적으로 통신하도록 결정할 수 있다. 이와 달리, 의존성의 피-슬라이스는 목적 스레드에서 구성 및 복제될 수 있다.
각 영역에 대한 유효 임계치를 적절하게 정의하기 위해, 여러 대안 파티션이 복제 임계치 및 외부 루프의 전개 인자(unrolling factor)를 변형하는 멀티-레벨 그래프 파티셔닝 접근법에 의해 생성된다. 그러면, 최종 코드 생성을 위한 최상의 후보는 예상된 스피드업을 고려함으로써 선택될 수 있다. 최대 예상 능률촉진을 갖는 것이 선택된다. 타이의 경우, 스레드들 간에 보다 양호한 인스트럭션 균형화를 제공하는 대안이 선택된다.
개선 동안, 각각의 파티션(스레딩 솔루션)은 평가되어 다른 파티션과 비교되어야 한다. 객체 함수는 멀티-코어 프로세서의 타일에서 실행될 때 이 파티션에 대한 실행 시간을 추정한다. 실시예에서, 파티션의 실행 시간을 추정하기 위해, 프로파일링에 의해 획득된 영역의 20,000 동적 인스트럭션 스트림이 이용된다. 이 인스트럭션 시퀀스를 이용하여, 실행 시간은 데이터 의존성, 스레드들 간의 통신, 이슈 폭 리소스, 및 목표 코어의 ROB 크기를 고려한 간단한 성능 모델에 기초하여 최장 스레드로서 추정된다.
개선의 완료는 블록(713)에서 복수의 스레드가 최적 버전의 코드 영역을 나타내게 한다. 블록(715)에서, 스레드가 생성된 후, 컴파일러는 이들 스레드를 실행시킬 코드를 생성한다. 이러한 생성은, 적절한 포인트에서 스펀 인스트럭션을 삽입하는 것과, 로직 어드레스 공간의 상이한 영역 내의 상이한 스레드에 속하는 인스트럭션들을 맵핑하는 것과, 그에 따라 브랜치 오프셋을 조절하는 것을 포함한다.
분해된 인스트럭션 스트림으로부터의 순차적 실행 재구성(Reconstructing Sequential Execution From A Decomposed Instruction Stream)
전술된 바와 같이, 원래의 단일 스레드 애플리케이션은, 각각의 스레드가 원래의 순차적 애플리케이션의 전체 작동의 서브세트를 실행시키는 여러 추론적 스레드로 분해된다. 생성된 스레드가 대부분의 시간 동안 병렬로 실행될 수 있다 하더라도, 프로그램의 병렬화는 그것이 추론적으로 생성되었기 때문에 때때로 부정확할 수 있다. 따라서, 그러한 스레드를 실행시키는 하드웨어는 그러한 상황을 식별하고 복구할 수 있어야 한다. 이러한 하드웨어 메커니즘은 (예를 들어, 명시적 버퍼, 추가 상태에 따라 연장되는 메모리 계층 등을 이용하여) 추론적 상태를 유지시키도록 버퍼링하는 데 의존하며, 스레드에 할당된 인스트럭션의 순차적 순서를 판정하도록 하는 로직에 의존한다.
추론적 멀티-스레딩 실행의 순차적 순서를 판정/재구성하는 것은 스레드(들) 유효화 및 메모리 일관성에 필요하다. 프로그램의 결과에 영향을 미치는 순차적 순서 위반은 검출되고 정정되어야 한다(스레드 유효화). 예를 들어, 로드는 올바른 값을 생산한 저장(store)이 상이한 코어에서 실행되었기 때문에 실효 값(stale value)을 판독한다. 또한, 외부 디바이스 및 소프트웨어는 원래의 애플리케이션이 순차적 순서에서 실행된 것처럼 추론적 스레드의 실행을 보아야 한다(메모리 일관성). 따라서, 메모리 업데이트는 원래의 단일 스레드 애플리케이션이 실행되었을 경우와 동일한 순서로 네트워크 상호접속에 대해 가시적이어야 한다.
일 실시예에서, 추론적 멀티-스레딩은 전체 반복(또는 연속 반복의 청크)을 각각의 스레드에 할당함으로써 다중 루프 반복을 병렬 실행한다. 하나의 코어에 의해 반복 i로 실행된 스펀 인스트럭션은 다른 코어에서 반복 i+1을 실행하기 시작하는 새로운 스레드를 생성한다. 이 경우, 스퍼너 스레드에서 실행되는 모든 인스트럭션은 스퍼니에 의해 실행되는 것보다 오래된 것이다. 따라서, 순차적 순서를 재구성하는 것은 수월하며, 스레드는 그들이 생성되었던 것과 동일한 순서로 유효화된다.
세립 추론적 멀티-스레딩을 이용하는 실시예에서, 순차적 코드는 인스트럭션 단위로 스레드로 분해되며, 몇몇 인스트럭션은 2개 이상의 스레드에 할당될 수 있다(복제 인스트럭션이라고 지칭됨). 세립 추론적 멀티-스레딩을 이용하는 실시예에서, 명료성을 위해 2개의 코어에서 실행될 2개의 스레드를 가정하면, 스펀 인스트럭션이 실행되고, 스퍼너 및 스퍼니 스레드는 그들의 할당 인스트럭션 간의 어떠한 명시적 순서 없이 그 인스트럭션을 페치하고 실행하기 시작한다. 이러한 패러다임의 실례는 도 3에 도시되는데, 원래의 순차적 CFG 및 가능한 동적 스트림은 좌측에 도시되고, 가능한 스레드 분해는 우측에 도시된다. 2개의 주어진 인스트럭션들 사이의 순서를 아는 것은 사소한 것이 아니라는 점에 유의하라.
본 명세서에서 실시예는 세립 추론적 스레딩의 가정 하에 메모리 인스트럭션의 순차적 순서를 재구성하는 데 중점을 둔다. 그러나, 본 명세서에 소개되는 설명은 메모리 외에도 임의의 다른 프로세서 상태에 대한 순차적 정렬을 재구성하도록 외삽(extrapolate)될 수 있다. 병렬 실행 시, 프로세서 일관성을 지원하거나, 버그를 잡아내거나, 또는 프로그램을 분석하는 것을 포함하는 많은 이유로, 원래의 순차적 순서를 재구성할 수 있는 것은 유용하다. 그렇게 하기 위한 비용 효율적 메커니즘은, (1) (단지 수 비트일 수 있는) 간단한 POP 마크를 정적 인스트럭션의 서브세트(모든 인스트럭션이 반드시 마킹될 필요는 없으므로, 단지 희망 순서를 재구성하는 데 중요한 서브세트만)에 할당되는 특징, (2) 인스트럭션이 매우 작은 단위(개별 인스트럭션 레벨)로 다수의 스레드로 분해되었다 하더라도 순서를 재구성하는 특징 중 하나 이상을 포함할 수 있다.
본 명세서에서 사용되는 바와 같이, "스레드 순서"는 스레드가 자신의 할당된 인스트럭션을 보는 순서이고, "프로그램 순서"는 모든 인스트럭션이 원래의 순차적 스트림으로 보인 순서이다. 스레드 순서는, 각각의 스레드가 자신의 인스트럭션을 순서에 맞게 페치하고 커밋하기 때문에 재구성될 수 있다. 따라서, 스레드 정렬은 스레드에 의해 커밋된 모든 인스트럭션을 FIFO 큐(도 11에 예시됨) 내에 투입함으로써 충족될 수 있다. 즉, 스레드 순서에서 가장 오래된 인스트럭션은 FIFO의 헤드에 있는 것이고, 그 반면에 가장 최근의 것은 후미에 있는 것이다. 본 명세서에서, "순서", "순차적 순서" 및 "프로그램 순서"는 상호 교환가능하게 사용된다.
스레드로의 임의적 인스트럭션 할당은 인스트럭션이 적어도 하나의 스레드에 속해야 한다는 제약을 갖는 세립 멀티-스레딩에서 가능하다. 삭제된 인스트럭션(하드웨어 또는 소프트웨어 최적화에 의해 삭제된 인스트럭션)의 존재 시에 본 명세서에서 설명되는 것의 확장은 수월한데, 이는 재구성할 프로그램 순서가 그러한 삭제된 인스트럭션이 없는 원래의 순서이기 때문이다.
프로그램 순서는, 도 11에 도시된 바와 같이, 스레드 정렬 FIFO 큐를 POP 마크에 의해 특정되는 순서로 선택하는 스위치를 구비함으로써 재구성된다. 본질적으로, POP 마크는 언제 어떠한 스위치가 선택해야 하는지를 나타낼 수 있다. 각각의 FIFO 큐는 스레드 순서로 스레드에 할당된 정렬 인스트럭션을 갖는다. 메모리는 하나의 FIFO 큐로부터 POP 마크에 의해 조정된 다른 FIFO 큐로 스위치를 움직임으로써 프로그램 순서로 업데이트된다. 주어진 시점에서, 메모리는 대응하는 FIFO 큐의 제 1 정렬 인스트럭션을 갖도록 업데이트된다. 그러면, 그 인스트럭션은 그것의 큐로부터 팝핑(pop)되고, 그것의 POP 값은 스위치를 특정 FIFO 큐로 이동시키도록 판독된다.
순차적 프로그램 순서의 제 1 정렬 인스트럭션이 순서에 맞게 상주하는 곳은 시작점을 제공하기 위해 알려져야 한다. POP 포인터는 다음 정렬 인스트럭션의 특성을 설명할 수 있고, 첫 번째 것은 어떠한 전임 정렬 인스트럭션도 갖지 않는다. 이 시작 마크는 적어도 하나의 실시예의 경우에 레지스터에서 인코딩된다. 대안으로, 제 1 정렬 인스트럭션은 정정 FIFO 큐에 할당된다. 당업자라면, 제 1 마크를 정의하기 위한 그 밖의 많은 구현물이 설명된 실시예의 범주 내에 있다는 것을 파악할 것이다.
본 명세서에서 설명되는 메커니즘의 실시예를 이용하여, 메모리는 순차적 프로그램 순서로 업데이트될 수 있다. 그러나, 다른 실시예는 마크를 정정 프로그램에 추가함으로써 특정 순서가 보강될 임의의 병렬 패러다임으로 용이하게 확장될 수 있다.
다양한 실시예의 경우, 정렬 인스트럭션을 마킹할 개체는 컴파일러, 동적 이진 최적화기(Dynamic Binary Optimizer: DBO), 또는 일부 하드웨어일 수 있다. POP 마크에 의해 특정되는 스레드의 로직 식별자를 물리적 스레드(OS 스레드, 하드웨어 스레드, ...)에 맵핑할 개체는, 몇몇 실시예의 명칭으로, OS 또는 일부 하드웨어일 수 있다. 마크가 사용자 레벨 또는 OS 레벨에서 정의된다면, 그들은 인스트럭션 코딩의 일부 또는 사용자가 볼 수 있는 일부 하드웨어(메모리, 특정 사용자-가시적 버퍼 등)를 통해 시각적으로 표시될 수 있을 것이다. 마크가 하드웨어에 의해 정의되는 경우, 하드웨어는 프로그램의 정적 제어 흐름을 알고 있다고 가정한다. 따라서, 하드웨어에서 마크를 정의하는 적어도 몇몇 실시예의 경우, 제어 흐름의 하드웨어에 대한 정보를 알리기 위해 소프트웨어를 사용하는 하드웨어/소프트웨어 하이브리드 접근법을 이용한다.
제어 흐름이 없는 일부 코드(예를 들어, 기본 블록)에서는 저장 인스트럭션의 순서를 판정할 수 있다. 프로그램 순서에서 스레드 1에 할당된 다음 저장 Si +1 이전인, 스레드 0에 할당된 저장 Si는 다음 정렬 인스트럭션이 스레드 1에 할당되었다는 것을 의미하는 1의 POP를 가질 것이다. 이러한 POP는 임의의 종류의 코드(해먹, 루프, ...)의 존재 시에 적절한 순서를 마킹한다. 브랜치 인스트럭션은 2개의 POP로 마킹되는데, 하나는 브랜치가 선택될 때 프로그램 순서에서 다음 정렬 인스트럭션을 포함하는 스레드를 나타내고, 다른 것은 브랜치가 선택되지 않았을 때 동일한 것을 나타낸다. 마지막으로, 모든 저장 또는 모든 브랜치가, 스레드로의 인스트럭션 할당에 따라, POP에 의해 마킹될 필요가 있는 것은 아니다.
일반적으로, POP 마크가 하나의 FIFO 큐로부터 다른 FIFO 큐로의 변경을 나타내는 마크라면 단지 몇몇 인스트럭션 및 몇몇 브랜치만이 마킹되는데, 정렬 인스트럭션에 첨부된 POP 값이 없다면, 그것은 다음 정렬 인스트럭션이 동일한 FIFO 큐에 상주한다(동일한 스레드에 할당되었다)는 것을 의미한다. 그러나, 동종 마킹의 인스트럭션을 희망하는 하나 이상의 실시예에 대해 모든 정렬 인스트럭션이 마킹될 수 있다. 본 명세서에서 설명되는 예시적인 실시예의 경우, 모든 정렬 인스트럭션이 마킹될 필요는 없는 것으로 가정한다. 이것은, 샘플 실시예가 보다 복잡한 로직을 요구한다는 점에서, 모든 정렬 인스트럭션을 마킹하는 실시예의 슈퍼세트이다.
"위조(fake)" 정렬 인스트럭션은 구조적 부작용(architectural side effects)을 갖지 않는 것으로 설계될 수 있다는 것에 유의해야 한다. 대안으로, 실시예는, 이러한 효과가 제어 하에 있는 한, 구조적 부작용을 갖지 않는 "위조" 정렬 인스트럭션을 채용할 수 있다. 예를 들어, 그것은, 랙스(rax)가 대응하는 기본 블록에서 라이브-인(live-in)이 아니고 그것이 그 대응하는 기본 블록에서 다시 정의되는 경우, "and rax, rax"와 같은 인스트럭션일 수 있다.
다수의 스레드에 할당된 인스트럭션은, 전술된 바와 같이, "복제 인스트럭션"이다. 복제 인스트럭션을 관리하는 것은 수원한 방법으로 다루어질 수 있다. 동일한 인스트럭션의 개별 인스턴스들 간의 순서는, 나머지 정렬 인스트럭션에 관한 순서가 유지되는 한 무관하다. 따라서, 인스턴스들 간의 어떠한 임의의 순서가 선택될 수 있다. 필요한 POP 마크의 양을 최소화시키는 순서는, 이것이 실제로 이슈가 되는 경우에 이용될 수 있다. 예를 들어, 인스트럭션 I가 스레드 0, 1, 2에 할당되면, 3개의 인스턴스의 유효한 순서는 I0, I1, I2(번호가 스레드 식별자를 나타내는 경우) 또는 I2, I1, I0, 또는 POP 포인터가 이전 및 근간의 정렬 인스트럭션에 대해 정확하다면 임의의 다른 것이다.
최적 영역의 코드 생성 동안, 프로그램 순서 포인터(POPs)가 생성되어 최적 코드에 삽입된다. 세립 추론적 멀티-스레딩에서, 희망 순차적 순서를 재구성하는 데 유용한 인스트럭션의 상대적 순서가 마킹된다. 이러한 인스트럭션이 "정렬 인스트럭션"이다. 본 발명의 실시예가 메모리 정렬을 재구성하여 메모리를 정확하게 업데이트하고자 하므로, 저장 인스트럭션 및 브랜치는 정렬 인스트럭션의 실레이다. 정렬 인스트럭션은 순차적 프로그램 순서에서 다음 정렬 인스트럭션을 포함하는 스레드 ID를 코딩하는 N 비트(
Figure pct00002
은 스레드의 개수임)로 마킹될 수 이다. POP 마크는 인스트럭션 힌트로서 인스트럭션으로 인코딩될 수 있으며, 시스템이 POP 마크를 인스트럭션에 어떻게 맵핑하는지를 알고 있는 한 어느 곳에든 상주할 수 있다.
도 12는 최적 영역에 대한 POP 마크를 판정하는 방법의 실시예를 예시한다. 그 영역의 인스트럭션은 블록(1201)에서 분석된다. 이 인스트럭션은 최적 영역의 제 1 인스트럭션 또는 그 인스트럭션 후에 발생하는 몇몇 인스트럭션일 수 있다.
이 인스트럭션이 정렬 인스트럭션인지에 대한 판정이 블록(1203)에서 이루어진다. 그 인스트럭션이 정렬 인스트럭션이 아니면, 그것은 POP 마크를 수신하지 않을 것이며, 이것이 최적 영역의 마지막 인스트럭션인지에 대한 판정이 이루어진다. 몇몇 실시예에서는, POP 마크가 모든 인스트럭션에 대해 생성된다. 그 인스트럭션이 마지막 인스트럭션이 아니면, 그 영역의 다음 인스트럭션이 블록(1209)에서 분석된다.
그 인스트럭션이 정렬 인스트럭션이었다면, 블록(1211)에서 정렬 인스트럭션과 함께 순차적 순서로 다음 정렬 인스트럭션에 대한 영역이 분석된다. 그 후속 정렬 인스트럭션이 상이한 스레드에 속하는지에 대한 판정이 블록(1213)에서 이루어진다. 그 후속 정렬 인스트럭션이 상이한 스레드에 속한다면, 스레드 스위치를 나타내는 POP 마크가 블록(1217)에서 만들어지고, 그것이 스레드의 마지막 인스트럭션이었는지에 대한 판정이 블록(1205)에서 이루어진다.
후속 정렬 인스트럭션이 다른 스레드에 속하지 않았다면, 블록(1203)에서 발견된 이 이전 정렬 인스트럭션은 동일한 스레드에 속하는 것으로 마킹된다. 몇몇 실시예에서, 이 마킹은 "X"이고, 다른 실시예에서는 POP 마크가 이전의 정렬 인스트럭션과 동일하게 유지된다.
몇몇 실시예에서는 상이한 POP 값을 언제 할당할 것인지에 대한 사전 설정된 규칙이 있다. 예를 들어, 몇몇 실시예에서는, 스레드 Ti에 할당된 저장 인스트럭션 Si가 주어지면, (1) Si는 사이에 어떠한 브랜치도 갖지 않으며 스레드 Ti와는 상이한 스레드 Tj에 할당되는, Si 다음의 저장 Sj가 존재하는 경우에 POP 값 Tj로 마킹될 것이고, (2) Si는 스레드 Ti와는 상이한 스레드 Tj에 할당된 다음 브랜치 B와 Si 사이에 어떠한 다른 저장 S도 없는 경우에 POP 값 Tj로 마킹될 것이며, (3) 이와 다른 경우, 저장 Si를 마킹할 필요가 없다.
몇몇 실시예에서, 스레드 Ti에 할당된 조건부 브랜치 인스트럭션 Bi가 주어지면, (1) Bi는 브랜치가 선택될 때(그것은 브랜치 또는 저장일 수 있음) 다음 정렬 인스트럭션이 Ti와는 상이한 Tj에 할당되는 경우에 그것의 선택된 POP 마크 내의 POP 값 Tj로 마킹된다. 이와 달리, 선택된 POP 마크가 Bi에 할당될 필요가 없다면, (2) Bi는 브랜치가 선택될 때(그것은 브랜치 또는 저장일 수 있음) 다음 정렬 인스트럭션이 Ti와는 상이한 Tj에 할당되는 경우에 그것의 폴스루(fallthru) POP 마크 내의 POP 값 Tj로 마킹된다. 그렇지 않은 경우, 폴스루 POP 마크를 Bi에 할당할 필요가 없다.
몇몇 실시예에서, 스레드 Ti에 할당된 무조건적 브랜치 Bi가 주어지면, 조건부 브랜치와 동일한 알고리즘이 적용되지만, 선택된 POP 값의 계산만이 이루어진다.
몇몇 실시예에서, N개의 가능한 경로 P1...Pn을 갖는 간접 브랜치 다음에 오는 Ti에 정렬 인스트럭션이 주어지고, 그 사이에 어떠한 정렬 인스트럭션도 없다면, 다음 정렬 인스트럭션이 Ti와는 상이한 스레드 Tj에 속하는 경로 Pk는 POP 값 Tj와 함께 Ti 내의 "위조" 정렬 인스트럭션을 실행시킬 것이다. 위조 정렬 인스트럭션은 단지 정렬 일관성을 유지시키고자 하는 하나의 목적을 갖는 인스트럭션이다. 그것은, 특정 인스트럭션 또는 구조적 부작용을 갖지 않는 경우의 일반적인 오피코드일 수 있다.
도 13은 해먹을 갖는 루프를 이용하는 실례를 예시한다. 이 실시예에서, 프로그램 순서는 재구성될 수 있으며, 정렬 인스트럭션은 저장 및 브랜치이다. 간소성을 위해, 정렬 인스트럭션만이 도시되어 있지만, 당업자라면, 다른 인스트럭션이 존재함을 인지할 것이다. 도 13에 예시된 정렬 인스트럭션은 그들이 각각 스레드 0에 할당되었는지 아니면 1에 할당되었는지를 나타낼 시에 마킹된다. 조건부 브랜치는 2개의 POP 마크를 갖는 반면, 저장 및 무조건적 브랜치는 오직 하나만을 갖는다. POP 마크 "X"는, 이 마크가 필요하지 않다는 것을 의미한다. POP 마크 "?"는, 완전한 제어 흐름이 도시되어 있지 않기 때문에 알려져 있지 않다는 것을 의미한다. 우측 아래에는 루프가 2회 실행될 때 프로그램 순서가 어떻게 재구성되는지가 도시되어 있는데, 각각의 반복은 해먹의 상이한 경로를 추종한다. 간소성을 위해, 코드는 2개의 스레드로 분해되지만 메커니즘은 충분한 비트가 POP 마크에 제공됨에도 불구하고 임의의 수의 스레드로 작용하게 하고자 하는 것으로 가정한다. 또한, 정렬 인스트럭션만이 설명된다.
저장 인스트럭션 S5는 양측 스레드에 할당되었고, 2개의 POP 마크를 갖는다. 모든 다른 저장은 하나의 POP 마크를 갖는다. 무조건적 브랜치도 하나의 마크(취해진 하나의 T)를 갖는다. 조건부 브랜치는 2개의 POP 마크를 갖는데, 하나는 취해진 것(T)에 대한 것이고, 다른 하나는 취해지지 않은 것(NT)에 대한 것이다. 제 1 인스트럭션, 저장 S1은 스레드 0에 할당되며, 순차적 순서에서 다음 정렬 인스트럭션 S2가 스레드 1에 할당되므로 1의 POP 값을 갖는다. 저장 S3은 순차적 순서에서 다음 정렬 인스트럭션이 동일한 스레드 0에 할당되기 때문에 POP 값을 필요로 하지 않는다(따라서, "X"). 따라서, 하나의 FIFO 큐로부터 다른 것으로의 변경을 나타내는 마크를 인코딩할 필요가 없다. 조건부 브랜치 B1은, 브랜치가 취해질 때 다음 정렬 인스트럭션이 동일한 스레드 0에 할당되기 때문에, 선택된 POP 값을 필요로 하지 않는다. 그러나, B1은, 브랜치가 선택될 때 다음 정렬 인스트럭션 S6이 다른 스레드에 할당되었기 때문에, 선택된 POP 값을 필요로 하지 않는다. 다른 특정 경우로서, 저장 S5는 양측 스레드에 할당되지 않았다(그것은 복제되었다). 이 경우, 그것의 2개의 인스턴스들 사이의 순서는 관련되지 않는다. 도면에서, 스레드 0에서 S5의 인스턴스는, POP 포인터를 스레드 0에서 저장 S4에 할당하지 않음으로써 또한 POP 포인터 1 및 0을 스레드 1 및 1에서의 S5에 각각 할당함으로써 스레드 1에서의 인스턴스 전에 온다. 그러나, 그것은 POP 값이 상이할 것이라 하더라도 주위의 다른 방법이었을 수 있다.
도 13의 우측 아래 부분은, 프로그램이 {기본 블록 A, B, C, E, B, D, E ...}로 구성된 실행 스트림을 따른다고 가정하면, 정렬 인스트럭션들이 POP 포인터를 이용하여 어떻게 관련되는지를 예시한다. 도면의 이 부분에서, 박스 X의 중앙으로부터 출발하는 라인은 "X에서 인스트럭션을 실행한 후"를 의미하며, 박스 X의 시작부에 도달하는 화살표는 "X에서 인스트럭션을 실행하기 전"을 의미한다. 이 프로그램 흐름은 루프를 통해 2회 실행되는 것을 포함하는데, 루프를 통과하는 각각의 반복은 해먹의 상이한 경로르 추종한다. 따라서, 전역적 순서는 S1, S2, S3, B1, S4, S50, S51, B2, S7, S8, B4, S2, B1, S6, ...이다.
전술된 것은, 적절한 순차적 프로그램 순서로 메모리를 업데이트하기 위해 스레드에 임의적으로 할당된 저장 인스트럭션 및 브랜치를 마킹하는 실시예이다. 적어도 하나의 실시예에서, 분해된 스레드는 인스트럭션 레벨에서 구성되어, 멀티-코어 설계에서 단일 스레드 성능을 개선하도록 코어의 실행을 결합시킨다. 컴파일 시간에 생성된 스레드의 실행을 지원하는 하드웨어 메커니즘의 실시예는 하기에 상세히 설명된다. 이러한 스레드는 원래의 애플리케이션의 세립 추론적 분해로부터 비롯되며, 그들은 수정된 멀티-코어 시스템 하에서 실행되는데, 이러한 시스템은, (1) 스레드들 간의 위반을 검출하는 메커니즘, (2) 원래의 순차적 순서를 재구성하는 메커니즘, 및 (3) 추론오류(misspeculation)을 처리하기 위한 체크포인팅 및 복구 메커니즘을 포함한다.
실시예는 멀티-코어 시스템에서 단일 스레드 애플리케이션을 세립 형태로 분해함으로써 속도를 증가시킨다. 컴파일러는 인스트럭션을 단일 스레드 애플리케이션 또는 병렬 애플리케이션의 순차적 영역으로부터 추론적 멀티-스레딩을 지원하는 멀티-코어 시스템에서 병행하여 실행될 수 있는 스레드로 분배하는 일을 담당한다. 당업자라면, 이것이 병행 코드를 부여 받은 임의의 종류의 순서를 재구성하도록 확장될 수 있다는 것을 인지할 것이다. 몇몇 대안의 실시예는, (1) 제어 흐름을 재구성하는 것(정렬 인스트럭션은 오로지 브랜치임), (2) 전체 프로그램 흐름을 재구성하는 것(모든 인스트럭션은 정렬 인스트럭션이며, 할당된 POP 마크를 가져야 함), (3) 메모리 흐름을 재구성하는 것(브랜치, 로드 및 저장은 정렬 인스트럭션임), (4) 병렬 프로그램의 인스트럭션의 특정 순서를 보강하여, 그것을 유효화, 디버깅, 테스트 또는 조정하는 것(이전의 병렬 코드로부터 출발하여, 사용자/컴파일러/분석 툴은 POP 마크를 인스트럭션들 간에 특정 순서를 보강하기 위한 인스트럭션으로 마킹하고, 프로그램의 순차적 뷰가 각각의 지점에서 어떻게 보이는지를 알게 함)을 포함하지만, 이러한 것으로 제한되는 것은 아니다.
POP 마크를 이용하여 흐름을 재구성하도록 하는 방법의 실시예는 도 14에 예시된다. 전술된 바와 같이, 프로그램 흐름을 재구성하는 데 이용되는 정렬 인스트럭션은 저장 및 브랜치이다. 블록(1401)에서, 프로그램은 복수의 코어를 이용하여 추론적으로 실행된다. 이 실행 동안, 각 스레드의 인스트럭션은 그들이 할당된 스레드에서 국부적으로 퇴거되고, ICMC를 통해 MLC에 의해 전역적으로 퇴거된다.
블록(1403)에서, 흐름(프로그램, 제어, 메모리 등)이 복구되거나 재구성되어야 한다는 조건이 발견된다. 예를 들어, 최적 영역을 실행하는 코어들 사이의 일관되지 않은 메모리 값이 발견되었다. 물론, 흐름은 실행 중에 발견된 조건이 아닌 미세 조정과 같은 다른 이유로 재구성될 수 있다.
블록(1405)에서, 제 1의(가장 오래된) 정렬 인스트럭션이 하기의 적절한 FIFO(이러한 FIFO는 memFIFO 또는 메모리 FIFO 큐라고 호칭됨)로부터 검색되고, 프로그램이 실행됨에 따라 파퓰레이트된다. 이 인스트럭션의 위치는 전술한 방법들 중 하나에 의해 나타내어질 수 있다. 실례로서 먼저 설명되는 해먹을 갖는 루프를 이용하여, 제 1 인스트럭션은 s1을 저장하며, 그것은 스레드 0에 속한다. 인스트럭션이 퇴거됨에 따라, 그것의 POP 값(들)을 포함하는 인스트럭션이 적절한 FIFO 또는 흐름을 구성하는 메커니즘에 의해 식별되는 다른 위치에 저장된다.
블록(1407)에서, 그 인스트럭션의 POP 값이 판독된다. 또한, 도 4를 참조하면, 저장 s1에 대한 POP 마크 값은 "1"이다.
이것이 마지막 정렬 인스트럭션인지에 대한 판정이 블록(1409)에서 이루어진다. 그러한 경우, 흐름이 판정되었다. 그렇지 않은 경우, FIFO를 스위치할 것인지에 대한 판정이 블록(1411)에서 이루어진다. POP 값이 이전에 검색된 인스트럭션의 스레드와 상이하다면 스위치가 이루어진다. 이전의 실례에서, "1"의 판독 값은, 스레드 1에 속하는 다음 프로그램 흐름 인스트럭션이 스레드 0에 속하는 저장 s1 인스트럭션과는 상이하다는 것을 나타낸다. 값이 X였다면, 그것은, 다음 프로그램 흐름 인스트럭션이 동일한 스레드에 속하고 어떠한 FIFO 스위치도 없을 것이라는 것을 나타낸다. 이전의 실례에서, 이것은 저장 s3 브랜치가 검색된 후에 발생한다.
스위치가 이루어져야 한다면, POP 값에 의해 나타내어지는 FIFO가 선택되며, 그 FIFO 내의 가장 오래된 인스트럭션이 블록(1413)에서 그것의 POP 값과 함께 판독된다. 어떠한 스위치도 이루어지지 않는다면, FIFO는 스위치되지 않으면, 다음으로 가장 오래된 인스트럭션이 블록(1415)에서 FIFO로부터 판독된다. 인스트럭션을 판독하고 판독된 POP 값에 기초하여 FIFO를 스위칭하는 과정은, 프로그램 흐름이 재생산되었거나 FIFO가 소모될 때까지 계속된다. 실시예에서, FIFO는 그들이 소비되면 (메인 메모리와 같은) 다른 저장 위치로부터 보충된다. 실시예에서, 프로그램의 실행은 흐름을 이용하여 어디에서 프로그램의 실행을 재시작할 것인지를 판정함으로써 계속된다.
실시예에서, 하기에 설명되는 ICMC는 상기의 방법을 수행한다. 다른 실시예에서, 소프트웨어 루틴은 상기의 방법을 수행한다.
멀티-코어 추론적 멀티-스레딩 프로세서 및 시스템의 실시예
도 15는 스레드 정렬 재구성 메커니즘의 실시예가 채용될 수 있는 멀티-코어 시스템의 실시예를 예시하는 블록도이다. 용이하게 참조할 수 있도록 간략하게 되었지만, 도 15의 시스템은 도 15에 명시적으로 예시되지는 않았으나 추가 구성요소를 가질 수 있다.
전술된 바와 같이, 세립 SpMT 에코시스템에서, 프로그램은 하나 이상의 프로세싱 코어 상에서 실행될 하나 이상의 스레드로 분리된다. 이러한 프로세싱 코어는 각각 스레드를 처리하며, 이 프로세싱의 결과는 병합되어 프로그램이 단일 코어에서 단일 스레드로서 실행된 것과 동일한 결과를 생성한다(그럼에도 불구하고 분리 및/또는 병렬 실행은 더욱 신속해야 한다). 상이한 코어에 의한 이러한 프로세싱 동안, 실행의 상태는 추론적이다. 스레드가 그들의 마지막 인스트럭션에 도달할 때, 그들은 최적 영역으로 나강도록 동기화되고, 추론적 상태는 비추론적이 되며, 실행은 하나의 단일 스레드로 계속되고, 타일은 그 프로그램 동안에 단일 코어 모드를 재개한다. 본 명세서에서 사용되는 바와 같은 "타일"은 도 15와 관련하여 하기에 더욱 상세히 설명된다. 전반적으로, 타일은 다른 경우의 순차적 인스트럭션의 세트 중 상이한 부분들(그럼에도 불구하고 "상이한" 부분들은 복제 인스트럭션을 포함할 수 있다)을 동시에 실행시키도록 작동하는 2개 이상의 코어의 집합이다.
도 15는 논리적으로 2개의 타일(1530, 1540)로 분리되는 멀티-코어 시스템을 예시한다. 적어도 하나의 실시예의 경우, 시스템의 프로세싱 코어(1520)는 x86 아키텍처에 근간을 둔다. 그러나, 프로세싱 코어(1520)는 PowerPC 등과 같은 임의의 아키텍처의 것일 수 있다. 적어도 하나의 실시예의 경우, 시스템의 프로세싱 코어(1520)는 인스트럭션을 규칙으로부터 벗어나 실행한다. 그러나, 이러한 실시예는 제한하는 것으로 받아들여져서는 안 된다. 본 명세서에서 설명되는 메커니즘은 마찬가지로 인스트럭션을 순서대로 실행시키는 코어에도 적용 가능한 것일 수 있다. 적어도 하나의 실시예의 경우, 타일(1530, 1540) 중 하나 이상은 비밀의 제 1 레벨 라이트-스루(write-through) 데이터 캐시("DCU") 및 인스트럭션 캐시("IC")를 갖는 2개의 코어(1520)를 구현한다. 이러한 캐시 IC 및 DCU는 분리 교류 버스(split transactional bus)(1560)를 통해 공유 복제-백(copy-back) L2(1550) 캐시에 연결된다. 마지막으로, L2 캐시(1550)는 다른 상호접속망(1570)을 통해 메인 메모리(1580) 및 타일(1530, 1540) 중 나머지 타일에 연결된다.
L2 캐시(1550)는 MLC("Merging Level Cache")라고 호칭되며, 타일의 코이들 사이의 공유 캐시이다. 도 15에 예시된 실시예의 경우, 제 1 레벨의 공유 캐시는 2-레벨 캐시이다. 그것은 프로세싱 코어들(스레드들) 간의 병합이 수행되는 이 병합 레벨 캐시에 있다. 그러나, 다른 실시예의 경우, L2 캐시는 반드시 타일의 코어들 간의 병합 레벨 캐시일 필요는 없다. 다른 실시예에서, MLC는 임의의 레벨의 메모리 계층에 있는 공유 캐시일 수 있다.
적어도 하나의 실시예의 경우, 도 15에 예시된 타일(1530, 1540)은 2개의 상이한 동작 모드, 즉 단일-코어(정상) 모드 및 협력 모드를 갖는다. 타일 내의 프로세싱 코어(1520)는, 타일이 단일-코어 모드에 있을 때에는 통상적인 스레드를 실행하고, 타일이 협력 모드에 있을 때에는 동일한 분해된 애플리케이션으로부터의 추론적 스레드(각 코어에서 하나)를 실행한다.
최적 코드의 실행은 스레드를 갖는 타일에 대한 협력 모드에서 수행되어야 한다는 것에 유의해야 한다. 따라서, 이러한 2개의 스레드가 최적 코드를 실행하기 시작하고 스펀 인스트럭션이 트리거할 때, 코어는 단일-코어 모드로부터 협력-코어 모드로 전이한다.
2개의 추론적 스레드가 활성된 협력 모드로 타일(예컨대, 1530 또는 1540)에서 실행되고 있을 때, 그들 간의 동기화는 스레드간 의존성이 명시적 통신에 의해 충족되어야 하는 경우에 일어난다. 그러나, 통신은 오로지 소비자 측에서만 동기화를 암시할 수 있다. 정규 메모리 또는 전용 로직이 이러한 통신에 이용될 수 있다.
정상 실행 모드 또는 정상 모드(또는 단일 모드)는, 프로세싱 코어가 비추론적 멀티-스레딩 코드를 실행하고 있고 그 동안에 타일 내의 다른 프로세싱 코어는 유휴 상태이거나 다른 애플리케이션을 실행하고 있을 때이다. 예를 들어, 타일(1530)의 프로세싱 코어 0은 비추론적 멀티-스레딩 코드를 실행하고 있고, 코어 1은 유휴 상태이다. 추론적 실행 모드 또는 추론적 모드는, 양측의 코어가 추론적 멀티-스레딩 코드를 실행하도록 협력하고 있을 때를 지칭한다. 정상 또는 추론적 모드에서, 각각의 코어는 인스트럭션을 독립적으로 페치하고, 실행하며, 퇴거시킨다. 추론적 모드에서, 체크포인트(이후에 설명됨)는, 메모리 위반이 발견되면 이전의 일관적 상태로의 태팅 롤백(tat rollback)이 이루어질 수 있도록 규칙적인 간격으로 취해진다.
프로세싱 코어는 일단 코어가 스펀 인스트럭션을 퇴거시키면 정상 모드로부터 추론적 모드로 전이한다(다른 코어가 유휴 상태라고 가정하면, 실행은 정상 모드에서 재개된다). 반면, 프로세싱 코어는, 애플리케이션이 스레드로 분해되지 않은 코드 영역으로 점프하거나 메모리 위반이 검출될 때 추론적 모드로부터 정상 모드로 전이한다. 메모리 위반은, 하나의 코어에서 실행하고 있는 로드가 다른 코어에서 실행되는 저장에 의해 생성된 데이터를 필요로 할 때 발생한다. 이것은, 시스템이 상이한 스레드에 할당된 인스트럭션들의 실행 간의 순서를 보증할 수 없기 때문에 발생한다. 메모리 위반의 존재 시, ICMC에 의해 생성된 스쿼시 신호는 모든 코어 및 캐시에 전달되며, 상태는 이전의 일관된 상태로 롤백되고 실행은 정상 모드에서 재개된다.
구조적 메모리 상태를 업데이트하고 원래의 순차적 프로그램 순서에서 잠재적 메모리 위반을 체크하기 위해, 원래의 프로그램 순서의 재구성이 이루어진다. 실시예에서, 이것은 하기에 더 상세히 설명되는, 대응하는 FIFO 구조물에 각각의 프로세싱 코어의 모든 국부적으로 퇴거된 메모리 인스트럭션을 투입하고, 몇몇 인스트럭션 마크에 의해 원래의 순차적 프로그램 순서로 그러한 큐 내의 헤드 인스트럭션을 액세스하고 제거함으로써 이루어진다. 인스트럭션이 프로세싱 코어에서 퇴거될 때는, 이것이 그 프로세싱 코어에서 가장 오래된 인스트럭션이고 그것의 대응하는 FIFO의 후미에 놓인다(국부적 퇴거라고 지칭됨)는 것을 의미한다. 메모리 계층은 계속해서 시스템에서 (FIFO 중 임의의 FIFO의 헤드에 상주하는) 가장 오래된 인스트럭션을 얻고 순차적 프로그램 순서로 MLC 및 그것의 관련 비트애 액세스한다(인스트럭션의 전역적 퇴거라고 지칭됨).
도 16은 협력 모드에서 동작하는 타일의 실례를 예시한다. 이 도면에서, 인스트럭션 3 및 4는 각각 코어 1 및 0에서 국부적으로 퇴거되고 있다. ICMC는 프로그램 순서로 전역적으로 커밋된 인스트럭션 0, 1 및 2를 가지며, 그에 따라 MLC를 업데이트할 것이다. ICMC는 또한 메모리 위반을 체크할 것이다.
분해된 스레드를 지원하는 코어간 메모리 일관성 모듈 (Inter-Core Memory Coherency Module: ICMC)은, (1) 다른 타일에 대해 가시적인 분해된 애플리케이션에 의해 변경이 순차적으로 실행된 것처럼 이루어지도록 하는 메모리 동작을 분류하는 것, (2) 타일의 코어 상에서 실행되는 스레드들 간의 메모리 의존성 위반을 식별하는 것, (3) 메모리 및 레지스터 체크포인트를 관리하는 것, 및/또는 (4) 예측 오류, 제외 또는 인터럽트의 경우에 코어 내부에서 롤백 메커니즘을 트리거하는 것 중 하나 이상을 제어할 수 있다.
적어도 하나의 실시예의 경우, ICMC는 프로세싱 코어와 거의 간섭하지 않는다. 따라서, 프로세싱 협력 모드에서, 코어는 대부분의 시간 동안 분리된 방법으로 추론적 스레드로부터의 인스트럭션을 페치하고, 실행하며 퇴거시킨다. 그러면, 인스트럭션의 서브세트는, 그들이 실행의 유효화를 수행하기 위해 퇴거된 후에 ICMC로 전송된다. 적어도 하나의 실시예의 경우, ICMC에 의해 고려되는 인스트럭션의 세트는 메모리 및 제어 인스트럭션으로 제한된다.
협력 모드에서 실행할 때, ICMC는, 메모리 위반을 검출하고 메모리를 정확하게 업데이트하기 위해, 추론적 스레드에 임의적으로 할당된 메모리 인스트럭션의 원래의 순차적 순서를 재구성한다. 이러한 순서는 프로그램 순서 포인터(POP) 비트를 호출한 마크를 이용하여 ICMC에 의해 재구성된다. POP 비트는 컴파일러에 의해 메모리 인스트럭션 및 소정의 무조건적 브랜치에 포함된다.
추론적 멀티-스레딩을 위한 예시적인 메모리 계층
도 17은 본 발명의 적어도 하나의 실시예에 따라 추론적 멀티-스레딩을 지원하는 예시적인 메모리 계층을 예시하는 블록도이다. 정상 동작 모드(비추론적)에서, 메모리 계층은 정규 계층의 작용을 한다. 즉, 통상적인 메모리 계층 프로토콜(MESI 또는 임의의 다른 프로토콜)은 필요에 따라 캐시 라인을 지연시키고 무효화한다.
도 17의 계층은 하나 이상의 프로세싱 코어(코어(1701, 1703))를 포함한다. 계층의 각 프로세싱 코어는 도면에서 "L1"로 표기된 비밀의 제 1-레벨 데이터 캐시 유닛(data cache unit: DCU)을 갖는다. 프로세싱 코어는 또한 적어도 하나 더 높은 레벨 캐시를 공유한다. 예시된 실시예에서, 프로세싱 코어(1701, 1703)는 제 2-레벨 데이터 캐시(1709) 및 마지막-레벨 캐시 "L3"을 공유한다. 계층은 또한 메인 메모리(1713)와 같은 메모리, 및 하드디스크, 광 드라이브 등과 같은 기타의 저장소도 포함한다. 또한, 계층은 타일 내부에서 코어가 협력 모드에서 실행할 때 코어의 활성화를 제어하는 일을 담당하는 코어간 메모리 일관성 모듈(ICMC)(1715)을 호칭하는 구성성분을 포함한다. 이 모듈은, 회로, 소프트웨어, 또는 이들의 조합일 수 있다. 메모리 계층의 이러한 예시적 구성 소자 각각은 하기에서 상세히 설명된다.
데이터 캐시 유닛(Data Cache Units: DCUs)
정상 모드에서 동작할 때, DCU는 라이트-스루이며, 정규 L1 데이터 개시로서 동작한다. 추론적 모드에서, 그들은 라이트-스루도 라이트-백(write-back)도 아니며, 교체된 오염된 라인은 폐기된다. 또한, 수정된 값은 전달되지 않는다. 정상 모드로부터의 이러한 변경은 병합 때문에 버전화(versionning)을 허용하며, 이후에 설명되는 궁극적으로 정확한 값이 병합 레벨 캐시("MLC")에 상주할 것이다.
실시예에서. DCU는 추론적 모드 및 모드들 사이에서의 전이 때에만 이용되는 라인 당 버전화된 비트("V")를 포함함으로써 확장된다. 이 비트는 현재의 추론적 멀티-스레딩 코드 영역을 실행하는 동안에 업데이트된 라인을 식별한다. 구현물에 따라, 추론적 모드에서, 라인이 수정될 때, 그것의 버전화된 비트는 변경을 나타내도록 하는 것으로 설정된다. 물론, 다른 구현물에서, 0의 버전화된 비트 값은 변경이 없다는 것을 나타내는 값과 동일한 것을 나타내는 데 사용될 수 있다.
정상 모드로부터 추론적 모드로의 전이 시, V 비트는 어떠한 변경도 이루어지지 않았음을 나타내는 값으로 재설정된다. 추론적 모드로부터 정상 모드로의 전이 시, 변경된 라인을 나타내는 것으로 설정된 버전화된 비트를 갖는 모든 라인은 무효인 것으로 수정되며, 버전화된 비트는 재설정된다. 이러한 전이는, 영역의 종단을 마킹하는 인스트럭션이 전역적으로 퇴거되거나 스쿼시 신호(스쿼시 신호는 후술됨)가 ICMC에 의해 상승할 때 발생한다.
추론적 모드에서, 각각의 DCU는 독립적으로 작용하며, 그에 따라 각각의 DCU는 각 데이터의 잠재적 버전을 갖는다. 따라서, 수정된 값은 더 높은 레벨의 캐시로 전달되지 않는다. MLC는 상이한 DCU 캐시 라인 값들 사이에서 병합이 수행되는 레벨이며, 그것은 이전 섹션에서 설명된 바와 같이, 원래의 순차적 프로그램 언어를 추종하여 이루어진다. 추론적 모드로부터 정상 모드로의 전이 시, 유효 라인은 MLC에만 상주한다. 따라서, 추론적 라인은 DCU에서 소거된다. 저장 동작은 그들이 전역적으로 커밋될 때 원래의 순서로 L2 캐시를 업데이트하는 일을 담당하는 ICMC로 전송된다.
병합 레벨 캐시(Merging Level Cache)
실시예에서, L2 캐시(1709)는 프로세싱 코어들 사이의 공유 캐시인 MLC로서 기능한다. 그러나, 다른 실시예의 경우, L2 캐시는 반드시 프로세싱 코어들 사이의 병합 레벨 캐시일 필요는 없다. 다른 실시예의 경우, MLC는 메모리 계층의 다른 레벨에 있는 공유 캐시이다.
예시된 바와 같이, MLC는 캐시 라인 당 추론적("S") 비트 및 청크 당 2개의 최종 버전("LV") 비트(물론, 더 많은 프로세싱 코어에 대해서는 더 많은 LV 비트가 있을 것임)의 함유에 의해 일반적인 캐시로부터 확장된다. 청크는 2개의 추론적 스레드들 사이의 메모리 불명확성이 검출되는 단위(granularity)이다. 그것은 라인의 크기와 바이트 사이의 범위를 가질 수 있으며, 정확성과 면적 사이의 트레이드오프이다.
S 비트는 캐시 라인이 추론적 상태를 포함한다는 것을 나타낸다. 그것은, 하기에 설명되는 바와 같이, 체크포인트가 수행되고 메모리가 다시 안전한 때에 소거된다. 반면, LV 비트는 어떤 코어가 각 청크로의 최종 변경을 수행했는지를 나타낸다. 예를 들어, 실시예에서, 라인의 첫 번째 청크에 대한 "01"의 LV 값은 코어 1이 그 청크에 대한 변경을 수행했다는 것을 나타낸다. 이러한 비트는 저장(store) 인스트럭션이 전역적으로 퇴거됨에 따라 설정되고, (체크포인트들 사이에서 소거되는 S 비트와는 반대로) 정상 모드로의 재-전이가 있을 때까지는 소거되지 않는다. 전역적 퇴거는 원래의 프로그램 순서로 수행된다. 또한, 저장(store)은 그들이 복제되었는지 아닌지의 여부를 식별하도록 태그된다. 이것은 시스템이 메모리 위반을 포착할 수 있다는 것을 보증하는 데 도움이 된다. 모든 라인에 대한 LV 비트는 임의의 코어로부터의 판독이 정확하다는 것을 나타내도록 디폴트로 설정된다.
저장(store)이 최적 모드에서 전역적으로 퇴거될 때 발생하는 작용의 방법에 대한 실시예는 도 18에 예시된다. 블록(1801)에서는 저장이 MLC를 누락했는지(즉, 그것이 L2 캐시 누락이었는지)에 대한 판정이 이루어진다. 저장이 누락되었다면, 전역적 퇴거는 블록(1803)에서 라인이 MLC에 존재할 때까지 스톨링(stall)된다. 저장이 MLC에 존재했다면(또는 라인이 MLC에 도달할 때), 블록(1805)에서 라인이 오염되었는지에 대한 판정이 이루어진다. 그것이 비추론적 데이터로 오염되었다면(예컨대, S 비트가 비설정되었다면), 라인은 블록(1807)에서 메모리 계층 내의 다른 레벨로 다시 기록된다. 그럼에도 불구하고, 데이터는 블록(1809)에서 수정되고, S 비트는 1로 설정된다.
저장이 복제되었는지에 대한 판정이 블록(1811)에서 이루어진다. 저장이 복제되지 않았다면, 블록(1813)에서, 각각의 수정된 청크에 대응하는 LV 비트는 저장을 수행하는 코어에 대해서는 1로 설정되고 다른 것에 대해서는 0으로 설정된다. 저장이 복제되었다면, 블록(1815)에서 다른 판정이 이루어진다. 이러한 판정은 저장이 첫 번째 복제본이었는지의 여부에 대한 것이다. 저장이 복제되고 그것이 첫 번째 복제본이라면, 블록(1813)에서, 각각의 수정된 청크에 대응하는 LV 비트는 저장을 수행하는 코어에 대해서는 1로 설정되고 다른 것에 대해서는 0으로 설정된다. 저장이 복제되고 그것이 첫 번째 복제본이 아니라면, 블록(1817)에서, 각각의 수정된 청크에 대응하는 LV 비트는 저장을 수행하는 코어에 대해서는 1로 설정되고, 다른 것에 대해서는 그대로 유지된다.
로드(load)가 최적 모드에서 전역적으로 퇴거되려고 할 때 발생하는 작용의 방법에 대한 실시예는 도 19에 예시된다. 블록(1901)에서는 로드가 MLC를 누락했는지에 대한 판정이 이루어진다. 누락된 경우, 블록(1903)에서, 충진 요청(fill request)이 메모리 계층의 다음 레벨로 전송되고, 로드는 전역적으로 정확하게 퇴거된다.
그것이 히트(hit)였다면, 대응하는 청크의 LV 비트들 중 임의의 것이 존재하는 지에 대한 판정이 블록(1905)에서 이루어진다. 이러한 LV 비트 중 임의의 것이 대응하는 코어에 대하여 0의 값을 갖는다면, 이것은, 그 특정 코어가 최종 버전의 데이터를 생성하지 않았다는 것을 의미한다. 따라서, 스쿼시 신호가 생성되고, 상태는 롤백되며, 시스템은 블록(1907)에서 추론적 모드로부터 정상 모드로 전이한다. 그와 다른 경우, 로드는 블록(1909)에서 전역적으로 정확하게 퇴거된다.
또한, 몇몇 실시예에서, 다른 이벤트의 존재 시, MLC의 동작은 다음과 같다. (1) 현재 체크포인트가 만족스럽게 완료될 때(체크포인트의 최종 인스트럭션이 전역적으로 정확하게 퇴거될 때), 모든 라인의 추론적(S) 비트가 0으로 설정된다. LV 비트는 실행이 추론적 모드로부터 정상 모드로 전이할 때까지 소거되지 않는다는 것에 유의하라. (2) 설정된 S 비트를 갖는 라인이 MLC로부터 교체될 때, 스쿼시 신호가 생성된다. 이것은, 현재 캐시 구성이 마지막 체크포인트 이래로 전역 추론적 메모리 상태를 유지할 수 없다는 것을 의미한다. 체크 포인트가 규칙적으로 취해지므로, 이것은 본 출원인의 시뮬레이션으로부터 관찰된 바와 같이 드물게 발생한다. 그러나, 이것이 관심대상이라면, 스쿼시의 양을 감소시키기 위해 (추론적 라인이 낮은 우선권을 부여받는) 개선된 교체 알고리즘 또는 희생 캐시(victim cache)를 사용할 수 있다. (3) 추론적 모드로부터 정상 모드로의 전이 시, 모든 S 비트를 소거하는 것 외에, LV 비트도 소거된다(1로 설정된다). (4) 스쿼시 신호가 증가할 때, 1로 설정된 추론적 비트를 갖는 모든 라인은 무효인 것으로 설정되고(모든 DCU에서 동일하게 일어남), S 비트는 재설정된다. 또한, LV 비트는 소거된다(1로 설정된다).
코어간 메모리 일관성 모듈(ICMC)
일반적인 캐시 레벨 이외에도, 하기에 더 상세히 설명되는 다른 구조물이 있다. 이러한 추가 구조물은 코어간 메모리 일관성 모듈(Inter-Core Memory Coherency Module: "ICMC")을 구성한다. ICMC 및 DCU와 MLC의 라인에 첨부된 비트는 정상 모드에서 사용되지 않는다. ICMC는 정렬(ordering) 인스트럭션을 수신하고, 그들을 3개의 구조, 즉 (1) 메모리 FIFO, (2) 업데이트 기술표(UDT), 및 (3) 레지스터 체크포인팅 로직(도 20 참조)을 통해 처리한다. ICMC는, 다른 타일에게 멀티-스레드 애플리케이션에 의해 이루어진 변경이 순차적으로 실행된 것처럼 보이게 하고 타일의 코어 상에서 실행되는 스레드들 간의 메모리 의존성 위반을 검출하도록 정렬 인스트럭션을 분류한다. 타일 내부의 ICMC 및 메모리 계층은, 원래의 순차적 실행이 다수의 L1 캐시 내의 상이한 버전의 동일한 라인을 허용하고 추론적 업데이트를 회피하여 타일 외부로 전달함으로써 생성될 동일한 상태를 여전히 커밋하면서, 협력 모드에서 구동 중인 각각의 코어가 자신의 메모리 상태를 업데이트하게 한다. 또한, 레지스터 체크포인트는 이전 상태로의 롤백을 허용하여 추론 오류를 정정한다.
ICMC는 코어 호출 메모리 FIFO(memFIFO) 당 하나의 FIFO 큐를 구현한다. 코어가 정렬 인스트럭션을 퇴거시킬 때, 그 인스트럭션은 그 코어와 관련된 memFIFO에 저장된다. ICMC는 POP 비트에 기초하여 memFIFO로부터의 인스트럭션을 처리하고 제거한다. 마지막으로 커밋된 인스트럭션의 POP 비트 값은 커밋할 다음 인스트럭션이 상주하는 memFIFO의 헤드를 식별한다. 인스트럭션은, 이들이 원래의 순차적 순서로 시스템에서 가장 오래된 인스트럭션이 될 때 ICMC에 의해 커밋된다는 것에 유의하라. 따라서, 이것은 저장 인스트럭션이 공유 캐시 레벨을 업데이트할 수 있고 타일의 외부에서 가시적인 것일 수 있는 순서이다. 하기의 설명 중 지속기간에 대해, 인스트럭션은, 그것이 코어에서 가장 오래된 인스트럭션이 되고 퇴거가 발생했을 때 퇴거된다. 대조적으로, 인스트럭션은, 그 인스트럭션이 타일 내에서 가장 오래된 것이기 때문에 ICMC에 의해 처리될 때, 전역적으로 커밋되거나 생략하여 커밋된다.
memFIFO 엔트리는, (1) 인스트럭션의 타입(로드, 저장, 브랜치, 체크포인트)을 식별하는 타입 비트, (2) POP 값, (3) 메모리 어드레스, (4) 메모리 어드레스의 크기를 기술하는 비트, (5) 저장 값에 대한 비트, 및 (6) 복제(rep) 인스트럭션을 마킹하는 비트를 포함할 수 있다. 복제 인스트럭션은 의존성 위반에 대한 ICMC 체크를 갖는 것을 피하기 위해 마킹된다.
memFIFO는 각각의 코어가 인스트럭션을 독립적으로 페치하고, 실행하며 퇴거시키게 한다. 유일한 동기화는 하나의 코어가 다른 코어로 인한 인스트럭션의 퇴거를 방해할 때 일어난다. 코어는 그것의 소거된 인스트럭션 중 하나 이상의 인스트럭션이 그것의 memFIFO를 떠날 때까지 결국 그것의 memFIFO를 가득 채우고 스톨링할 수 있다. 이것은, 커밋할 다음 인스트럭션이 상이한 코어에 의해 실행되어야 하고 이 인스트럭션이 아직 퇴거되지 않았을 때 발생한다.
캐시 일관성 프로토콜 및 타일 내의 캐시 모듈은 동일한 라인의 상이한 버전들을 다수의 제 1 캐시 레벨로 허용하기 위해 약간 수정된다. 또한, 추론적 업데이트를 회피하여 타일 외부로 전달하도록 하는 몇몇 변경도 필요하다. L1 데이터 캐시는, 라인이 업데이트되고 그에 따라 각각의 L1 캐시가 상이한 버전의 동일한 데이터를 가질 수 있을 때 협력 모드에서 다른 L1 캐시를 무효화시키지 않는다. 전술된 바와 같이, 하나의 코어에서 라인의 V 비트는 저장 인스트럭션이 그 코어에서 실행할 때 설정되고, 그 라인을 {ref}와 유사하게 업데이트한다. L1으로의 이러한 추론적 업데이트는 공유 L2 캐시로 전달(쓰기-스루(written-through))되지 않는다. 저장 동작은 ICMC로 전송되며, 커밋될 때 L2 캐시를 업데이트할 것이다. 따라서, 설정된 V 비트를 갖는 라인이 L1로부터 교체될 때, 콘텐츠는 폐기된다. 마지막으로, 저장이 협력 모드로부터 단일 코어 모드로 전이할 때, 설정된 V 비트를 갖는 모든 L1 라인은 정확한 데이터가 L2 및 ICMC에 상주하므로 무효화된다.
저장이 커밋될 때, 대응하는 L2 라인을 업데이트하고 S 비트를 1로 설정한다. 이러한 S 비트는 라인이 마지막 체크포인트 이래로 수정되었다는 것을 기술한다. 일단 새로운 체크포인트가 취해지면, S 비트는 소거된다. 추론오류의 경우, 스레드는 롤백되며, 설정된 S 비트를 갖는 라인은 무효화된다. 따라서, 비추론적 오염된 라인이 추론적 저장에 의해 업데이트될 때, 라인은 메모리 계층 내의 어느 곳에서든 유효한 비추론적 버전의 라인을 갖기 위해 다음 메모리 레벨로 다시 기록되어야 한다. 추론적 상태가 L2 캐시 아래로 갈 수 없으므로, 추론적(S)인 것으로 마킹된 라인의 L2로부터의 축출은 원래의 애플리케이션을 실행할 것을 재개하도록 하는 이전 체크포인트로 롤백함을 의미한다.
한편, LV 비트는 코어가 최종 버전의 특정 청크를 갖는다는 것을 나타낸다. 저장이 커밋될 때, 그것은 그 코어에 속하는 수정된 청크의 LV 비트를 1로 설정하고, 나머지를 리셋한다. 저장이 복제된 것으로 태그되면(양측 코어에 의해 실행되면), 양측 코어는 최근 복제본을 가질 것이다. 이 경우, LV 비트는 11로 설정된다. 로드의 전역적 커밋 시, 이러한 비트는 그 로드를 실행했던 코어가 최종 버전의 데이터를 갖는 코어였는지를 알기 위해 체크된다. 그 로드를 실행했던 코드를 나타내는 LV 비트가 0이고 다른 코어에 대한 비트가 1이면, 위반이 검출되고, 스레드가 스쿼시된다. 이것은, 각각의 코어가 인스트럭션을 독립적으로 페치하고, 실행하며, 퇴거시키고, L 캐시들도 서로 분리되어 작동할 때, 시스템은 로드가 동일한 코어에서 생성되었다면 올바른 값을 판독할 것이라고 단지 보장만 할 수 있기 때문에 그러하다.
UDT는 memFIFO 큐에 위치하는 저장 인스트럭션(여전히 전역적으로 퇴거되지 않은 저장)에 의해 업데이트될 L2 라인을 기술하는 표이다. 적어도 하나의 실시예의 경우, UDT는 각각의 엔트리가 라인을 식별하고 스레드에 대한 다음 필드, 즉 유효 비트(V) 및 그 스레드의 FIFO 엔트리에 대한 포인터인 FIFO 엔트리 id를 갖는 캐시(예를 들어, 전역적으로 관련되는 32개의 엔트리)로서 구조화된다. UDT는, 여전히 그 라인을 업데이트하도록 계류하는 몇몇 저장이 존재하는 한, 공유 L2 캐시로부터 L1 캐시로의 충진을 지연한다. 이것은, L1을 L2로부터의 실효 라인으로 충진하는 것을 피하는 데 도움이 된다. 구체적으로, 주어진 코어의 L1로의 충진은, 그 특정 코어에 대한 memFIFO에 더 이상의 계류하는 저장이 없을 때까지(라인 태그에 대하여 UDT에 어떠한 엔트리도 없을 때까지) 지연된다. 따라서, DCU 충진은 엔트리가 그 코어에 대응하여 1로 설정된 유효 비트를 갖는 요청된 라인에 대해 엔트리가 UDT에 존재한다면 지연 요청 버퍼에 배치된다. 이러한 충진은, 일단 그 유효 비트가 언셋되면 처리될 것이다. 메모리 의존성이 없다면, LV 비트는 그것을 이미 검출할 것이므로, 또한 2개의 코어가 동일한 라인의 상이한 부분에 액세스하는 경우에는 ICMC가 L2에서 업데이트를 적절히 병합할 것이므로, 다른 코어가 그 동일한 라인으로의 저장을 기다릴 필요가 없다.
추론적 모드에서, 저장이 국부적으로 퇴거되고 FIFO 큐에 추가될 때, UDT가 업데이트된다. 이제, 엔트리가 활용가능하다는 것을 가정하자. 엔트리가 그 라인에 존재하지 않는다면, 새로운 것이 생성되고, 태그가 충진되며, 그 스레드의 유효 비트가 설정되고, 대응하는 FIFO 엔트리 id는 저장이 배치되는 FIFO 엔트리의 ID로 업데이트되며, 다른 코어에 대응하는 유효 비트가 언셋된다. 엔트리가 그 라인에 이미 존재한다면, 그 스레드의 유효 비트가 설정되고, 대응하는 FIFO 엔트리 id는 저장이 배치되는 FIFO 엔트리의 id로 업데이트된다.
저장이 전역적으로 퇴거될 때, 그것은 UDT에서 그것의 대응하는 엔트리를 찾는다(그것은 이미 히트이다). 그 코어의 FIFO 엔트리 id가 퇴거된 저장의 UDT에 있는 것과 일치하면, 대응하는 유효 비트는 0으로 설정된다. 엔트리의 양측 유효 비트가 0이면, UDT 엔트리는 방출되고, 근간의 요청에 재사용될 수 있다. 추론적 모드로부터 정상 모드로의 전이 시, UDT는 소거된다.
오버플로우(overflowing)를 피하기 위해, UDT "스톱 앤드 고(stop and go)" 메커니즘이 구현된다. UDT 내의 가용 엔트리의 수가 작고, 오버플로우 위험성이 있을 때, 그들이 새로운 저장을 국부적으로 퇴거시키는 것을 방지하라는 신호가 코어에 전송된다. UDT가 여러 코어로부터 기록될 수 있는 공유 구조물이므로 신뢰 기반 제어(credit based control)가 구현될 수 없다는 것에 유의하라. 또한, 교착상태(deadlocks)를 피하고 전진 진행을 보증하기 위해, 코어는 N-1개를 초과하는 UDT 엔트리를 사용할 수 있는데, N은 엔트리의 총 개수이다. 이러한 경우, 그 코어는 새로운 저장을 국부적으로 퇴거시키지 못한다. 이것은 다른 스레드가 시스템에서 가장 오래된 인스트럭션을 실행하는 것이라면, 그 스레드가 진행할 여지를 남겨 둔다.
UDT 내의 엔트리는 다음의 필드, 즉 L2 캐시 라인을 식별하는 태그의 필드, 및 각각의 코어에 대한 memFIFO에 부착되는 유효 비트의 필드를 갖는다. memFIFO 엔트리 id는 그 라인을 업데이트하는 마지막 저장의 그 특정 memFIFO의 엔트리 번호이다. 이 필드는, 저장이 memFIFO에 첨가될 때마다 업데이트된다. 저장이 UDT 내의 엔트리 없이 라인을 기록한다면, 그것은 새로운 엔트리를 할당한다. 대조적으로, 커밋된 저장이 memFIFO 엔트리 id에 의해 지정되면 그것의 유효 값은 허위(false)로 설정되고, 양측 유효 비트가 허위이면 엔트리는 UDT로부터 제거된다.
ICMC는 또한 하기에 상세히 설명되는 레지스터 체킹포인팅 로직을 포함할 수 있다. 이미 설명된 구조물(예컨대, ICMC와 S, V 및 LV 비트)은, 코어들 간의 이 비밀/공유 인터페이스가 상하로 이동하는 실시예의 경우에 메모리 계층 내의 어느 곳에서든 상주할 수 있다. 이에 따라, 본 명세서에서 설명되는 실시예는 임의의 특정 메모리 서브시스템 구성에 채용될 수 있다.
추론적으로 병렬되는 코드의 구조적 레지스터 상태 계산(Computing the Architectural Register State of a Speculatively Parallelized Code)
본 명세서에서 설명되는 재구성 방식의 실시예는 특정 측정이 잘못된 것일 때 상태를 정확한 살태로 롤백하도록 하는 레지스터 체크포인팅을 포함한다. 체크포인트의 빈도는 성능 면에서 중요한 의미를 갖는다. 체크포인트가 빈번할수록, 추론오류로 인한 오버헤드는 낮아지지만, 그들을 생성하는 오버헤드는 높아진다. 이 섹션에서는 분리되고 극도로 낮은 오버헤드로 다수의 커들 사이에 분배되는 계산을 갖는 단일 드레스 코드에 대한 구조적 레지스터 상태의 빈번한 체크포인트를 취할 수 있는 방식이 설명된다.
레지스터 체크포인팅용 메커니즘의 적어도 하나의 실시예는 코어가 인스트럭션을 퇴거시키고, 실행 리소스를 개선하며, 다른 코어가 스톨링될 때조차도 전진 진행을 유지하게 한다. 이 섹션에서 설명되는 레지스터 체크포인팅은 안전한 조기 레지스터 개선을 허용하여, 그것이 레지스터 파일에 대한 압력을 거의 증가시키지 않게 한다. 본 발명의 적어도 하나의 실시예의 경우, 체크포인트는, 인터럽트나 데이터 추론오류로 인해 롤백이 필요할 때, 낭비되는 작업량이 거의 없도록 매우 빈번하게(수 백개의 인스트럭션마다) 취해진다. 따라서, 개시된 메커니즘의 실시예는, 데이터 추론오류의 오버헤드가 감소하기 때문에, 보다 공격적인 최적화를 수행할 수 있게 만든다.
이전의 추론적 멀티-스레딩 방식과는 대조적으로, 본 발명의 실시예는 완전한 구조적 상태를 생성할 필요가 없으며, 그 대신에 구조적 상태는 다수의 코어에 의해 부분적으로 계산될 수 있다. 이것은, 인스트럭션이 통상적인 추론적 멀티-스레딩 방식에서보다 더욱 미세한 단위로 코어들 사이에 배분되는 보다 탄력적인 스레딩을 허용한다.
본 발명의 적어도 하나의 실시예에 따르면, 코어는 특정 포인트에서 구조적 상태를 얻도록 동기화되어서는 안 된다. 이 기술은 구조적 상태를 거의 끊김없이 병합하고 구축한다.
본 발명의 실시예는, 원래의 단일 스레드 애플리케이션이 실행된 것과 동일한 결과를 갖도록, 코어에 의해 퇴거된 인스트럭션이 커밋되어야 하는 순서로 저장되는 ROB(기록 버퍼)를 생성한다. 그러나, 스레드가 동기적으로 실행하기 때문에, 이 ROB 내의 엔트리는 순차적으로 할당되지 않는다. 그 대신, 얼마나 많은 인스트럭션 또는 그것의 종류가 할당될 것인지를 알지 못하는 영역이 존재한다. 이 상황은, 예를 들어 인스트럭션이 코어 1로부터 실행된 후에 커밋되어야 하는 코드 영역을 코어 0이 실행하고 있는 경우에 발생할 수 있다. 이 경우, 코어 1에 의해 이미 퇴거된 인스트럭션과 코어 1에 의해 아직 실행/퇴거되지 않았으되 인스트럭션에 속하는 코어 0에 의해 퇴거되는 인스트럭션 사이의 이 개념적 ROB에는 갭이 존재한다.
도 21은 체크포인팅 메커니즘의 ROB에 대한 적어도 하나의 실시예를 예시한다. 이 ROB에서, GRetire_0은 코어 0에 의해 퇴거된 마지막 인스트럭션을 나타내고, GRetire_1은 코어 1에 의해 퇴거된 마지막 인스트럭션을 나타낸다. 알 수 있는 바와 같이, 코어 0은 코어 1에 앞서기 때문에, GRetire_0과 GRetire_1 사이의 ROB에는 갭(음영 영역으로 도시됨)이 존재한다. 주어진 시간에서, 완전한 체크포인트는 각각의 로직 레지스터에 대한 값이 상주하는 (코어 0 또는 코어 1 내의) 레지스터 파일에서 물리적 레지스터에 대한 포인터를 갖는다.
체크포인트(ckp)는 사전 정의된 양의 인스트럭션을 퇴거할 때마다 각각의 코어에 의해 취해진다. 시스템에서 최근 인스트럭션을 퇴거시키는 코어에 의해 취해진 체크포인트는 부분 체크포인트라는 것에 유의하라. 이 코어는 다른 코어가 취해진 체크포인트보다 오래된 모든 인스트럭션을 퇴거시킬 때까지는 이 실행 포인트에 대한 구조적 상태를 실제로 생성한다는 것은 보증할 수 없다.
대조적으로, 시스템에서 최근 인스트럭션을 퇴거시키지 않은 코어에 의해 취해진 체크포인트는 완전한 체크포인트인데, 이는 그것이 다른 코어가 실행했던 체크포인트보다 오래된 인스트럭션을 알고 있기 때문이다. 따라서, 그것은 각각의 구조적 값이 그 포인트에 있다는 것을 알고 있다. 이 실례에서 주기적 체크포인트가 부분적인 것이라 할지라도 코어 0이 특정 수의 인스트럭션 다음에 그러한 주기적 체크포인트를 취하는 이유는 그러한 부분적 체크포인트에 의해 나타내어지지 않는 모든 물리적 인스트럭션이 개선되기 때문이다. 이 특징은, 이 코어가 그것의 레지스터 파일 위로 압력을 거의 증가시키지 않고 전진 진행을 하게 하기 때문이다. 또한, 코어 1이 이 체크포인트에 도달하자마자, 이 포인트에서의 구조적 상태에 속하는 코어 0에 의해 생성된 값을 포함하는 레지스터는 완전한 체크포인트가 코어 1로부터 오는 정보로 구축될 수 있도록 개선되지 않았다는 것을 보증한다. 또한, 코어 1에 의해 재기록되었기 때문에 체크포인트에 속하지 않는 코어 0에 할당된 그러한 레지스터도 방출될 수 있다.
보다 최근의 완전한 체크 포인트가 시스템에서(실례에서는 코어 1) 가장 최근의 것이 아닌 인스트럭션을 퇴거시키는 코어에 의해 취해지자마자, 체크포인트가 방출될 수 있고, 그것의 물리적 레지스터는 개선될 수 있다. 그러나, 그것은, 스레딩 방식이 인스트럭션에 시스템에서 가장 오래된 것이 될 때 수행되는 몇몇 유효화를 요구하는 일이 발생할 수 있다. 따라서, 이 인스트럭션보다 오래된 체크포인트는 유효화가 실패한 경우에 롤백하는 데 사용된다. 이 시나리오에서, 완전한 체크포인트는 관련된 완전한 체크포인트를 갖는 다른 인스트럭이 시스템에서 가장 오래된 것이 되고 적절히 유효화된 후에 방출된다.
스레드에 의해 실행되는 모든 인스트럭션은 원래의 코드 내의 인스트럭션의 인스트럭션 포인터("IP")인 관련 IP_orig을 갖는데, 이것은 이 인스트럭션에 관련된 체크 포인트가 복구되는 경우에 점프하도록 하는 것이다. 실행된 인스트럭션의 IP들과 그것의 IP_orig들 사이의 변환은 메모리에 저장된다(실시예에서, 컴파일러 또는 동적 최적화기는 이 변환표를 생성하는 일을 담당한다). 따라서, 체크포인트가 데이터 추론오류 또는 인터럽트 때문에 복구되는 때마다, 복구된 체크포인트에 관련된 원래의 단일 스레드 애플리케이션의 IP_orig에서 실행이 계속될 것이다.
앞서 있는 코어 및 뒤에 오는 코드는 항상 동일한 것은 아니며, 이 역할은 원래의 애플리케이션이 스레드로 변환되었던 방법에 의존하여 시간에 따라 변경될 수 있다는 것에 유의해야 한다.
주어진 시간에서, 완전한 체크포인트는 각각의 로직 레지스터에 대한 값이 상주하는 (코어 0 또는 1에서) 레지스터 파일 내의 물리적 레지스터에 대한 포인터를 갖는다. 모든 인스트럭션이 전역적으로 커밋되었고 보다 최근의 체크포인트가 완전하게 될 때, 체크포인트는 방출될 수 있고, 그것의 물리적 레지스터는 개선될 수 있다.
체크포인트는, 컴파일러에 의해 삽입된 CKP 인스트럭션이 발견되고, 적어도 최소 개수의 동적 인스트럭션이 마지막 체크포인트(CKP_DIST_CTE) 이래로 전역적으로 커밋되었을 때 취해진다. 이 로직은 도 15에 도시된다. 이 CKP 인스트럭션은, 체크포인트와 함께 저장되는 복구 코드의 IP를 가지며, 그에 따라, 인터럽트 또는 데이터 추론오류가 발생할 때 이전 체크포인트에 의해 나타내어진 값이 애플리케이션의 실행을 재개할 코어에 복제된다.
도 22는 레지스터 체크포인팅 하드웨어의 적어도 하나의 실시예를 예시하는 블록도이다. 적어도 하나의 실시예의 경우, 예시된 레지스터 체크포인팅 하드웨어의 일부분은 타일의 코어들 사이에 놓인다. 예를 들어, 실시예에서, 로직 게이트는 타일의 외부에 있고, LREG_FIFO는 ICMC의 일부분이다. 실시예에서, ICMC, (1) 코어 FIFO 큐(LREG_FIFO), (2) LREG_FIFO 당 포인터들의 세트, 및 (3) LREG_FIFO 당 체크포인트 표들의 풀(pool) 중 하나 이상을 포함한다. 멀티-플렉서(MUX)와 같은 그 밖의 로직은, 예를 들어 NOR 게이트 대신에 사용될 수 있다.
퇴거된 인스트럭션은 로직 레지스터 및 LREG_FIFO의 엔트리에 기록된다. 도 22는 엔트리가 (1)이 엔트리에 관련된 구조적 상태 체크포인트가 존재하는 경우에 1로 설정되는, ckp라 명명된 필드, (2) 인스트럭션이 재기록되는 로직 레지스터의 식별자를 저장하는 LDest 필드, 및 (3) 프로그램 순서에서 다음 인스트럭션을 포함하는 스레드를 식별하는 POP 필드로 구성된다는 것을 예시한다. POP 포인터는, 단일 스레드 애플리케이션이 순차적으로 실행되었을 경우와 동일한 결과를 얻기 위해 상이한 스레드로부터의 인스트럭션이 퇴거되어야 하는 순서를 식별하도록 하는 메커니즘이다. 그러나, 본 발명은 단일 스레드 애플리케이션으로부터 생성되는 상이한 스레드의 인스트럭션들 사이의 순서를 식별하는 데 이용될 수 있는 임의의 다른 메커니즘과 함께 작용할 수 있다.
포인터의 세트는, (1) 새로운 퇴거된 인스트럭션이 이 레지스터에 의해 나타내어진 엔트리를 할당하는 LREG_FIFO의 첫 번째 미사용 엔트리를 나타내는 코어 당 RetireP 포인터, (2) 순서적으로 LREG_FIFO 엔트리를 할당해제하는 데 사용되는 LREG_FIFO에서 가장 오래된 할당 엔트리를 나타내는 코어 당 CommitP 포인터, 및 (3) 완전한 체크포인트를 구축하기 위해 순시되는 LREG_FIFO 내의 마지막 엔트리를 나타내는 코어 당 Gretire 포인터를 포함한다. 또한, CHKP_Dist_CTE 레지스터 또는 일정한 값이 예시된다. 이 레지스터는 LREG_FIFO 내의 2개의 체크포인트들 사이의 엔트리의 개수의 차이를 정의한다. 또한, 마지막 체크포인트 다음에 LREG_FIFO에 하당된 엔트리를 개수를 카운트하는 LREG_FIFO 당 Inst_CNT 레지스터가 예시된다.
LREG_FIFO 당 체크포인트표의 풀은 최대 수의 동작 중(in-flight)인 체크포인트를 정의한다. 체크포인트의 각각의 풀은, 체크포인트가 생성된 인스트럭션의 IP, 롤백 코드의 IP, 및 아키텍처 내의 각 로직 레지스터에 대한 엔트리를 포함한다. 각각의 이러한 엔트리는, 체크포인트에 앞서 생성된 최종 값이 존재하는 물리적 레지스터 물리적 레지스터("PDest"), RDest 식별자가 이전 체크포인트의 PDest와는 상이하다면 1로 설정되는 재기록 비트("O"), 및 로직 레지스터의 구조적 상태가 다른 코어에 존재한다면 1로 설정되는 원격 비트("R")를 갖는다. 이러한 비트는 하기에 상세히 설명된다.
도 22는, IP 및 스레드들 중의 하나로부터 유입되는 인스트럭션의 스레드 id에 의해 인덱싱되며, 그것을 원래의 단일 스레드 애플리케이션의 IP에 맵핑하여 그 스레드의 그 특정 IP의 구조적 상태가 복구될 때 점프하도록 하는 애플리케이션 메모리 공간에 위치하는 데이터 구조물을 예시한다.
코어가 새로운 구조적 레지스터 값을 생성하는 인스트럭션을 퇴거시킬 때마다, 이 인스트럭션은 대응하는 LREG_FIFO에 새로운 엔트리를 할당한다. 그러면, 활성 상태 체크포인트의 엔트리는 그것이 재기록되는 로직 레지스터에 대해 판독된다. O 비트가 설정될 때, 엔트리에 저장된 PDest 식별자가 개선된다. 그러면, O 비트는 설정되고, R 비트는 언셋된다. 마지막으로, PDest 필드는 퇴거된 인스트럭션이 할당된 물리적 레지스터의 식별자로 업데이트된다. 일단 활성 상태 체크포인트가 업데이트되었다면, InstCNT 카운터는 감소하고, 그것이 0일 때, 현재 체크포인트는 다음 체크포인트에 복제되어 이 다음 체크포인트를 활성 상태 체크포인트로 정하게 하며, 새로운 활성 상태 체크포인트의 모든 O 비트는 리셋되고, InstCNT 레지스터는 다시 CHKP_Dist_CTE로 설정된다.
GRetire 포인터가 RetireP 포인터와 매칭되면, 이것은, 이 인스트럭션이 시스템에서 가장 최근의 인스트럭션이 아니며, 이에 따라 도 14의 실례에서의 코어 1처럼 작용해야 한다는 것을 의미한다. 따라서, POP 비트가 체크되며, 그것이 다른 코어를 나타낼 때에는 나타내는 POP 포인터를 갖는 엔트리가 발견될 때까지 다른 코어의 GRetire 포인터가 다른 코어의 LREG_FIFO를 순시하는 데 사용된다. 순시된 모든 엔트리에 대해, LDest 값이 판독되고 활성 상태 체크포인트가 다음과 같이 업데이트된다. O 비트가 설정될 때, PDest에 기록된 물리적 레지스터 식별자가 개선된다. 그러면, O 비트는 리셋될 때, R 비트가 설정되고, PDest는 업데이트된다. ckp 비트를 갖는 엔트리가 1로 설정되면, 부분적 체크포인트는 활성 상태 체크포인트의 정보에 따라 완성된다. 이 병합은, 부분적 체크포인트의 O 비트가 설정되고 활성 상태 체크포인트의 R 비트가 리셋되는 부분적 체크포인트 내의 모든 PDest를 개선하는 것을 수반한다. 그러면, 그러한 엔트리의 O 비트를 리셋하는 활성 상태 체크포인트가 업데이트된다. 한편, GRetire 포인터가 RetireP와 매칭되지 않으면, 시스템에서 가장 최근의 인스트럭션이 알려져 있기 때문에 어떠한 것도 이루어지지 않는다.
마지막으로, 체크포인트는, 그 체크포인트로 롤백하는 것이 필수적인 것은 아니라고 판정될 때 방출될 수 있다. 모든 퇴거된 인스트럭션이 정확하고 어떠한 예외도 일어나지 않을 것이라는 것이 보장된다면, 체크포인트는, 보다 최근의 체크포인트가 완성되자마자 방출될 수 있다. 대조적으로, 퇴거된 인스트럭션은 그것이 스레딩 방식에서 발생함에 따라 추가의 유효화를 요구하는 것이 가능하다. 이 유효화는, 인스트럭션이 시스템에서 가장 오래된 것이 될 때 발생한다. 이 경우, 체크포인트는 관련 체크포인트를 갖는 보다 최근의 인스트럭션이 시스템에서 가장 오래된 것이 되고 유효화가 정확하게 되면 방출될 수 있다.
인터럽트 또는 데이터 추론오류가 발생할 때마다, 이전 체크포인트에 의해 나타내어지는 값은 애플리케이션의 실행을 재개할 코어에 복제되어야 한다. 이 복제본은 이러한 값을 명시적으로 복제할 서비스 루틴의 시작으로서 하드웨어 또는 소프트웨어에 의해 이루어질 수 있다. 일단 구조적 상태가 복제되면, 스레드의 IP로부터 원래의 IP로 변환되는 데 이용되는 표는 원래의 단일 스레드 애플리케이션의 IP를 얻도록 체크포인트가 취해지는 (IP는 체크포인트가 취해진 시간까지 저장됨) 인스트럭션의 IP와 함께 받아들여진다. 그러면, 실행은 획득된 원래의 IP를 얻도록 점프하는 것을 재개하며 원래의 단일 스레드 애플리케이션은 스레드가 다시 스펀될 수 있는 애플리케이션 내의 다른 포인트가 발견될 때까지 실행될 것이다. 상술한 부분에 대한 상세한 예시가 도 23에 도시된다.
예시적인 SpMT 시스템
도 24는 스레드 레벨 재구성을 활용하는 마이크로프로세서의 실시예를 예시한다. 구체적으로, 도 24는, 각각 국부적 캐시(2407, 2413)와 관련되는 하나 이상의 프로세서 코어(2405, 2410)를 갖는 마이크로프로세서(2400)를 예시한다. 또한, 도 24에는, 각각의 국부적 캐시(2407, 2413)에 저장된 정보 중 적어도 몇몇 정보의 버전을 저장할 수 있는 공유 캐시 메모리(2415)이다. 몇몇 실시예에서, 마이크로프로세서(2400)는, 통합형 메모리 제어기, 통합형 그래픽 제어기, 및 I/O 제어와 같이 컴퓨터 시스템 내에서 기타의 기능을 수행하도록 하는 그 밖의 로직과 같은 도 24에 도시되지 않은 다른 로직을 포함할 수 있다. 일 실시예에서, 멀티-프로세서 시스템의 각각의 마이크로프로세서 또는 멀티-코어 프로세서의 각각의 프로세서 코어는 적어도 하나의 실시예에 따라, 분해된 인스트럭션 스트림으로부터 순차적 실행을 재구성하도록 하는 로직(2419)을 포함할 수도 있고, 또는 그러한 로직과 관련될 수도 있다. 로직은 회로, 소프트웨어(타입 매체에서 구현됨), 또는 양측 모두를 포함하여, 몇몇 종래 기술의 구현물에서보다 더 효율적인 리소스가 복수의 코어 또는 프로세서 사이에서의 할당을 가능하게 할 수 있다.
도 25는, 예를 들어, 본 발명의 일 실시예가 사용될 수 있는 전면 버스(FSB) 컴퓨터 시스템을 예시한다. 임의의 국부적 레벨 1(L1) 캐시 메모리(2501, 2505, 2510 또는 2515)는 프로세서 코어(2525, 2527, 2533, 2537, 2543, 2547, 2553, 2557) 중 하나의 프로세서 코어 내에 있거나 그와 달리 관련된 임의의 국부적 레벨-1(L1) 캐시 메모리(2520, 2527, 2530, 2535, 2540, 2545, 2550, 2555)로부터의 정보를 액세스할 수 있다. 또한, 임의의 프로세서(2501, 2505, 2510 또는 2515)는 공유 레벨-2(L2) 캐시(2503, 2507, 2513, 2517) 중 임의의 하나 또는 시스템 메모리(2560)로부터 칩셋(2565)을 통해 정보를 액세스할 수 있다. 도 25의 프로세서 중 하나 이상은, 적어도 하나의 실시예에 따라, 분해된 인스트럭션 스트림으로부터 순차적 시행을 재구성하도록 하는 로직(2519)을 포함하거나 이와 달리 관련될 수 있다.
도 25에 예시된 FSB 컴퓨터 시스템 외에도, 포인트-대-포인트(P2P) 상호접속 시스템 및 링 접속 시스템을 포함하는 다른 시스템 구성이 본 발명의 다양한 실시예와 관련하여 사용될 수 있다.
이제, 도 26을 참조하면, 본 발명의 일 실시예에 따른 시스템(2600)의 블록도가 도시된다. 시스템(2600)은, 그래픽 메모리 제어기 허브(GMCH)(2620)에 연결된 하나 이상의 프로세싱 요소(2610, 2615)를 포함할 수 있다. 추가 프로세싱 요소(2615)의 선택적 특성은 도 26에서 파선으로 표시된다.
각각의 프로세싱 요소는 단일 코어일 수도 있고, 또는 대안으로 다수의 코어를 포함할 수도 있다. 프로세싱 요소는, 선택적으로, 프로세싱 코어 외에도 통합형 메모리 제어기 및/또는 통합형 I/O 제어 로직과 같은 그 밖의 온-다이 요소(on-die elements)를 포함할 수 있다. 또한, 적어도 하나의 실시예에서, 프로세싱 요소의 코어(들)는, 그들이 코어 당 2개 이상의 하드웨어 스레드 콘텍스트를 포함할 수 있다는 점에서 멀티-스레딩될 수 있다.
도 26은, 예를 들어 GMCH(2620)이 동적 랜덤 액세스 메모리(DRAM)일 수 있는 메모리(2640)에 연결될 수 있다는 것을 예시한다. DRAM은, 적어도 하나의 실시예에서, 비휘발성 캐시와 관련될 수 있다.
GMCH(2620)는 칩셋일 수도 있고, 또는 칩셋의 일부분일 수도 있다. GMCH(2620)는 프로세서(들)(2610, 2615)와 통신할 수 있고, 프로세서(들)(2610, 2615)와 메모리(2640) 사이의 상호작용을 제어할 수 있다. GMCH(2620)는 또한 프로세서(들)(2610, 2615)와 시스템(2600)의 다른 요소 사이의 가속 버스 인터페이스로서 작용할 수 있다. 적어도 하나의 실시예에서, GMCH(2620)는 전면 버스(FSB)(2695)와 같은 멀티-드롭 버스를 통해 프로세서(들)(2610, 2615)와 통신한다.
또한, GMCH(2620)는 (평면 디스플레이와 같은) 디스플레이(2640)에 연결된다. GMCH(2620)는 통합형 그래픽 가속기를 포함할 수 있다. GMCH(2620)는, 다양한 주변 디사이스를 시스템(2600)에 연결하는 데 사용될 수 있는 입력/출력(I/O) 제어기 허브(ICH)(2650)에도 연결된다. 도 26에는, 예를 들어 다른 주변 디바이스(2670)와 함께, ICH(2650)에 연결된 이산 그래픽 디바이스일 수 있는 외부 그래픽 디바이스(2660)가 도시된다.
대안으로, 추가 또는 상이한 프로세싱 요소도 시스템(2600)에 존재할 수 있다. 예를 들어, 추가 프로세싱 요소(들)(2615)는, 프로세서(2610)와 동일한 추가 프로세서(들), 프로세서(2610)와 동종이거나 비대칭인 추가 프로세서(들), (예컨대, 그래픽 가속기 또는 디지털 신호 처리(DSP) 유닛) 가속기, 필드 프로그래밍가능 게이트 어레이, 또는 임의의 다른 프로세싱 요소를 포함할 수 있다. 구조적, 마이크로구조적, 열적, 전력 소비 특성 등을 포함하는 장점의 광범위한 측량과 관련하여 물리적 리소스들(2610, 2615) 사이에는 여러 가지 차이점이 존재할 수 있다. 이러한 차이점은 그들 자신을 프로세싱 요소(2610, 2615) 사이에서의 비대칭성 및 이종성으로서 효과적으로 표명할 수 있다. 적어도 하나의 실시예에서, 다양한 프로세싱 요소(2610, 2615)는 동일한 다이 패키지에 존재할 수 있다.
이제, 도 27을 참조하면, 본 발명의 실시예에 따른 제 2 시스템 실시예(2700)의 블록도가 도시되어 있다. 도 27에 도시된 바와 같이, 멀티-프로세서 시스템(2700)은 포인트-대-포인트 상호접속 시스템이며, 포인트-대-포인트 상호접속부(2750)를 통해 연결되는 제 1 프로세싱 요소(2770) 및 제 2 프로세싱 요소(2780)를 포함한다. 도 27에 도시된 바와 같이, 각각의 프로세싱 요소(2770, 2780)는 제 1 및 제 2 프로세서 코어(즉, 프로세서 코어(2774a, 2774b) 및 프로세서 코어(2784a, 2784b))를 포함하는 멀티-코어 프로세서일 수 있다.
대안으로, 프로세싱 요소(2770, 2780) 중 하나 이상은, 가속기 또는 필드 프로그래밍가능 게이트 어레이와 같은, 프로세서 외의 요소일 수 있다.
2개의 프로세싱 요소(2770, 2780)만이 도시되어 있지만, 본 발명의 범주는 그와 같이 제한되는 것은 아니라는 것이 이해될 것이다. 다른 실시예에서, 하나 이상의 추가 프로세싱 요소는 주어진 프로세서에 존재할 수 있다.
제 1 프로세싱 요소(2770)는 메모리 제어기 허브(MCH)(2772) 및 포인트-대-포인트(P-P) 인터페이스(2776, 2778)를 더 포함할 수 있다. 유사하게, 제 2 프로세싱 요소(2780)는 MCH(2782) 및 P-P 인터페이스(2786, 2788)를 포함할 수 있다. 프로세서(2770, 2780)는 포인트-대-포인트(PtP) 인터페이스 회로(2778, 2788)를 사용하여 PtP 인터페이스(2750)를 통해 데이터를 교환할 수 있다. 도 27에 도시된 바와 같이, MCH(2772, 2782)는, 각각의 프로세서에 국부적으로 부착되는 메인 메모리의 일부분일 수 있는 각각의 메모리, 즉 메모리(2742, 2744)에 프로세서를 연결한다.
프로세서(2770, 2780)는 각각 PtP 인터페이스 회로(2776, 2794, 2786, 2798)를 사용하여 개별 PtP 인터페이스(2752, 2754)를 통해 칩셋(2790)과 데이터를 교환할 수 있다. 칩셋(2790)은 또한 고성능 그래픽 인터페이스(2739)를 통해 고성능 그래픽 회로(2738)와 데이터를 교환할 수 있다. 본 발명의 실시예는 임의의 수의 프로세싱 코어를 갖는 임의의 프로세서 내에 또는 도 27의 각각의 PtP 버스 에이전트 내에 위치할 수 있다. 일 실시예에서, 임의의 프로세서 코어는, 국부적 캐시 메모리(도시되지 않음)를 포함하거나 이와 달리 관련될 수 있다. 또한, 공유 캐시(도시되지 않음)는, 프로세서가 저전력 모드에 놓인다면 어느 하나 또는 양측 프로세서의 국부적 캐시 정보가 공유 캐시에 저장될 수 있도록, p2p 상호접속부를 통해 아직 프로세서와 접속되지 않은, 양측 프로세서의 외부에 있는 어느 한쪽의 프로세서에 포함될 수 있다. 도 27의 프로세서 또는 코어 중 하나 이상은, 적어도 하나의 실시예에 따라, 분해된 인스트럭션 스트림으로부터 순차적 실행을 재구성하도록 하는 로직(2719)을 포함하거나 이와 달리 관련될 수 있다.
제 1 프로세싱 요소(2770) 및 제 2 프로세싱 요소(2780)는, 각각 P-P 상호접속부(2776, 2786, 2784)를 통해 칩셋(2790)에 연결될 수 있다. 도 27에 도시된 바와 같이, 칩셋(2790)은 P-P 인터페이스(2794, 2798)를 포함한다. 또한, 칩셋(2790)은 칩셋(2790)을 고성능 그래픽 엔진(2748)과 연결하는 인터페이스(2792)를 포함한다. 일 실시예에서, 버스(2749)는 그래픽 엔진(2748)을 칩셋(2790)에 연결하는 데 사용될 수 있다. 대안으로, 포인트-대-포인트 상호접속부(2749)는 그 소자들을 연결할 수 있다.
이번에는, 칩셋(2790)이 인터페이스(2796)를 통해 제 1 버스(2716)에 연결될 수 있다. 일 실시예에서, 제 1 버스(2716)는 주변 소자 상호접속(Peripheral Component Interconnect: PCI) 버스 또는 PCI 고속 버스와 같은 버스, 또는 다른 제 3 세대 I/O 상호접속 버스일 수 있지만, 본 발명의 범주는 그렇게 제한되지 않는다.
도 27에 도시된 바와 같이, 다양한 I/O 버스(2714)는, 제 1 버스(2716)를 제 2 버스(2720)에 연결하는 버스 브리지(2718)와 함께 제 1 버스(2716)에 연결될 수 있다. 일 실시예에서, 제 2 버스(2720)는 낮은 핀 카운트(LPC) 버스일 수 있다. 일 실시예에서, 예를 들어 키보드/마우스(2722), 통신 디바이스(2726), 및 디스크 드라이브 또는 코드(2730)를 포함할 수 있는 기타의 매스 저장 디바이스와 같은 데이터 저장 유닛(2728)을 포함하는 다양한 디바이스가 제 2 버스(2720)에 연결될 수 있다. 코드(2730)는 전술된 하나 이상의 실시예에 따라 정렬 인스트럭션 및/또는 프로그램 순서 포인터를 포함할 수 있다. 또한, 오디오 I/O(2724)가 제 2 버스(2720)에 연결될 수 있다. 다른 ??텍처가 가능하다는 것에 주목하라. 예를 들어, 도 27의 포인트-대-포인트 아키텍처 대신, 시스템은 멀티-드롭 버스 또는 그러한 다른 아키텍처를 구현할 수 있다.
이제, 도 28을 참조하면, 본 발명의 실시예에 따른 제 3 시스템 실시예(2800)의 블록도가 도시된다. 도 27 및 도 28에서 유사한 요소는 유사한 참조기호를 나타내며, 도 27의 소정 양상은 도 28의 다른 양상을 불명료하게 하는 것을 피하기 위해 도 28에서 생략되었다.
도 28은 프로세싱 요소(2770, 2780)가 각각 통합형 메모리 및 I/O 제어 로직("CL")(2772, 2782)을 포함할 수 있다는 것을 예시한다. 적어도 하나의 실시예에서, CL(2772, 2782)는 도 26 및 도 27과 관련하여 전술된 바와 같은 메모리 제어기 허브 로직(MCH)을 포함할 수 있다. 또한, CL(2772, 2782)는 I/O 제어 로직을 포함할 수 있다. 도 28은, CL(2772, 2782)에 메모리(2742, 2744)가 연결될 뿐 아니라 CL(2772, 2782)에 I/O 디바이스(2814)도 연결된다는 것을 예시한다. 레거시 I/O 디바이스(2815)는 칩셋(2790)에 연결된다.
본 명세서에 개시된 메커니즘의 실시예는 하드웨어, 소프트웨어, 펌웨어, 또는 이러한 구현법의 조합으로 구현될 수 있다. 본 발명의 실시예는 적어도 하나의 프로세서, 데이터 저장 시스템(휘발성 및 비휘발성 메모리 및/또는 저장 요소를 포함함), 적어도 하나의 입력 디바이스, 및 적어도 하나의 출력 디바이스를 포함하는 프로그래밍가능 시스템 상에서 실행하는 컴퓨터 프로그램으로서 구현될 수 있다.
도 27에 예시된 코드(2730)와 같은 프로그램 코드는, 본 명세서에 설명된 기능을 수행하고 출력 정보를 생성하도록 하는 입력 데이터에 적용될 수 있다. 예를 들어, 프로그램 코드(2730)는 도 25에 예시된 방법(2500, 2550)의 실시예를 수행하도록 코딩된 운영 체제를 포함할 수 있다. 이에 따라, 본 발명의 실시예는 또한 본 발명의 동작 실시예를 수행하는 인스트럭션을 포함하거나 또는 본 명세서에 설명된 구조물, 회로, 장치, 프로세서 및/또는 시스템의 특징을 정의하는 HDL과 같은 설계 데이터를 포함하는 머신-판독가능 매체도 포함할 수 있다. 이러한 실시예는 프로그램 제품이라고도 지칭될 수 있다.
이러한 머신-판독가능 저장 매체는, 하드디스크와 같은 저장 매체, 플로피디스크, 광디스크, 콤팩트디스크 판독 전용 메모리(CD-ROM), 재기록 가능 콤팩트디스크(CD-RW) 및 자기-광디스크를 포함하는 임의의 다른 타입의 디스크, 판독 전용 메모리(ROM), 동적 랜덤 액세스 메모리(DRAM), 정적 랜덤 액세스 메모리(SRAM)와 같은 랜덤 액세스 메모리(RAM), 소거가능 프로그래밍가능 판독 전용 메모리(EPROM), 플래시 메모리, 전기적 소거가능 프로그래밍가능 판독 전용 메모리(EEPROM), 자기적 또는 광학 카드, 또는 전자적 인스트럭션을 저장하는 데 적합한 임의의 다른 타입의 매체와 같은 저장 매체를 포함하는 머신 또는 디바이스에 의해 제조되거나 형성되는 입자의 유형의 배열물을 포함할 수 있지만, 이러한 것으로 제한되는 것은 아니다.
출력 정보는 알려진 방식으로 하나 이상의 출력 디바이스에 인가될 수 있다. 이 애플리케이션을 위해, 프로세싱 시스템은, 예를 들어 디지털 신호 프로세서(DSP), 마이크로제어기, 주문형집적회로(ASIC) 또는 마이크로프로세서와 같은 프로세서를 구비한 임의의 시스템을 포함한다.
프로그램은 높은 레벨의 절차적 또는 객체 지향형 프로그래밍 언어로 구현되어 프로세싱 시스템과 통신할 수 있다. 프로그램은 또한 원한다면 어셈블리어 또는 기계어로도 구현될 수 있다. 사실상, 본 명세서에 설명된 메커니즘은 범주 면에서 임의의 특정 프로그래밍 언어로 제한되지 않는다. 임의의 경우, 언어는 컴파일되거나 또는 번역된 언어일 수 있다.
적어도 하나의 실시예의 하나 이상의 양상은, 머신에 의해 판독될 때 머신으로 하여금 본 명세서에 설명된 기술을 수행하게 하는 프로세서 내에서 다양한 로직을 나타내는 머신-판독가능 매체에 저장되는 대표적 데이터에 의해 구현될 수 있다. "IP 코어"라고 알려진 이러한 표현은 유형의 머신 판독가능 매체에 저장될 수 있으며, 실제로 로직 또는 프로세서를 제조하는 머신 내로 로딩하는 다양한 고객 또는 제조 설비로 공급될 수 있다.
이와 같이, 방법 및 장치의 실시예가 설명되었다. 상기의 설명은 예시하고자 의도된 것이고, 제한하고자 하는 것이 아니라는 것이 이해될 것이다. 상기의 설명을 읽고 이해한 당업자에게는 그 밖의 많은 실시예가 자명할 것이다. 따라서, 본 발명의 범주는, 첨부한 특허청구범위를 참조하여 그러한 특허청구범위가 권리를 부여하는 등가의 전체 범주와 함께 판정되어야 한다.

Claims (20)

  1. 추론적으로 실행되는 스레드(thread)의 국부적으로 퇴거된(locally retired) 인스트럭션을 저장하되, 각 라인의 추론적 업데이트 상태를 분류하기 위한 라인 당 버전 비트(version bit per line)를 포함하는 복수의 데이터 캐시 유닛(data chche unit: DCU)과,
    상기 DCU에 연결되어 상기 DCU의 상기 라인으로부터의 데이터를 병합(merge)하되, 캐시 라인이 추론적 상태를 포함한다는 것을 나타내는 캐시 당 추론적 비트(speculative bit per cache) 및 청크(chunk)로의 변경을 나타내는 최종 버전 비트를 포함하는 병합 레벨 캐시(merging level cache: MLC)와,
    상기 MLC 내 상기 추론적으로 실행되는 스레드의 인스트럭션을 전역적으로(globally) 퇴거시키는 코어간 메모리 일관성 모듈(inter-core memory coherency module: ICMC)을 포함하는 장치.
  2. 제 1 항에 있어서,
    상기 ICMC는 추론적으로 실행되는 스레드의 정렬 인스트럭션(ordering instruction)이 퇴거된 후에 상기 정렬 인스트럭션을 저장하는 복수의 메모리 선입선출(FIFO) 큐를 더 포함하되, 상기 메모리 FIFO 큐 내의 각 엔트리는 커밋(commit)할 다음 인스트럭션이 상주하는 상기 메모리 FIFO 큐의 헤드를 식별하기 위한 프로그램 순서 포인터(program order pointer: POP)를 포함하는 장치.
  3. 제 2 항에 있어서,
    상기 ICMC는 흐름 재구성(flow reconstruction) 동안에 상기 ICMC에 의해 상기 메모리 FIFO 큐들 사이를 변경하는 스위치를 더 포함하는 장치.
  4. 제 2 항에 있어서,
    상기 ICMC는 상기 메모리 FIFO 큐 내에 위치하는 저장 인스트럭션(store instruction)에 의해 업데이트될 상기 MLC의 라인을 식별하기 위한 업데이트 서술 테이블(update description table: UDT)을 더 포함하는 장치.
  5. 제 3 항에 있어서,
    상기 ICMC는 상기 추론적으로 실행되는 스레드의 실행 동안에 추론오류(misspeculation)를 정정하도록 이전 상태로 롤백(rollback)하기 위한 레지스터 체크포인팅 로직(register checkpointing logic)을 더 포함하는 장치.
  6. 제 1 항에 있어서,
    상기 추론적으로 실행되는 스레드의 상기 인스트럭션을 처리하는 복수의 기능 유닛을 더 포함하는 장치.
  7. 제 1 항에 있어서,
    상기 MLC에 연결되는 L3 캐시를 더 포함하는 장치.
  8. 인스트럭션을 포함하는 머신-판독가능 저장 매체로서,
    상기 인스트럭션은, 머신에 의해 실행될 때,
    컴퓨터 프로그램의 복수의 영역을 수신하는 단계와,
    상기 복수의 영역 중 병렬 멀티-스레드 실행을 위한 후보인 영역을 식별하는 단계와,
    복수의 코어 상에서 병렬로 실행될 상기 식별된 영역에 대해 인스트럭션 레벨에서 복수의 세립 스레드(fine-grain thread) -상기 복수의 스레드는 상기 식별된 영역의 최적 버전을 형성함- 를 생성하는 단계와,
    상기 복수의 스레드로부터 프로그램 코드를 생성하는 단계
    를 포함하는 방법이 실행되도록 하는 머신-판독가능 저장 매체.
  9. 제 8 항에 있어서,
    상기 방법은,
    상기 컴퓨터 프로그램으로부터 데이터 의존성 그래프(data dependence graph: DDG) 및 제어 흐름 그래프(control flow graph: CFG)를 생성하는 단계와,
    상기 DDG 및 CFG에 프로파일링 정보를 추가하는 단계와,
    프로파일링 정보와 함께 상기 DDG 및 CFG로부터 프로그램 의존성 그래프(program dependence graph: PDG)를 생성하는 단계를 더 포함하는 머신-판독가능 저장 매체.
  10. 제 9 항에 있어서,
    상기 방법은,
    상기 PDG 내 인스트럭션 노드의 비교적 양호한 파티션을 찾고 멀티-레벨 그래프를 생성하도록,
    캐시에서 종종 누락되기 쉬운 로드 인스트럭션(load instruction)인 비행성 로드(delinquent load)를 상기 PDG에서 검출하고,
    상기 PDG의 노드에 대한 각 에지의 슬랙(slack)을 계산하며,
    상기 PDG의 노드에 대한 공통 전임자(predecessor)를 계산하는 것에 의해
    상기 PDG 상에서 조대화(coarsening)를 수행하는 머신-판독가능 저장 매체.
  11. 제 10 항에 있어서,
    상기 방법은,
    스레드간 의존성을 관리하기 위해 상기 멀티-레벨 그래프를 개선(refine)하는 단계를 더 포함하는 머신-판독가능 저장 매체.
  12. 제 8 항에 있어서,
    상기 방법은,
    상기 최적 영역이 비추론적으로 실행되는 경우에는 상기 최적 영역의 상대적 순서를 정의하고, 상기 실행 머신의 메모리 선입선출(FIFO) 큐 중 어떤 메모리 FIFO 큐가 언제 상기 식별된 영역의 최적 버전의 흐름을 재구성하도록 평가되어야 하는지를 나타내는 프로그램 순서 포인터(POP)를 생성하는 단계와,
    상기 식별된 영역의 상기 최적 버전의 각 정렬 인스트럭션에 상기 POP를 추가하는 단계를 포함하는 머신-판독가능 저장 매체.
  13. 제 8 항에 있어서,
    상기 POP를 생성하는 단계는,
    상기 최적 영역의 제 1 인스트럭션이 정렬 인스트럭션인지를 판정하는 단계와,
    상기 식별된 영역의 상기 최적 버전에서 순차적 순서로 다음 정렬 인스트럭션을 찾는 단계와,
    순차적 순서로 상기 다음 정렬 인스트럭션이 상기 제 1 인스트럭션과는 상이한 스레드에 속할 때 변경을 나타내도록 상기 제 1 인스트럭션을 마킹하는 단계를 포함하는 머신-판독가능 저장 매체.
  14. 제 8 항에 있어서,
    상기 방법은,
    상기 머신에 의해 실행될 때 상기 복수의 스레드가 생성되게 하는 스펀 인스트럭션(spawn instruction)을 상기 최적 영역에 앞서 삽입하는 단계를 더 포함하는 머신-판독가능 저장 매체.
  15. 제 1 프로세싱 코어 및 제 2 프로세싱 코어 내의 코드 영역으로부터 각각 제 1 스레드 및 제 2 스레드를 추론적으로 실행하는 단계와,
    국부적으로 상기 제 1 프로세싱 코어 및 상기 제 2 프로세싱 코어 각각의 제 1 레벨 캐시 내에 존재하는 상기 제 1 스레드 및 상기 제 2 스레드의 인스트럭션 각각을 국부적으로 퇴거시키는 단계와,
    공유된 병합 레벨 캐시 내의 상기 제 1 스레드 및 상기 제 2 스레드의 인스트럭션 각각을 전역적으로 퇴거시키는 단계와,
    상기 제 1 프로세싱 코어 및 상기 제 2 프로세싱 코어 각각에 대응하는 메모리 선입 선출(FIFO) 큐 내의 상기 제 1 스레드 및 상기 제 2 스레드의 실행된 정렬 인스트럭션 각각을 저장하는 단계와,
    재구성될 상기 코드 영역의 흐름을 요구하는 상기 제 1 스레드 및 상기 제 2 스레드의 실행 동안에 발생한 조건을 판정하는 단계와,
    저장된 실행된 정렬 인스트럭션을 이용하여 상기 코드 영역의 상기 흐름을 재구성하는 단계를 포함하는 방법.
  16. 제 15 항에 있어서,
    상기 메모리 FIFO 큐 중 하나에 저장된 상기 추론적으로 실행되는 코드 영역의 상기 제 1 정렬 인스트럭션을 판독하는 단계와,
    상기 제 1 정렬 인스트럭션과 관련된 프로그램 순서 포인터(POP) 값을 판독하는 단계와,
    상기 POP 값이 메모리 FIFO 스위치를 나타낼 때 다른 메모리 FIFO 큐로 스위칭하고 상기 다른 메모리 FIFO 큐의 제 1 저장 인스트럭션을 판독하는 단계를 더 포함하는 방법.
  17. 제 16 항에 있어서,
    상기 POP 값은 상기 메모리 FIFO에 저장된 1-비트 값인 방법.
  18. 제 16 항에 있어서,
    상기 POP 값이 어떠한 메모리 FIFO 스위치도 나타내지 않을 때 상기 메모리 FIFO 큐의 다음 저장된 인스트럭션을 판독하는 단계를 더 포함하는 방법.
  19. 제 15 항에 있어서,
    소프트웨어가 저장된 실행된 정렬 인스트럭션을 이용하여 상기 코드 영역의 흐름을 재구성하는 단계를 수행하는 방법.
  20. 제 15 항에 있어서,
    하드웨어 코어간 메모리 일관성 모듈(ICMC)이 저장된 실행된 정렬 인스트럭션을 이용하여 상기 코드 영역의 흐름을 재구성하는 단계를 수행하는 방법.
KR1020117007725A 2008-11-24 2009-11-24 순차적 프로그램을 다수의 스레드로 분해하고 이 스레드를 실행하며 순차적 실행을 재구성하는 장치, 방법 및 머신-판독가능 저장 매체 KR101292439B1 (ko)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US20010308P 2008-11-24 2008-11-24
US61/200,103 2008-11-24
US12/624,804 US8909902B2 (en) 2008-11-24 2009-11-24 Systems, methods, and apparatuses to decompose a sequential program into multiple threads, execute said threads, and reconstruct the sequential execution
PCT/US2009/065735 WO2010060084A2 (en) 2008-11-24 2009-11-24 Systems, methods, and apparatuses to decompose a sequential program into multiple threads, execute said threads, and reconstruct the sequential execution
US12/624,804 2009-11-24

Publications (2)

Publication Number Publication Date
KR20110050725A true KR20110050725A (ko) 2011-05-16
KR101292439B1 KR101292439B1 (ko) 2013-08-05

Family

ID=42198851

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020117007725A KR101292439B1 (ko) 2008-11-24 2009-11-24 순차적 프로그램을 다수의 스레드로 분해하고 이 스레드를 실행하며 순차적 실행을 재구성하는 장치, 방법 및 머신-판독가능 저장 매체

Country Status (6)

Country Link
US (1) US8909902B2 (ko)
JP (1) JP5547208B2 (ko)
KR (1) KR101292439B1 (ko)
CN (1) CN102171650B (ko)
BR (1) BRPI0920541A2 (ko)
WO (1) WO2010060084A2 (ko)

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101484600B1 (ko) * 2013-05-28 2015-01-22 부산대학교 산학협력단 카운터 기반 멀티 사이클 프로세서 제어 장치
KR20150023706A (ko) * 2012-06-15 2015-03-05 소프트 머신즈, 인크. Store 상위 서열에 기초하여 상이한 스레드들로부터의 포워딩을 구현하는 스레드에 무관한 load store 버퍼
US9170919B2 (en) 2012-09-07 2015-10-27 Samsung Electronics Co., Ltd. Apparatus and method for detecting location of source code error in mixed-mode program
US9904552B2 (en) 2012-06-15 2018-02-27 Intel Corporation Virtual load store queue having a dynamic dispatch window with a distributed structure
US9928121B2 (en) 2012-06-15 2018-03-27 Intel Corporation Method and system for implementing recovery from speculative forwarding miss-predictions/errors resulting from load store reordering and optimization
US9965277B2 (en) 2012-06-15 2018-05-08 Intel Corporation Virtual load store queue having a dynamic dispatch window with a unified structure
US9990198B2 (en) 2012-06-15 2018-06-05 Intel Corporation Instruction definition to implement load store reordering and optimization
US10019263B2 (en) 2012-06-15 2018-07-10 Intel Corporation Reordered speculative instruction sequences with a disambiguation-free out of order load store queue
US10048964B2 (en) 2012-06-15 2018-08-14 Intel Corporation Disambiguation-free out of order load store queue
KR20220037721A (ko) * 2020-09-18 2022-03-25 국방과학연구소 소스코드 재건 및 최적화 방법 및 이를 위한 장치

Families Citing this family (85)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10621092B2 (en) 2008-11-24 2020-04-14 Intel Corporation Merging level cache and data cache units having indicator bits related to speculative execution
US9189233B2 (en) 2008-11-24 2015-11-17 Intel Corporation Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
US9672019B2 (en) 2008-11-24 2017-06-06 Intel Corporation Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
US8528001B2 (en) * 2008-12-15 2013-09-03 Oracle America, Inc. Controlling and dynamically varying automatic parallelization
US8495342B2 (en) * 2008-12-16 2013-07-23 International Business Machines Corporation Configuring plural cores to perform an instruction having a multi-core characteristic
US9940138B2 (en) 2009-04-08 2018-04-10 Intel Corporation Utilization of register checkpointing mechanism with pointer swapping to resolve multithreading mis-speculations
US9294526B2 (en) * 2009-12-28 2016-03-22 Microsoft Technology Licensing, Llc Managing multiple dynamic media streams
US8438568B2 (en) 2010-02-24 2013-05-07 International Business Machines Corporation Speculative thread execution with hardware transactional memory
US8438571B2 (en) * 2010-02-24 2013-05-07 International Business Machines Corporation Thread speculative execution and asynchronous conflict
US20110320766A1 (en) * 2010-06-29 2011-12-29 Youfeng Wu Apparatus, method, and system for improving power, performance efficiency by coupling a first core type with a second core type
US20120079245A1 (en) * 2010-09-25 2012-03-29 Cheng Wang Dynamic optimization for conditional commit
US9946545B2 (en) * 2010-11-16 2018-04-17 Arm Limited Buffer store with a main store and and auxiliary store
US8479185B2 (en) * 2010-12-09 2013-07-02 Oracle International Corporation Method and system for utilizing parallelism across loops
CN102074055B (zh) * 2011-01-04 2012-06-20 浙江大学 基于多机协同架构的快速记录仪及自标定和多机协同方法
US20130060556A1 (en) * 2011-07-18 2013-03-07 Et International, Inc. Systems and methods of runtime system function acceleration for cmp design
JP5672199B2 (ja) * 2011-09-01 2015-02-18 富士通株式会社 情報処理装置、情報処理方法及び情報処理プログラム
WO2013048468A1 (en) 2011-09-30 2013-04-04 Intel Corporation Instruction and logic to perform dynamic binary translation
US8893094B2 (en) 2011-12-30 2014-11-18 Intel Corporation Hardware compilation and/or translation with fault detection and roll back functionality
CN102436368B (zh) * 2011-12-31 2016-06-01 北京像素软件科技股份有限公司 一种网络游戏中的指令处理方法
US9229722B2 (en) * 2012-01-31 2016-01-05 International Business Machines Corporation Major branch instructions with transactional memory
US9280398B2 (en) * 2012-01-31 2016-03-08 International Business Machines Corporation Major branch instructions
US10019381B2 (en) * 2012-05-01 2018-07-10 Nvidia Corporation Cache control to reduce transaction roll back
US9632790B2 (en) * 2012-12-26 2017-04-25 Intel Corporation Select logic for the instruction scheduler of a multi strand out-of-order processor based on delayed reconstructed program order
TWI507991B (zh) * 2013-02-27 2015-11-11 Rdc Semiconductor Co Ltd 多核心處理器及其相關控制方法與電腦系統
US9582256B2 (en) * 2013-03-14 2017-02-28 Sas Institute Inc. Automated cooperative concurrency with minimal syntax
KR102010317B1 (ko) * 2013-03-14 2019-08-13 삼성전자주식회사 재명명 테이블 재구성을 위한 리오더-버퍼를 기초로 하는 동적 체크포인팅
US9304863B2 (en) * 2013-03-15 2016-04-05 International Business Machines Corporation Transactions for checkpointing and reverse execution
US9880842B2 (en) 2013-03-15 2018-01-30 Intel Corporation Using control flow data structures to direct and track instruction execution
KR20140126195A (ko) * 2013-04-22 2014-10-30 삼성전자주식회사 배치 쓰레드 처리 기반의 프로세서, 그 프로세서를 이용한 배치 쓰레드 처리 방법 및 배치 쓰레드 처리를 위한 코드 생성 장치
GB2514618B (en) * 2013-05-31 2020-11-11 Advanced Risc Mach Ltd Data processing systems
US9891936B2 (en) 2013-09-27 2018-02-13 Intel Corporation Method and apparatus for page-level monitoring
WO2015097494A1 (en) * 2013-12-23 2015-07-02 Intel Corporation Instruction and logic for identifying instructions for retirement in a multi-strand out-of-order processor
WO2015107378A1 (en) * 2014-01-20 2015-07-23 Sony Corporation Parallelization method and system
EP3123304B1 (en) 2014-03-27 2019-08-14 Intel Corporation Instruction and logic for sorting and retiring stores
KR20160113677A (ko) * 2014-03-27 2016-09-30 인텔 코포레이션 다수의 스트랜드들로부터 명령어들을 디스패칭하기 위한 프로세서 로직 및 방법
US9298807B1 (en) * 2014-09-09 2016-03-29 Sas Institute Inc. Techniques for dynamic partitioning in a distributed parallel computational environment
US9665280B2 (en) * 2014-09-30 2017-05-30 International Business Machines Corporation Cache coherency verification using ordered lists
US20160147536A1 (en) * 2014-11-24 2016-05-26 International Business Machines Corporation Transitioning the Processor Core from Thread to Lane Mode and Enabling Data Transfer Between the Two Modes
CN104361107A (zh) * 2014-11-28 2015-02-18 浪潮电子信息产业股份有限公司 一种快速检测多节点上文件一致性的脚本工具实现方法
KR20160071782A (ko) * 2014-12-12 2016-06-22 삼성전자주식회사 멀티 스레드를 처리하는 방법 및 장치
US9348595B1 (en) 2014-12-22 2016-05-24 Centipede Semi Ltd. Run-time code parallelization with continuous monitoring of repetitive instruction sequences
WO2016105366A1 (en) * 2014-12-23 2016-06-30 Hewlett Packard Enterprise Development Lp Load testing
US9135015B1 (en) 2014-12-25 2015-09-15 Centipede Semi Ltd. Run-time code parallelization with monitoring of repetitive instruction sequences during branch mis-prediction
US9886317B2 (en) * 2015-02-02 2018-02-06 Oracle International Corporation Fine-grained scheduling of work in runtime systems
US9208066B1 (en) 2015-03-04 2015-12-08 Centipede Semi Ltd. Run-time code parallelization with approximate monitoring of instruction sequences
US10296346B2 (en) * 2015-03-31 2019-05-21 Centipede Semi Ltd. Parallelized execution of instruction sequences based on pre-monitoring
US10296350B2 (en) * 2015-03-31 2019-05-21 Centipede Semi Ltd. Parallelized execution of instruction sequences
US9715390B2 (en) 2015-04-19 2017-07-25 Centipede Semi Ltd. Run-time parallelization of code execution based on an approximate register-access specification
JP6378128B2 (ja) * 2015-04-28 2018-08-22 ルネサスエレクトロニクス株式会社 性能検証装置、システム、方法、およびコンピュータに当該方法を実行させるためのプログラム
US9921639B2 (en) * 2015-06-25 2018-03-20 International Business Machines Corporation Clustering execution in a processing system to increase power savings
US10152330B2 (en) * 2015-09-21 2018-12-11 Bae Systems Information And Electronic Systems Integration Inc. Memory protection using a tagged architecture
US9946635B2 (en) * 2015-09-29 2018-04-17 International Business Machines Corporation Synchronizing multi-system program instruction sequences
US10019193B2 (en) * 2015-11-04 2018-07-10 Hewlett Packard Enterprise Development Lp Checkpointing a journal by virtualization of non-volatile random access memory
US9430240B1 (en) * 2015-12-10 2016-08-30 International Business Machines Corporation Pre-computation slice merging for prefetching in a computer processor
US9454373B1 (en) * 2015-12-10 2016-09-27 International Business Machines Corporation Methods and computer systems of software level superscalar out-of-order processing
US20170249146A1 (en) * 2016-02-29 2017-08-31 Qualcomm Incorporated Bandwidth reduction for instruction tracing
US10157136B2 (en) * 2016-03-31 2018-12-18 Intel Corporation Pipelined prefetcher for parallel advancement of multiple data streams
US10303605B2 (en) * 2016-07-20 2019-05-28 Intel Corporation Increasing invalid to modified protocol occurrences in a computing system
GB2553311B (en) 2016-08-31 2020-05-20 Advanced Risc Mach Ltd An apparatus and method for controlling assertion of a trigger signal to processing circuitry
US10095637B2 (en) * 2016-09-15 2018-10-09 Advanced Micro Devices, Inc. Speculative retirement of post-lock instructions
CN108021563B (zh) * 2016-10-31 2021-09-07 华为技术有限公司 一种指令间数据依赖的检测方法和装置
KR101936565B1 (ko) * 2016-11-14 2019-01-09 엘에스산전 주식회사 인버터에서 인터럽트 제어방법
US10133669B2 (en) 2016-11-15 2018-11-20 Intel Corporation Sequential data writes to increase invalid to modified protocol occurrences in a computing system
EP3343351B1 (en) * 2016-12-28 2023-04-26 Waseda University Parallel program generating method and parallelization compiling apparatus
US10209962B2 (en) * 2017-02-06 2019-02-19 International Business Machines Corporation Reconstructing a high level compilable program from an instruction trace
CN107291479A (zh) * 2017-06-30 2017-10-24 武汉斗鱼网络科技有限公司 一种Android应用程序中礼物面板的优化方法及装置
US10379863B2 (en) * 2017-09-21 2019-08-13 Qualcomm Incorporated Slice construction for pre-executing data dependent loads
CN109725904B (zh) * 2017-10-31 2021-10-22 中国科学院微电子研究所 一种低功耗程序指令编译方法及系统
CN109976809B (zh) * 2017-12-28 2020-08-25 中科寒武纪科技股份有限公司 调度方法及相关装置
US10922780B2 (en) 2018-04-10 2021-02-16 Graphisoft Se Method to distribute the drawing calculation of architectural data elements between multiple threads
CN108874447B (zh) * 2018-06-05 2020-09-15 上海兆芯集成电路有限公司 处理器电路及其操作方法
CN109143983B (zh) * 2018-08-15 2019-12-24 杭州电子科技大学 嵌入式可编程控制器的运动控制方法及装置
CN109375947B (zh) * 2018-10-30 2021-04-20 杭州炎魂网络科技有限公司 一种对于软件执行改变的方法及其系统
CN110032407B (zh) 2019-03-08 2020-12-22 创新先进技术有限公司 提升cpu并行性能的方法及装置和电子设备
CN110347954B (zh) * 2019-05-24 2021-06-25 因特睿科技有限公司 面向复杂Web应用的服务化方法
CN110347400B (zh) * 2019-06-13 2023-03-14 西安科技大学 编译加速方法、路由单元和缓存
WO2020259560A1 (zh) * 2019-06-24 2020-12-30 华为技术有限公司 一种插入同步指令的方法及装置
CN111240748B (zh) * 2020-01-17 2023-04-07 西安科技大学 一种基于多核的线程级推测并行的方法
EP3944071B1 (en) * 2020-07-22 2023-06-07 emmtrix Technologies GmbH Computer system and method for validation of parallelized computer programs
US11392384B2 (en) 2020-09-04 2022-07-19 Alibaba Group Holding Limited Methods of breaking down coarse-grained tasks for fine-grained task re-scheduling
CN112230964A (zh) * 2020-10-29 2021-01-15 Oppo广东移动通信有限公司 应用程序开发、应用程序运行方法、装置、设备及介质
US11734017B1 (en) 2020-12-07 2023-08-22 Waymo Llc Methods and systems for processing vehicle sensor data across multiple digital signal processing cores virtually arranged in segments based on a type of sensor
US20230121841A1 (en) * 2021-10-19 2023-04-20 EMC IP Holding Company LLC Facilitating per-cpu reference counting for multi-core systems with a long-lived reference
CN115034950B (zh) * 2022-06-30 2023-10-24 格兰菲智能科技有限公司 线程构造方法及其装置
CN117200301B (zh) * 2023-11-08 2024-01-26 深圳海辰储能科技有限公司 基于储能系统的端口调用方法及装置

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5860107A (en) * 1996-10-07 1999-01-12 International Business Machines Corporation Processor and method for store gathering through merged store operations
JP3139392B2 (ja) * 1996-10-11 2001-02-26 日本電気株式会社 並列処理システム
US5890008A (en) 1997-06-25 1999-03-30 Sun Microsystems, Inc. Method for dynamically reconfiguring a processor
US7752423B2 (en) * 2001-06-28 2010-07-06 Intel Corporation Avoiding execution of instructions in a second processor by committing results obtained from speculative execution of the instructions in a first processor
JP3632635B2 (ja) * 2001-07-18 2005-03-23 日本電気株式会社 マルチスレッド実行方法及び並列プロセッサシステム
US7376800B1 (en) * 2004-09-14 2008-05-20 Azul Systems, Inc. Speculative multiaddress atomicity
US7882339B2 (en) 2005-06-23 2011-02-01 Intel Corporation Primitives to enhance thread-level speculation
US20070234315A1 (en) * 2006-02-09 2007-10-04 International Business Machines Corporation Compiling an application by cluster members
US7404041B2 (en) * 2006-02-10 2008-07-22 International Business Machines Corporation Low complexity speculative multithreading system based on unmodified microprocessor core
WO2007105309A1 (ja) * 2006-03-14 2007-09-20 Fujitsu Limited 並列化プログラム生成プログラム、並列化プログラム生成装置、及び並列化プログラム生成方法
CA2707680A1 (en) * 2006-03-14 2007-09-20 Transgaming Inc. General purpose software parallel task engine
US7849290B2 (en) * 2007-07-09 2010-12-07 Oracle America, Inc. Store queue architecture for a processor that supports speculative execution

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20150023706A (ko) * 2012-06-15 2015-03-05 소프트 머신즈, 인크. Store 상위 서열에 기초하여 상이한 스레드들로부터의 포워딩을 구현하는 스레드에 무관한 load store 버퍼
KR20170015528A (ko) * 2012-06-15 2017-02-08 소프트 머신즈, 인크. 스토어 상위 서열에 기초하여 상이한 스레드들로부터의 포워딩을 구현하는 스레드에 무관한 로드 스토어 버퍼
US9904552B2 (en) 2012-06-15 2018-02-27 Intel Corporation Virtual load store queue having a dynamic dispatch window with a distributed structure
US9928121B2 (en) 2012-06-15 2018-03-27 Intel Corporation Method and system for implementing recovery from speculative forwarding miss-predictions/errors resulting from load store reordering and optimization
US9965277B2 (en) 2012-06-15 2018-05-08 Intel Corporation Virtual load store queue having a dynamic dispatch window with a unified structure
US9990198B2 (en) 2012-06-15 2018-06-05 Intel Corporation Instruction definition to implement load store reordering and optimization
US10019263B2 (en) 2012-06-15 2018-07-10 Intel Corporation Reordered speculative instruction sequences with a disambiguation-free out of order load store queue
US10048964B2 (en) 2012-06-15 2018-08-14 Intel Corporation Disambiguation-free out of order load store queue
US10592300B2 (en) 2012-06-15 2020-03-17 Intel Corporation Method and system for implementing recovery from speculative forwarding miss-predictions/errors resulting from load store reordering and optimization
US9170919B2 (en) 2012-09-07 2015-10-27 Samsung Electronics Co., Ltd. Apparatus and method for detecting location of source code error in mixed-mode program
KR101484600B1 (ko) * 2013-05-28 2015-01-22 부산대학교 산학협력단 카운터 기반 멀티 사이클 프로세서 제어 장치
KR20220037721A (ko) * 2020-09-18 2022-03-25 국방과학연구소 소스코드 재건 및 최적화 방법 및 이를 위한 장치

Also Published As

Publication number Publication date
CN102171650A (zh) 2011-08-31
WO2010060084A3 (en) 2010-09-10
US8909902B2 (en) 2014-12-09
JP5547208B2 (ja) 2014-07-09
BRPI0920541A2 (pt) 2018-11-06
WO2010060084A2 (en) 2010-05-27
JP2012508939A (ja) 2012-04-12
US20100269102A1 (en) 2010-10-21
CN102171650B (zh) 2014-09-17
KR101292439B1 (ko) 2013-08-05

Similar Documents

Publication Publication Date Title
KR101292439B1 (ko) 순차적 프로그램을 다수의 스레드로 분해하고 이 스레드를 실행하며 순차적 실행을 재구성하는 장치, 방법 및 머신-판독가능 저장 매체
US10621092B2 (en) Merging level cache and data cache units having indicator bits related to speculative execution
US20100274972A1 (en) Systems, methods, and apparatuses for parallel computing
US10725755B2 (en) Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
US8612949B2 (en) Methods and apparatuses for compiler-creating helper threads for multi-threading
US9189233B2 (en) Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
EP1668500B1 (en) Methods and apparatuses for thread management of multi-threading
US10949200B2 (en) Methods and apparatus for executing data-dependent threads in parallel
US20090217020A1 (en) Commit Groups for Strand-Based Computing
KR20130063004A (ko) 하드웨어 제한에 기초한 조절가능한 트랜잭션 크기를 이용하여 코드를 동적으로 최적화하는 장치, 방법 및 시스템
Stone et al. Address-indexed memory disambiguation and store-to-load forwarding
Madriles et al. Boosting single-thread performance in multi-core systems through fine-grain multi-threading
Sharafeddine et al. Disjoint out-of-order execution processor
Garg et al. Speculative parallelization in decoupled look-ahead
KR101531455B1 (ko) 하드웨어 및 소프트웨어 시스템이 자동으로 프로그램을 복수의 병렬 스레드들로 분해하는 시스템들, 장치들, 및 방법들
Warg Techniques to reduce thread-level speculation overhead
Packirisamy et al. Supporting speculative multithreading on simultaneous multithreaded processors
Purser et al. Slipstream memory hierarchies
Mutlu Efficient runahead execution processors
Singh et al. CELLO: Compiler-Assisted Efficient Load-Load Ordering in Data-Race-Free Regions
WO2014003974A1 (en) Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
Purser Slipstream processors
Packirisamy Exploring efficient architecture design for thread-level speculation—Power and performance perspectives
Sohi et al. Speculatively Multithreaded Architectures
Madriles Gimeno Mitosis based speculative multithreaded architectures

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: 20160630

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20170704

Year of fee payment: 5

LAPS Lapse due to unpaid annual fee