KR20210021521A - 트랜잭션 메모리를 지원하는 장치에서의 로드 전용 명령 처리 - Google Patents

트랜잭션 메모리를 지원하는 장치에서의 로드 전용 명령 처리 Download PDF

Info

Publication number
KR20210021521A
KR20210021521A KR1020217000307A KR20217000307A KR20210021521A KR 20210021521 A KR20210021521 A KR 20210021521A KR 1020217000307 A KR1020217000307 A KR 1020217000307A KR 20217000307 A KR20217000307 A KR 20217000307A KR 20210021521 A KR20210021521 A KR 20210021521A
Authority
KR
South Korea
Prior art keywords
transaction
load
processing
address
given
Prior art date
Application number
KR1020217000307A
Other languages
English (en)
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 KR20210021521A publication Critical patent/KR20210021521A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30043LOAD or STORE instructions; Clear instruction
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/30087Synchronisation or serialisation instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • G06F9/3834Maintaining memory consistency
    • 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, 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
    • 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, look ahead
    • G06F9/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3858Result writeback, i.e. updating the architectural state or memory
    • G06F9/38585Result writeback, i.e. updating the architectural state or memory with result invalidation, e.g. nullification
    • G06F9/3859
    • 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/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/526Mutual exclusion algorithms
    • G06F9/528Mutual exclusion algorithms by using speculative mechanisms

Abstract

주어진 어드레스에 대한 배타적 액세스를 추적하기 위해 배타적 모니터 표시를 사용하여 트랜잭션 메모리 및 로드/저장 전용 명령들을 지원하는 장치가 설명된다. 주어진 트랜잭션 내에서 실행되는, 로드 타겟 어드레스를 지정하는 미리 결정된 유형의 로드 명령에 응답하여, 로드 타겟 어드레스에 대해 이전에 설정된 배타적 모니터 표시가 클리어된다. 로드 전용 명령에 응답하여, 주어진 어드레스가 어드레스들의 작업 세트 중 하나로서 지정되는 트랜잭션에 대해 중단이 트리거된다. 이것은 비트랜잭션 스레드에 로드 추론이 있더라도 트랜잭션 스레드와 비트랜잭션 스레드 간의 상호 배제를 유지하는 데 도움이 된다.

Description

트랜잭션 메모리를 지원하는 장치에서의 로드 전용 명령 처리
본 기술은 데이터 처리의 분야에 관한 것이다. 특히, 본 기술은 트랜잭션 메모리를 지원하는 데이터 처리 장치에 관한 것이다.
데이터 처리 시스템은 데이터 처리의 다수의 스레드(threads)를 실행할 수 있다. 때로는 스레드가 공유 리소스(shared resource)에 액세스할 필요가 있을 수 있으며 데이터 처리 동작의 특성은 스레드가 공유 리소스와 상호 작용하기 시작하면, 한 세트의 동작이 또 다른 스레드가 그 사이에 리소스에 액세스하는 일없이 리소스를 사용하여 원자적으로 완료해야 하는 것일 수 있다.
제1 스레드에서의 코드의 임계 섹션(cirical section)이 제2 스레드에서의 코드의 임계 섹션에 대해 원자적으로 수행되는 속성을 "상호 배제(mutual exclusion)"라고 할 수 있다. 임계 섹션은 각각의 스레드에서 동일한 시퀀스의 명령을 포함할 수 있거나, 둘 다 공유 리소스를 업데이트하는 서로 다른 코드 섹션을 포함할 수 있다. 수행되는 두 임계 섹션의 결과가 임계 섹션을 수행하는 제1 스레드와 동일하고 그 다음 제1 스레드에서의 임계 섹션의 결과를 사용하여 그것의 임계 섹션을 수행하는 제2 스레드와 동일한 것이거나, 반대로 결과가, 제1 스레드가 제1 스레드에서의 공유 리소스를 처리하기 위해 제2 스레드에서의 임계 섹션의 결과를 사용하는 것인 경우에 상호 배제가 충족될 수 있다. 제1 및 제2 스레드의 임계 섹션이 모두 병렬로 처리되지만, 한 개의 스레드에서의 임계 섹션이 다른 스레드에서의 임계 섹션에서 발생하는 공유 리소스의 업데이트된 값을 고려하지 않는 결과는 상호 배제를 위반할 수 있다.
스레드 간의 상호 배제를 유지하는 한 가지 기술은 잠금(locks)을 사용하여 적어도 하나의 타겟 리소스에 대한 배타적 액세스(exclusive access)를 제어하는 것이다. 예를 들어, 한 스레드가 특정 어드레스 영역의 데이터에 액세스하기 시작하면, 스레드가 잠금 변수(lock variable)를 설정하여 잠금 소유권을 주장한 다음, 잠금 소유 스레드가 잠금 소유권을 갖고 있는 동안, 잠금 변수를 체크하는 다른 스레드는 잠금이 이미 요청되었으므로 해당 어드레스 영역과 상호 작용하는 코드의 섹션에 들어갈 수 없다고 결정할 수 있다. 이러한 잠금 기반 접근방식은, 각 스레드가 어떤 충돌도 발생할 수 없음을 보장하는 잠금의 소유권을 가지고 있지 않는 한, 각 스레드가 기본적으로 또 다른 스레드와의 충돌이 발생할 수 있기 때문에 공유 리소스에 액세스하는 코드의 섹션에 들어갈 수 없다고 가정한다는 점에서 비관적으로 볼 수 있다. 그러나, 종종 잠금 식별자는 여러 리소스(예를 들면, 어드레스 범위)에 대한 배타적 액세스를 제어할 수 있으므로, 한 스레드가 잠금 변수로 보호되는 리소스의 세트 내의 특정 리소스에 액세스하는 경우, 또 다른 스레드가 확실히 동일한 리소스에 액세스할 것이라는 것은 보장되지 않는다. 따라서, 잠금 기반 접근방식은, 스레드 간의 충돌이 드문 경우, 공유 리소스를 사용하는 코드의 임계 섹션에 들어가기 전에 스레드가 불필요하게 잠금이 해제될 때까지 대기할 수 있기 때문에 성능이 저하될 수 있다.
공유 리소스에 액세스하는 스레드 간의 충돌을 처리하기 위한 보다 낙관적 인 접근방식은 트랜잭션 메모리 지원을 사용하는 것이다. 데이터 처리 시스템은 처리 회로에 의한 데이터 처리의 스레드 내에서 트랜잭션의 실행을 지원하는 회로를 가질 수 있다. 트랜잭션은 트랜잭션의 시작을 표시하는 트랜잭션 시작 명령과 트랜잭션의 종료를 표시하는 트랜잭션 종료 명령 사이에서 실행되는 스레드의 명령일 수 있다. 트랜잭션 시작 및 종료 명령 사이에서, 처리 회로는 개입 명령(intervening instructions)를 추론적으로 실행하고 트랜잭션 종료 명령에 도달할 때까지 추론적으로 이들 실행된 명령의 결과의 커밋(commitment)을 방지할 수 있다. 트랜잭션 시작 명령을 실행한 후 (트랜잭션 종료 명령에 도달하기 전에) 중단 이벤트(abort event)가 발생하면 트랜잭션이 중단되고 추론 결과(speculative results)가 파기될 수 있다. 트랜잭션을 중단하는 데는 여러 가지 이유가 있을 수 있지만, 한 가지 이유는 또 다른 스레드로 만든 메모리 액세스와 충돌이 검출된 것일 수 있다. 따라서, 이 접근방식을 사용하면 각 스레드는 다른 스레드와의 어떤 충돌도 발생하지 않을 것이라고 가정하고 코드의 임계 섹션 처리를 낙관적으로 시작할 수 있으며, 충돌이 검출되지 않고 임계 섹션의 끝에 도달하면 트랜잭션의 결과를 커밋(committed)할 수 있다. 충돌이 드문 경우에, 트랜잭션 메모리 지원을 사용하면 더 많은 스레드가 그들 코드의 임계 섹션을 동시에 처리할 수 있게 하여 (잠금 기반 접근 방식에 비해) 성능을 향상시킬 수 있다.
적어도 일부 예는,
데이터 처리의 스레드들을 처리하는 처리 회로와,
상기 처리 회로에 의해 처리된 스레드 내에서 트랜잭션의 실행을 지원하는 트랜잭션 메모리 지원 회로를 구비하는 장치를 제공하고, 상기 트랜잭션은 트랜잭션 시작 명령과 트랜잭션 종료 명령 사이에서 추론적으로 실행된 스레드의 명령들을 포함하며, 상기 처리 회로는 트랜잭션 종료 명령이 도달될 때까지 추론적으로 실행된 명령들의 결과의 커밋(commitment)을 방지하도록 구성되고, 상기 트랜잭션 메모리 지원 회로는 또 다른 스레드로부터 상기 트랜잭션에 대해 추적된 어드레스들의 작업 세트(working set of addresses) 중 하나에 대한 충돌 액세스를 검출하는 것에 응답하여 상기 트랜잭션의 중단을 트리거하는 충돌 검출 회로를 구비하며,
주어진 어드레스를 지정하는 로드 전용 명령(load-exclusive instruction)에 응답하여, 상기 처리 회로는 상기 주어진 어드레스에 대한 배타적 모니터 표시(exclusive monitor indication)를 설정하도록 구성되고,
상기 주어진 어드레스를 지정하는 저장 전용 명령(store-exclusive instruction)에 응답하여, 상기 처리 회로는 상기 주어진 어드레스에 더 이상 배타적 모니터 표시가 설정되어 있지 않을 때 저장 전용 실패 표시를 리턴하도록 구성되며,
주어진 트랜잭션 내에서 실행되는 로드 타겟 어드레스를 지정하는 미리 결정된 유형의 로드 명령에 응답하여, 상기 처리 회로는 로드 타겟 어드레스에 대해 이전에 설정된 배타적 모니터 표시의 클리어링을 트리거하도록 구성되고,
상기 로드 전용 명령에 응답하여, 상기 처리 회로 및 상기 트랜잭션 메모리 지원 회로 중 적어도 하나는 상기 주어진 어드레스가 어드레스들의 작업 세트 중 하나로서 지정되는 트랜잭션의 중단을 트리거하도록 구성된다.
적어도 일부 예는,
주어진 어드레스를 지정하는 로드 전용 명령에 응답하여, 주어진 어드레스에 대한 배타적 모니터 표시를 설정하는 단계와,
주어진 어드레스를 지정하는 저장 전용 명령에 응답하여, 주어진 어드레스에 더 이상 배타적 모니터 표시가 설정되어 있지 않을 때 저장 전용 실패 표시를 리턴하는 단계와,
트랜잭션 내에서 실행되는, 로드 타겟 어드레스를 지정하는 미리 결정된 유형의 로드 명령에 응답하여, 로드 타겟 어드레스에 대해 이전에 설정된 배타적 모니터 표시를 클리어하는 단계를 포함하는 데이터 처리 방법을 제공하고, 상기 트랜잭션은 트랜잭션 시작 명령과 트랜잭션 종료 명령 사이에서 추론적으로 실행된 주어진 스레드의 명령들을 포함하며, 트랜잭션 종료 명령이 도달될 때까지 추론적으로 실행된 명령들의 결과의 커밋을 방지하고, 여기서 또 다른 스레드로부터 상기 트랜잭션에 대해 추적된 어드레스들의 작업 세트 중 하나에 대한 충돌 액세스를 검출하는 것에 응답하여 상기 트랜잭션을 중단하며,
상기 로드 전용 명령에 응답하여, 주어진 어드레스가 어드레스들의 작업 세트 중 하나로서 지정되는 트랜잭션의 중단을 트리거하는 단계를 더 포함한다.
적어도 일부 예는 데이터 처리의 스레드들의 실행을 위한 명령 실행 환경을 제공하는 호스트 데이터 처리 장치를 제어하기 위한 컴퓨터 프로그램을 제공하고, 상기 컴퓨터 프로그램은,
데이터 처리의 스레드들을 처리하는 처리 프로그램 로직과,
상기 처리 프로그램 로직에 의해 처리된 스레드 내에서 트랜잭션의 실행을 지원하는 트랜잭션 메모리 프로그램 로직을 구비하고, 상기 트랜잭션은 트랜잭션 시작 명령과 트랜잭션 종료 명령 사이에서 추론적으로 실행된 스레드의 명령들을 포함하며, 상기 처리 프로그램 로직은 트랜잭션 종료 명령이 도달될 때까지 추론적으로 실행된 명령들의 결과의 커밋을 방지하도록 구성되고, 상기 트랜잭션 메모리 프로그램 로직은 또 다른 스레드로부터 상기 트랜잭션에 대해 추적된 어드레스들의 작업 세트 중 하나에 대한 충돌 액세스를 검출한 것에 응답하여 상기 트랜잭션의 중단을 트리거하는 충돌 검출 프로그램 로직을 포함하며,
주어진 어드레스를 지정하는 로드 전용 명령에 응답하여, 상기 처리 프로그램 로직은 주어진 어드레스에 대한 배타적 모니터 표시를 설정하도록 구성되고,
주어진 어드레스를 지정하는 저장 전용 명령에 응답하여, 상기 처리 프로그램 로직은 주어진 어드레스에 더 이상 배타적 모니터 표시가 설정되어 있지 않을 때 저장 전용 실패 표시를 리턴하도록 구성되며,
주어진 트랜잭션 내에서 실행되는, 로드 타겟 어드레스를 지정하는 미리 결정된 유형의 로드 명령에 응답하여, 상기 처리 프로그램 로직은 로드 타겟 어드레스에 대해 이전에 설정된 배타적 모니터 표시의 클리어링을 트리거하도록 구성되고,
상기 로드 전용 명령에 응답하여, 상기 처리 프로그램 로직 및 상기 트랜잭션 메모리 프로그램 로직 중 적어도 하나는 주어진 어드레스가 어드레스들의 작업 세트 중 하나로서 지정되는 트랜잭션의 중단을 트리거하도록 구성된다.
적어도 일부 예는,
복수의 처리 요소들과 메시지를 교환하는 복수의 인터페이스와,
복수의 처리 요소들 사이의 코히런시(coherency)를 관리하도록 구성된 제어 회로를 구비하는 인터커넥트를 제공하고,
주어진 어드레스에 대한 배타적 액세스를 추적하기 위해 주어진 어드레스와 관련된 배타적 모니터 표시의 설정을 나타내는 주어진 처리 요소로부터의 배타적 모니터 설정 메시지에 응답하여, 상기 제어 회로는 적어도 하나의 다른 처리 요소에 배타적 모니터 설정 메시지를 전송하는 인터페이스를 트리거하도록 구성되며,
제1 유형의 판독 요청에 의해 지정된 타겟 어드레스와 관련된 판독 데이터 값의 리턴을 요청하는 제1 처리 요소로부터 수신된 미리 결정된 유형의 판독 요청에 응답하여, 상기 제어 회로는 타겟 어드레스와 관련된 배타적 모니터 표시의 취소를 트리거하기 위해 적어도 하나의 다른 처리 요소에 배타적 모니터 취소 메시지를 전송하는 인터페이스를 트리거하도록 구성된다.
본 기술의 추가 국면, 특징 및 이점은 첨부 도면과 함께 판독되어야 하는 이하의 실시 예의 설명으로부터 명백해질 것이다.
도 1은 다중 처리 요소 및 인터커넥트를 갖는 데이터 처리 시스템의 예를 개략적으로 도시한다.
도 2는 트랜잭션 메모리 지원 회로를 포함하는 처리 요소의 예를 도시한다.
도 3은 트랜잭션 메모리를 지원하는 시스템에서 트랜잭션을 처리하는 예를 도시한다.
도 4는 잠금을 사용하여 비트랜잭션 방식으로 도 3의 트랜잭션과 동등한 동작을 실행하기 위한 대체 코드 시퀀스를 도시한다.
도 5 ~ 8은 로드 추측(load speculation)이 있을 때 로드/저장 전용 명령과 트랜잭션 간의 상호작용이 상호 배제의 손실을 유발할 수 있는 방법을 나타내는 코드 예를 도시한다.
도 9는 로드 전용 명령을 처리하는 방법을 나타내는 흐름도이다.
도 10은 저장 전용 명령을 처리하는 방법을 나타내는 흐름도이다.
도 11은 저장 명령을 처리하는 방법을 나타내는 흐름도이다.
도 12는 트랜잭션 내에서 실행되는 로드 명령을 처리하는 방법을 나타내는 흐름도이다.
도 13 ~ 15는 인터커넥트에 의해 지원되는 코히런시 메시지(coherency)의 예를 도시한다.
도 16은 사용할 수 있는 시뮬레이터 구현을 도시한다.
몇 가지 구체적인 예가 아래에 나와 있다. 청구 범위는 이러한 특정 예들에 제한되지 않음을 이해할 것이다.
처리 회로는 처리 회로에 의해 처리된 스레드 내에서 트랜잭션의 실행을 지원하는 트랜잭션 메모리 지원 회로를 가질 수 있다. 트랜잭션은 트랜잭션 시작 명령과 트랜잭션 종료 명령 사이에서 추론적으로 실행되는 스레드의 명령들을 포함한다. 처리 회로는 트랜잭션 종료 명령에 도달할 때까지 추론적으로 실행된 명령들의 결과의 커밋(commitment)을 방지할 수 있다. 트랜잭션 메모리 지원 회로는 또 다른 스레드로부터 트랜잭션에 대해 추적된 어드레스의 작업 세트 중 하나에 대한 충돌 액세스를 검출하는 것에 응답하여 트랜잭션의 중단을 트리거하는 충돌 검출 회로를 포함할 수 있다.
트랜잭션을 중단해야 하는 경우 추측 결과가 풀릴 수 있도록 트랜잭션 메모리 지원 회로가 트랜잭션 내에서 명령들의 추측 실행(speculative)을 제공하므로, 트랜잭션을 실행하는 두 개의 스레드 간의 충돌을 피하기 위해 잠금 변수를 사용할 필요가 없다. 그러나, 비트랜잭션 기반 접근방식으로 실행중인 몇몇 스레드가 있을 수도 있다. 예를 들어, 그러한 비트랜잭션 스레드는 트랜잭션을 사용하지 않고 원래 기록되거나 컴파일된 코드의 섹션을 실행하는 스레드일 수 있다(어떤 트랜잭션 시작/ 종료 명령도 포함하지 않음). 대안으로, 비트랜잭션 스레드는 트랜잭션 기반 모드에서 이전에 명령들을 처리했지만, 트랜잭션이 자주 중단 이벤트(예를 들어, 다른 스레드와의 충돌로 인해)를 만나서 처리가 이제 비트랜잭션 기반 모드로 전환된 스레드들을 포함할 수 있다. 간결을 위해, "비트랜잭션 스레드"라는 용어는, 트랜잭션을 전혀 사용하지 않는 스레드, 또는 트랜잭션을 사용하는 특정 횟수의 실행 시도가 실패했을 때 선택된 폴백(fallback) 경로를 현재 실행중인 트랜잭션 스레드를 지칭하도록 아래에 사용된다.
그러한 비트랜잭션 스레드가 적어도 하나의 타겟 리소스에 대한 배타적 액세스를 필요로 하는 경우, 종종 잠금 변수를 사용하여 적어도 하나의 타겟 리소스에 대한 배타적 액세스를 제어할 수 있다. 반직관적으로, 트랜잭션 스레드는 트랜잭션 기반 코드 경로(폴백 코드 경로뿐만 아니라) 내에서 잠금 변수를 여전히 확인할 필요가 있을 수 있는데, 왜냐하면 비트랜잭션 스레드에 대한 올바른 결과를 보장하기 위해서는, 트랜잭션 스레드가 잠금을 유지하는 동안 트랜잭션 스레드가 공유 리소스에 대한 기록을 포함하는 트랜잭션을 커밋하지 않도록 해야 하기 때문이다. 따라서, 종종 트랜잭션 모드에서 실행된 스레드의 트랜잭션 내에서도, 트랜잭션은 잠금 변수를 확인하여 어떤 다른 스레드가 리소스에 대한 배타적 액세스를 유지하는지 여부 판정하는 명령들을 여전히 포함할 수 있고, 현재 또 다른 스레드가 잠금을 유지하고 있으면, 그 다음 동작을 연기하거나, 트랜잭션 커밋을 방지하거나, 트랜잭션을 중단한다.
비트랜잭션 스레드가 잠금을 확인하고 취득하는 한 가지 방법은 로드 전용 및 저장 전용 명령을 사용하는 것일 수 있다. 주어진 어드레스를 지정하여 로드 전용 명령(load-exclusive instruction)가 실행될 때, 처리 회로는 주어진 어드레스에 대한 배타적 모니터 표시를 설정할 수 있다. 로드 전용 명령은 또한 주어진 어드레스에 해당하는 저장 위치로부터 판독된 값을 리턴할 수도 있다. 주어진 어드레스를 지정하는 저장 전용 명령이 실행될 때, 처리 회로는 주어진 어드레스에 더 이상 배타적 모니터 표시가 설정되어 있지 않을 때 저장 전용 실패 표시를 리턴할 수 있다. 한편, 저장 전용 명령을 실행할 때 배타적 모니터 표시가 여전히 설정되어 있는 경우에는, 주어진 어드레스에 업데이트된 값을 기록하는 저장 동작을 수행하고 저장 전용 성공 표시를 리턴할 수 있다. 주어진 어드레스와 연관된 데이터 값을 업데이트하기 위해 저장 동작을 실행하는 또 다른 스레드, 또는 주어진 어드레스를 지정하는 또 다른 로드 전용 명령을 실행하는 또 다른 스레드와 같이, 다양한 이벤트가 이전에 설정된 배타적 모니터 표시를 클리어하도록 트리거할 수 있다. 이전에 설정된 배타적 모니터 표시를 클리어하는 것을 요구하는 이벤트 추적은, 이들 이벤트를 확인하기 위해 프로그램 코드로 실행되는 명시적인 명령들을 요구하는 일없이, 데이터 처리 시스템의 마이크로 아키텍처(micro-architecture)에 의해 수행될 수 있다. 따라서, 비트랜잭션 스레드는 로드 전용 명령을 사용하여 잠금 변수를 판독하고 배타적 모니터를 설정할 수 있으며, 그 후에 그 다음의 저장 전용 명령은 잠금 변수에 업데이트된 값을 기록함으로써 잠금을 요구하려고 시도할 할 수 있으며, 이 경우 배타적 모니터가 더 이상 설정되지 않을 수도 있으므로 그 동안 또 다른 스레드가 이미 잠금을 요구했으면 실패할 수도 있다. 배타적 모니터 표시를 사용하는 로드 및 저장 전용 명령에 대한 지원은 스레드 간의 상호 배제 시행을 단순화할 수 있다.
따라서, 일부 스레드는 로드/저장 전용 명령에 의해 사용된 배타적 모니터 표시를 사용해 일부 리소스를 상호 배제를 시행하여, 또 다른 스레드로부터의 간섭없이 원자적으로 사용할 수 있도록 현재 스레드에 대해 해당 리소스를 남겨 둘 수 있다. 다른 스레드들은 트랜잭션 메모리를 사용하여 스레드 간의 그러한 상호 배제를 시행할 수 있다. 트랜잭션 스레드와 비트랜잭션 스레드 간의 올바른 상호 작용을 보장하기 위해, 트랜잭션 스레드는 비트랜잭션 스레드에서 로드/저장 전용 명령에 의해 액세스된 잠금 변수를 확인하기 위한 명령들을 포함할 수 있다.
그러나, 본 발명자들은 일부 시나리오에서 트랜잭션이 잠금 변수를 확인하고 또 다른 스레드가 이미 잠금을 유지하고 있으면 공유 리소스에 대한 기록이 커밋되는 것을 방지하도록 배열된 경우에도, 때때로 로드 및 저장 전용 명령을 사용하여 상호 배제를 시행하는 스레드들에 대한 상호 배제가 손실될 수 있음을 인식했다. 이것은 일부 마이크로 아키텍처가 로드가 실제로 필요한지 여부를 알기 전에 로드 명령들의 추측 실행을 지원할 수 있기 때문이다. 따라서 어떤 경우에는 처리 회로의 마이크로 아키텍처가 이전 저장 전용 명령이 성공적으로 완료되었는지 여부를 확인하는 명령 앞에 비트랜잭션 스레드의 다음 로드 명령을 가져올 수 있다. 모든 스레드가 상호 배제를 시행하기 위해 로드/저장 전용 명령을 사용하는 비트랜잭션 스레드인 경우, 이는 문제가 되지 않는데, 왜냐하면 결국 저장 전용 명령이 실패한 것으로 판정되면 이미 추론적으로 실행된 다음 로드 명령이 잘못 실행된 것으로 판정될 것이고 그 로드(load)의 모든 결과는 폐기될 수 있기 때문이다.
그러나, 상호 배제를 시행하기 위해 트랜잭션을 사용하여 실행하는 다른 스레드도 있는 경우에는, 무분별하게 추론적으로 실행된 더 젊은 로드(younger load)와 잠금을 설정하는 더 오래된 저장 전용 명령(older store-exclusive insturction) 사이의 기간 내에 트랜잭션이 시작 및 종료될 수 있다. 이 경우, 트랜잭션이 실행되었을 때 비트랜잭션 스레드에 의해 잠금이 요청되지 않았으므로 트랜잭션이 비트랜잭션 스레드의 동작을 검출하지 못하기 때문에 상호 배제가 손실될 수 있지만, 트랜잭션 스레드가 잠금 기반 폴백 코드 경로에 의존하지 않는 한 트랜잭션 스레드는 일반적으로 잠금 자체를 요구하지 않으므로 비트랜잭션 스레드는 트랜잭션 스레드를 검출하지 못한다. 따라서 더 젊은 로드의 추측 실행이 커밋될 수 있으며, 트랜잭션이 제공한 업데이트된 값보다는, 트랜잭션이 실행되기 전에 존재했던 공유 리소스의 오래된 값(stale value)을 비트랜잭션 스레드가 사용하게 할 수 있다. 따라서, 트랜잭션의 효과가 사실상 손실될 수 있으며 상호 배제를 위반할 수 있다.
이 문제를 완화하는 한 가지 가능한 방법은 비트랜잭션 스레드와 관련된 코드 내에 추론 배리어 명령(speculation barrier instruction)를 포함하는 것이다. 추론 배리어 명령은 처리 회로의 마이크로 아키텍처가 배리어보다 앞선 이전의 모든 명령이 완료될 때까지 배리어 명령을 따르는 명령을 실행하지 못하도록 요구할 수 있다. 잠금을 요구하기 위한 저장 전용 명령 이후와 코드의 임계 섹션과 관련된 공유 데이터를 로드하는 다음 로드 명령 이전에 배리어를 포함함으로써, 이는 저장 전용 명령에 앞서 후속 로드의 추론적 호이스팅(speculative hoisting)을 방지함으로써, 코드의 임계 섹션과 관련된 값을 판독하기 전에 저장 전용 명령의 결과를 알 수 있다. 이것은, 트랜잭션 스레드가 동일한 공유 리소스를 사용하여 트랜잭션을 시작하고 저장 전용 명령이 해결되기 전에 트랜잭션이 완료하더라도, 비트랜잭션 스레드의 후속 로드는 트랜잭션이 실행되기 전에 존재하는 값보다는 오히려 트랜잭션 완료로 인한 값을 로드하여, 상호 배제를 유지할 것이라는 것을 의미한다.
그러나, 이러한 배리어를 포함할 때의 문제점은, 트랜잭션 스레드와 충돌이 없는 경우, 이후 로드가 더 이른 타이밍에 추론적으로 실행되는 것을 방지하기 때문에, 비트랜잭션 스레드의 성능을 저하시킬 수 있는데, 이는 불필요하게 메모리에 대한 액세스를 지연시킴으로써 성능을 저하시킬 수 있다는 것이다. 또한, 이러한 추가 배리어 명령들을 포함하도록 코드를 다시 작성하면 소프트웨어 개발 및 배포 오버헤드가 상대적으로 높아질 수 있다. 예를 들어, 상호 배제를 시행하기 위해 로드 및 저장 전용 명령을 사용하여 작성된, 어떤 트랜잭션 메모리 지원도 없는 시스템용으로 작성된 레거시 코드(legacy code)는 더 이상 트랜잭션 메모리를 지원하는 시스템에서 안전하게 실행할 수 없으므로 이러한 코드는, 바람직하지 않을 수 있는, 배리어를 포함하도록 다시 작성될 필요가 있다.
추론 배리어가 필요하지 않도록 하는 방법은, 로드 타겟 어드레스를 지정하는 주어진 트랜잭션에서 실행될 때, 처리 회로를 트리거하여 로드 전용 명령에 응답하여 로드 타겟 어드레스에 대해 이전에 설정된 모든 배타적 모니터 표시의 클리어링(clearing)을 트리거하는 미리 결정된 유형의 로드 명령을 제공하는 것이다. 로드/저장 전용을 구현하는 비교 시스템에서, 배타적 모니터 표시가 설정된 어드레스로의 로드는, 일반적으로 배타적 모니터를 클리어하지 않는데, 왜냐하면 로드가 배타적 모니터링 표시와 관련된 어드레스에서 데이터의 값을 변경할 것으로 예상되지 않으므로, 배타적 모니터가 추적한 어드레스에 대한 액세스의 배타성(exclusivity)을 방해할 위험이 있다고 간주되지 않기 때문이다. 그러나, 트랜잭션 내에서 미리 정해진 유형의 로드가 실행될 때 배타적 모니터 표시를 클리어함으로써, 즉 트랜잭션이 비트랜잭션 스레드에서 잠금을 요구하기 위해 저장 전용 명령이 실행되기 전에 트랜잭션이 실행되더라도, 비트랜잭션 스레드가 트랜잭션의 개입 동작을 검출하여, 상호 배제의 손실을 방지할 수 있다(결과적으로 저장 전용 명령의 실패로 인해 임계 섹션으로부터의 로드가 이미 추론적으로 실행된 경우에도, 공유 리소스의 오래된 값을 사용하여 임계 섹션으로 진행하는 비트랜잭션 스레드가 방지되기 때문에).
또한, 로드 전용 명령에 응답하여, 처리 회로 및/또는 트랜잭션 메모리 지원 회로는 로드 전용 명령에 의해 지정된 주어진 어드레스가 트랜잭션과 관련된 어드레스의 작업 세트 중 하나로서 지정되는 트랜잭션의 중단을 트리거할 수 있다. 즉, 트랜잭션 스레드와 비트랜잭션 스레드 사이의 상대적 타이밍이, 비트랜잭션 스레드에서 로드 전용 명령이 실행되기 전에 트랜잭션이 시작되고 트랜잭션 스레드가 공유 변수를 업데이트하기 전에 추론적으로 수행되는 공유 변수의 로드를 야기할 수 있는 비트랜잭션 스레드에서 로드 추론(load speculation)이 수행되도록 한 것이더라도, 트랜잭션을 중단함으로써, 트랜잭션 스레드에 대한 공유 변수의 업데이트가 발생하지 않도록 하여, 상호 배제를 보장한다. 비트랜잭션 스레드에서의 임계 섹션에 의해 행해진 업데이트가 이미 수행되었으면 나중에 트랜잭션을 다시 시도할 수 있다.
따라서, 비트랜잭션 스레드에서 로드/저장 전용 명령의 실행과 트랜잭션 스레드에서의 트랜잭션 사이의 상대적 타이밍에 관계없이, 일부 로드 명령들이 순서대로 추론적으로 실행되더라도 상호 배제가 시행될 수 있다. 이를 통해 추가 배리어를 포함하기 위해 비트랜잭션 코드를 다시 작성하지 않고도, 배타적 모니터 표시에 의존하는 스레드와 트랜잭션을 사용하는 스레드 간의 안전한 상호연동이 가능하다.
본 출원에서 논의된 기술은 단일 처리 요소를 갖는 장치에서 사용될 수 있다. 예를 들어, 단일 처리 요소는 시간 공유 방식으로 데이터 처리의 다중 스레드를 처리하거나, 다중 스레드로부터의 명령들이 동시에 처리 파이프라인에 존재하는 동시 멀티 스레딩(simultaneous multi-threading:SMT)를 사용할 수 있으며, 분할된 레지스터 세트는 다중 스레드에 대한 아키텍처 상태를 동시에 추적한다.
그러나, 이 기술은 처리 회로가 다수의 처리 스레드를 병렬로 실행할 수 있는 다수의 처리 요소(예를 들면, 프로세서 코어, CPU 또는 GPU)를 포함하는 시스템에서 특히 유용하다. 다수의 처리 요소가 있는 시스템에서는, 하나의 처리 요소가 비 트랜잭션 스레드를 실행하는 또 다른 처리 요소와 병렬로 트랜잭션 스레드를 실행할 수 있다. 이 경우, 위에서 설명한 충돌 유형과 비트랜잭션 스레드 내에서의 추론으로 인한 상호 배제의 잠재적 손실 가능성이 더 높을 수 있으며, 위에서 설명한 기술에 의해 완화될 수 있다.
처리 회로가 2개 이상의 처리 요소를 갖는 시스템에서, 로드 전용 명령이 주어진 처리 요소에서 실행될 때, 주어진 처리 요소는 적어도 하나의 다른 처리 요소로의 메시지 전송을 트리거할 수 있으며, 메시지는 로드 전용 명령에 의해 지정된 주어진 어드레스에 대해 배타적 모니터 표시가 설정되었다는 것을 나타낸다. 일반적으로 배타적 모니터를 지원하는 시스템에서는, 배타적 모니터 표시의 클리어링을 요구하는 이벤트가 멀티프로세서 시스템 내의 다른 처리 요소들에 브로드캐스트될 수 있지만, 다른 처리 요소들에 배타적 모니터 표시의 설정을 브로드캐스트하는 것은 드문 일이다. 그러나, 배타적 모니터 표시가 적어도 하나의 다른 처리 요소로 설정되었음을 나타내는 메시지를 전송함으로써, 이것은 위에서 논의된 바와 같이 어드레스의 작업 세트에서 주어진 어드레스를 갖는 또 다른 처리 요소에서 실행되는 트랜잭션이 중단될 수 있게 한다.
일부 구현에서 배타적 모니터링 표시가 설정되었음을 나타내는 메시지는 로드 전용 명령을 실행하는 주어진 처리 요소 이외의 모든 다른 처리 요소로 브로드캐스트될 수 있다. 그러나, 다른 경우에는, 다른 모든 처리 요소에 메시지를 전송할 필요가 없을 수도 있다. 예를 들어, 일부 처리 요소에는 트랜잭션 메모리 지원 회로가 없을 수 있으므로 트랜잭션을 실행할 수 없고, 그 경우에 메시지를 이러한 처리 요소에 보낼 필요가 없다. 또한, 어떤 경우에는, 다양한 처리 요소를 연결하는 인터커넥트는 스눕 필터(snoop filter) 또는 다른 로직을 포함하여 어떤 처리 요소가 트랜잭션을 실행중인지 또는 처리 요소들에 의해 어떤 어드레스가 캐시/액세스되는지 추적할 수 있으므로, 주어진 어드레스가 주어진 처리 요소에서 트랜잭션에 대해 추적된 어드레스의 작업 세트 내에 있을 수 있는지 여부를 인터커넥트 내부에 보유된 데이터로부터 결정할 수 있고, 그 경우 현재 어떤 트랜잭션도 처리하고 있지 않거나 주어진 어드레스를 포함하지 않는 어드레스의 작업 세트를 갖도록 인터커넥트에서의 로직으로부터 결정될 수 있는 처리 요소들에 대해 배타적 모니터 취소 메시지가 생략될 수 있다.
유사하게, 미리 결정된 유형의 로드 트랜잭션이 주어진 처리 요소에서 실행될 때, 주어진 처리 요소는 로드 타겟 어드레스에 대해 적어도 하나의 다른 처리 요소에 의해 이전에 설정된 배타적 모니터 표시가 클리어되어야 함을 나타내기 위해 적어도 하나의 다른 처리 요소로의 메시지의 전송을 트리거할 수 있어, 비트랜잭션 스레드에 대해 수행된 로드 추론이 있는 경우에도 처리 요소들 전체에 걸쳐 상호 배제가 유지되도록 보장한다.
주어진 트랜잭션 내에서 실행된 미리 결정된 유형의 로드 명령에 응답하여, 처리 회로는 로드 타겟 어드레스를 주어진 트랜잭션에 대한 어드레스의 작업 세트에 추가할 수 있다. 즉, 비트랜잭션 스레드가 이후에 동일한 어드레스에 대한 배타적 모니터를 설정하기 위해 로드 전용 명령을 실행하려고 하면, 상호 배제를 유지하기 위해 트랜잭션이 중단된다.
일부 예에서는, 어드레스의 작업 세트의 추적은 어드레스의 판독 세트(트랜잭션에 의해 판독된 어드레스를 나타냄), 및 어드레스의 기록 세트(트랜잭션에 의해 기록된 어드레스를 나타냄)의 개별 추적을 포함할 수 있다. 예를 들어, 어드레스의 판독/기록 세트는, 연관된 캐시 라인이 주어진 트랜잭션에 대한 각각 판독 세트 또는 기록 세트의 일부인지 여부를 나타내는 캐시에 플래그를 설정함으로써 추적될 수 있다. 판독 및 기록 세트를 개별적으로 추적하는 구현에서, 미리 결정된 유형의 로드는 로드 타겟 어드레스를 어드레스의 판독 세트에 추가하는 것을 트리거할 수 있으며, 로드 전용 명령의 실행은 로드 전용 명령에 의해 지정된 주어진 어드레스가 해당 트랜잭션에 대해 추적된 판독 세트 내에 있는 트랜잭션을 중단하는 것을 트리거할 수 있다.
미리 결정된 유형의 로드 명령을 실행하면 기록 세트 내에 지정된 로드 타겟 어드레스를 가진 다른 트랜잭션이 중단될 수도 있다. 판독 세트에 지정된 로드 타겟 어드레스를 가진 다른 트랜잭션은 미리 결정된 유형의 로드 명령의 실행 후 중단되지 않고 계속될 수 있다. 실제로, 미리 결정된 유형의 로드 명령에 대한 예상 사용 케이스는 비트랜잭션 스레드가 사용한 잠금 변수를 판독하는 것일 수 있으므로, 트랜잭션 스레드들이 잠금 변수에 기록할 필요가 있을 것 같지는 않고(비트랜잭션 폴백 경로로 돌아가지 않는 한), 그래서 미리 결정된 유형의 로드 명령의 어드레스가 트랜잭션에 대해 추적된 기록 세트 내에 있을 가능성은 낮다. 따라서, 다중 트랜잭션이 각각 동일한 잠금 변수를 판독하고 있는 경우, 다중 트랜잭션은 또 다른 트랜잭션의 중단을 야기하는 잠금 변수의 판독없이 병렬로 처리될 수 있어, 잠금 변수를 확인한 결과로 도입된 트랜잭션의 불필요한 직렬화(serializaiton)없이 트랜잭션의 병렬 처리를 허용한다.
미리 결정된 유형의 로드 명령에 더하여, 처리 회로는 또한 주어진 트랜잭션 내에서 실행될 때 로드 타겟 어드레스에 대해 이전에 설정된 임의의 배타적 모니터 표시를 유지하도록 처리 회로를 트리거하는 제2 유형의 로드 명령을 지원할 수 있다. 서로 다른 유형의 로드 명령을 구별함으로써, 이것은 이전에 설정된 배타적 모니터가 클리어되도록 하는 트랜잭션에서 모든 로드를 방지하며, 이로 인해 저장 전용 명령이 더 자주 실패할 수 있으므로 성능이 저하될 수 있다. 로드에 응답하여 배타적 모니터를 클리어하는 것은 위에서 설명한 대로 트랜잭션과 비트랜잭션 스레드를 상호 연동할 때 로드 추론으로 인한 배제의 잠재적 손실을 방지하기 위해 잠금 변수의 로드에 유용할 수 있지만, 다른 로드 동작의 경우 값에 대한 판독 자체가 배타적 모니터가 나타내는 액세스의 배타성을 방해할 만큼 충분하지 않기 때문에 배타적 모니터를 유지하는 것이 바람직할 수 있다(판독은 배타적 모니터와 연관된 어드레스에 저장된 데이터 값을 변경하지 않기 때문에). 예를 들어, 미리 결정된 유형의 로드 명령은 공유 리소스에 대한 액세스를 제어하기 위해 다른 비트랜잭션 스레드가 사용하는 잠금 변수에 액세스하는 트랜잭션 내의 코드의 부분에 사용될 수 있는 반면, 제2 유형의 로드 명령은 공유 리소스로부터 실제로 관심 데이터를 로드하는 트랜잭션 내의 로드에 대해, 원자적으로 실행되어야 하는 코드의 임계 섹션에서 사용될 수 있다.
로드 및 저장 전용 트랜잭션을 실행하는 처리 회로는, 처리 회로가 타겟 어드레스에 대한 배타적 액세스를 제어하기 위한 잠금 변수가 주어진 스레드에 의해 성공적으로 요청되었는지 여부를 확인하기 전에 타겟 어드레스로부터 데이터 값을 로드하기 위한 로드 명령을 추론적으로 실행하는 주어진 스레드를 지원할 수 있다. 즉, 로드 추론으로 인해 저장 전용 명령이 성공적으로 실행되었는지 여부를 평가하는 조건부 명령의 해결 전에 실행되는 로드 명령이 발생할 수 있다. 이러한 로드 추론은 성능을 향상시킬 수 있다. 위에서 논의한 접근 방식은 그러한 추론이 수행되더라도 비트랜잭션 및 트랜잭션 스레드가 여전히 상호 배제를 달성할 수 있음을 보장할 수 있다.
트랜잭션 메모리 지원 회로는 여러 형태를 가질 수 있다. 다양한 중단 이벤트로 인해 충돌 검출 회로가 트랜잭션 종료 명령에 도달하기 전에 트랜잭션의 중단을 트리거할 수 있다. 하나의 예는 충돌 검출 회로가 또 다른 스레드로부터 제1 스레드의 트랜잭션에 대해 추적된 어드레스의 작업 세트 중 하나에 대한 충돌 액세스를 검출하는 경우일 수 있는데, 이는 제1 스레드의 트랜잭션이 중단되도록 트리거할 수 있다. 트랜잭션을 중단시킬 수 있는 기타 이벤트는, 트랜잭션 내에서 실행이 허용되지 않는 유형의 명령의 실행; 예외 이벤트 또는 인터럽트의 발생; 또는 위에서 논의한 대로 어드레스의 작업 세트 내에서 어드레스를 지정하는 로드 전용 명령의 실행을 포함할 수 있다.
트랜잭션 메모리 지원 회로는 충돌 검출 회로뿐 아니라 다른 요소도 포함할 수 있다. 예를 들어, 트랜잭션 메모리 지원 회로는 적어도 하나의 트랜잭션에 대해 추론적으로 실행된 명령들의 결과를 저장하는 추론 결과 저장 회로, 및/또는 트랜잭션이 중단된 경우 복원될 수 있는, 트랜잭션의 트랜잭션 시작 명령에 응답하여 캡처된 아키텍처 상태를 저장하는 복원 상태 저장 회로를 포함할 수 있다. 예를 들어, 추론 결과 저장 회로는 트랜잭션 종료 명령에 응답하여 트랜잭션이 커밋될 때까지 저장 명령들의 결과를 버퍼링할 수 있으므로, 트랜잭션 내의 추론적으로 실행된 저장 명령들은, 트랜잭션이 커밋될 수 있다는 것이 인식될 때까지 메모리 시스템을 오염시키지 않다. 복원 상태 저장 회로는 예를 들어 트랜잭션이 중단될 때 상태가 이전 실행 지점으로 되돌려질 필요가 있는 경우에 트랜잭션의 시작시 존재하는 상태의 체크포인트를 유지하기 위한 레지스터 뱅크 내에 레지스터들을 포함할 수 있다. 대안으로, 복원 상태는 현재 아키텍처 상태를 저장하는 레지스터들과 동일한 레지스터 파일 내의 오래된 체크포인트 아키텍처 상태를 추적하기 위해 레지스터 리네이밍(renaming)을 사용하여 유지될 수 있다.
트랜잭션을 중단하는 또 다른 가능한 이유는, 트랜잭션이 충돌없이 올바르게 진행될 것임을 더 이상 보장할 수 없도록 트랜잭션 메모리 지원 회로가 리소스를 다 써버렸기 때문일 수 있다. 예를 들어, 추론 결과 저장 회로에 저장될 추론 결과의 수가 제공된 스토리지 내에서 이용가능한 용량을 초과하면, 트랜잭션이 중단될 수 있다.
트랜잭션을 중단할 때, 트랜잭션을 다시 실행할 것인지, 또는 비트랜잭션 폴백 경로를 대신 사용할 것인지 여부를 결정하는 것은 소프트웨어에 달려 있다(예를 들어, 잠금 및 로드/저장 전용 명령을 사용). 그러나, 처리 회로의 마이크로 아키텍처는 트랜잭션의 중단의 가능한 이유를 나타내는 힌트를 제공할 수 있으며, 이는 트랜잭션을 다시 실행할 가치가 있는지 또는 폴백 경로를 사용할 가치가 있는지를 판정하기 위해 소프트웨어에 의해 사용될 수 있다(예를 들어, 중단의 원인이 향후 시도가 실패할 가능성이 있다는 것이면).
데이터 처리 스레드들의 실행을 위한 명령 실행 환경을 제공하기 위해 호스트 데이터 처리 장치를 제어하기 위한 대응하는 컴퓨터 프로그램이 제공될 수 있으며, 컴퓨터 프로그램은 데이터 처리의 스레드들을 처리하는 처리 프로그램 로직 및 처리 프로그램 로직에 의해 처리된 스레드 내의 트랜잭션의 실행을 지원하는 트랜잭션 메모리 프로그램 로직을 포함한다(하드웨어 실시 예에 대해 위에서 논의된 트랜잭션에 대한 지원과 유사한 방식으로). 트랜잭션 메모리 프로그램 로직은 또 다른 스레드로부터 트랜잭션에 대해 추적된 어드레스들의 작업 세트 중 하나에 대한 충돌 액세스가 검출될 때 트랜잭션이 중단되도록 트리거하는 충돌 검출 프로그램 로직을 포함할 수 있다. 컴퓨터 프로그램의 프로그램 로직은 위에서 논의된 바와 같이 대응하는 처리 회로 및 트랜잭션 메모리 지원 회로와 유사한 방식으로 로드/저장 전용 명령의 실행 및 미리 결정된 로드 명령에 응답할 수 있다.
따라서, 컴퓨터 프로그램을 실행하는 호스트 컴퓨터에 이들 특징을 제공하는 실제 하드웨어가 없을지라도, 위에서 논의된 특징을 갖는 실제 하드웨어 장치에 의해 제공되는 것과 유사한 명령 환경을, 컴퓨터 프로그램 위에서 실행중인 소프트웨어에 제공하는 컴퓨터 프로그램이 제공될 수 있다. 대신 예를 들어 시뮬레이터 또는 가상 머신일 수 있는, 컴퓨터 프로그램은, 트랜잭션 메모리를 지원하는 장치에서 달성될 수 있는 결과와 호환되는 방식으로, 일반 호스트 데이터 처리 장치가 트랜잭션 메모리를 지원하는 장치에서 실행을 위해 의도된 코드를 실행할 수 있게 하는 프로그램 로직(명령의 세트 또는 데이터 구조 등)을 제공함으로써 하드웨어 아키텍처의 기능을 에뮬레이션할 수 있다.
각각의 처리 요소와 메시지를 교환하기 위한 다수의 인터페이스, 및 처리 요소들 간의 코히런시(coherency)를 관리하기 위한 제어 회로를 갖는 인터커넥트가 또한 제공될 수 있다. 주어진 어드레스에 대한 배타적 액세스를 추적하기 위한 주어진 어드레스와 관련된 배타적 모니터 표시의 설정을 나타내는 주어진 처리 요소로부터의 배타적 모니터 설정 메시지에 응답하여, 제어 회로는 적어도 하나의 다른 처리 요소에 배타적 모니터 설정 메시지를 전송하도록 인터페이스를 트리거할 수 있다. 제1 유형의 판독 요청에 의해 지정된 타겟 어드레스와 관련된 판독 데이터 값의 반환을 요청하는 제1 처리 요소로부터 수신된 미리 결정된 유형의 판독 요청에 응답하여, 제어 회로는 적어도 하나의 다른 처리 요소에 배타적 모니터 취소 메시지를 전송하도록 인터페이스를 트리거하여 타겟 어드레스와 연관된 배타적 모니터 표시의 취소를 트리거할 수 있다.
따라서, 기존의 인터커넥트는 일반적으로 배타적 모니터 표시의 설정을 다른 처리 요소에 브로드캐스트하지 않지만, 이렇게 하면 배타적 모니터 표시를 설정하는 비트랜잭션 스레드가 로드 추론을 사용하여 공유 리소스에 대한 로드를 차례대로 실행하는 경우에도, 그 판독 세트에서 주어진 어드레스로 트랜잭션을 실행하는 다른 처리 요소가 트랜잭션을 중단하여 상호 배제를 보장할 수 있다. 또한, 주어진 처리 요소에서 실행된 미리 결정된 로드 명령은 주어진 처리 요소를 트리거하여 제1 유형의 판독 요청을 발행할 수 있으며, 이는 인터커넥트가 배타적 모니터 취소 메시지를 다른 처리 요소로 전달하게 하여, 다시 비트랜잭션 스레드와 트랜잭션 스레드 사이에서 상호 배제를 유지하는 데 도움을 준다. .
도 1은 데이터 처리의 다수의 스레드의 실행을 지원하는 처리 회로(4)를 갖는 데이터 처리 시스템(2)의 예를 개략적으로 도시한다. 이 예에서, 처리 회로(4)는 서로 병렬로 각각의 처리 스레드의 실행을 각각 수행할 수 있는 다수의 독립적인 처리 요소(6)를 포함한다. 각각의 개별 처리 요소(6)는 예를 들어 중앙 처리 장치(CPU), 그래픽 처리 장치(GPU) 또는 명령들을 실행할 수 있는 임의의 다른 프로그램 가능 장치일 수 있다. 각각의 처리 요소는 메모리 시스템 20, 16으로부터 데이터를 캐싱하기 위한 적어도 하나의 캐시(8)를 가질 수 있으며, 여기서 캐시(8) 내의 데이터에 액세스하는 것은 메모리 시스템으로부터의 데이터에 액세스하는 것보다 더 적은 레이턴시(latency)를 필요로 한다.
인터커넥트(10)는 처리 요소(6) 간의 통신을 관리하고 처리 요소(6)의 각각의 캐시(8) 내의 데이터 간의 코히런시를 관리하기 위해 제공된다. 인터커넥트(10)는 개별 처리 요소(6)와 통신하기 위한 다수의 인터페이스(12)뿐만 아니라, DRAM 또는 비휘발성 메모리와 같은 메모리 장치(16)와 통신하기 위한 메모리 장치 인터페이스(14)도 갖는다. 인터커넥트(10)는 처리 요소(6)에 의한 데이터에 대한 판독 또는 기록 요청을 추적하고 예를 들어 코히런시를 유지하기 위한 요청에 응답하기 위한 코히런시 제어 유닛(18)을 가지며, 코히런시 제어 회로(18)는 다른 처리 요소의 로컬 캐시(8)에 캐시된 데이터의 상태를 문의(query)하고 및/또는 대응하는 어드레스에 대한 캐시된 데이터의 반환 및/또는 무효화를 요청하는 다른 처리 요소들에 스눕 메시지(snoop messages)를 전송함으로써 판독 또는 기록 요청에 응답하도록 인터커넥트(10)를 제어할 수 있다. 예를 들어, 하나의 처리 요소가 인터커넥트에 대한 추가 요청을 발행하지 않고 데이터가 기록될 수 있는 고유한 상태에서 그 캐시로 데이터를 판독하려고 시도할 때, 코히런시 제어기(18)는 필요한 경우 다른 처리 요소들이 그 데이터를 보유하고 다른 처리 요소(8)로부터 그것을 무효화하는지 여부를 확인할 수 있다. 일부 경우에는 스눕 필터 및/또는 시스템 캐시(20)가 인터커넥트 내에 제공될 수 있다. 시스템 캐시가 제공되면, 메모리로부터 완전히 페치(fecthed)되어야 하는 경우보다 더 빠른 액세스를 위해 메모리(16)로부터 데이터를 캐시할 수 있다(그러나 데이터가 처리 요소(8)의 로컬 캐시에 있는 경우보다 더 긴 레이턴시를 지님). 스눕 필터는 각 처리 요소의 캐시(8)에 어떤 데이터가 캐시되는지 부분적으로 또는 완전히 추적함으로써, 전송해야 하는 코히런시 메시지의 수를 줄일 수 있다(예를 들어 처리 요소가 필요한 데이터를 보유하고 있지 않음이 알려진 경우 주어진 처리 요소에 대한 스눕 요청을 생략할 수 있다). 일부 경우에는, 시스템 캐시 및 스눕 필터는 공통 저장 구조를 사용하여 구현될 수 있다(예를 들어, 스눕 필터는 데이터가 각 처리 요소의 캐시(8)에도 캐시되는지 여부를 나타내는 시스템 캐시(20)의 각 캐시 라인과 연관된 추적 비트로 표현된다). 임의의 알려진 코히런시 프로토콜은 처리 요소들 간의 코히런시를 관리하기 위해 인터커넥트(10)에 의해 사용될 수 있다. 예를 들어, 영국 캠브리지의 Arm® Limited에 의해 제공된 AMBA® ACE 또는 CHI 프로토콜을 사용할 수 있다.
도 2는 처리 요소(6) 중 하나의 일부의 예를 더 상세히 도시한다. 처리 요소(6)는 데이터 처리 동작을 수행하는 명령들을 실행하기 위한 처리 로직(104)을 갖는다. 예를 들어, 처리 로직(104)은 더하기, 곱하기, AND, OR 등과 같은 산술 또는 논리 연산을 수행하는 산술/논리 유닛(ALU)과 같은, 다양한 유형의 처리 연산을 실행하는 실행 유닛; 부동 소수점 피연산자에 대한 연산을 수행하는 부동 소수점 유닛; 또는 다수의 데이터 요소를 포함하는 벡터 피연산자에 대해 벡터 처리를 수행하는 벡터 처리 유닛을 포함할 수 있다. 처리 로직(104)에 의해 실행되는 명령들에 대한 피연산자를 저장하고 실행된 명령들의 결과를 저장하기 위한 아키텍처 레지스터(106)의 세트가 제공된다. 명령 디코더(108)는 관련 동작을 수행하기 위해 데이터 처리 장치(102)의 처리 로직(104) 또는 다른 요소들을 제어하기 위한 제어 신호들을 생성하기 위해 명령 캐시(110)로부터 페치된 명령들을 디코딩한다. 로드/저장 유닛(112)은 또한 (명령 디코더(108)에 의해 디코딩된 로드 명령들에 응답하여) 로드 동작을 수행하여 레벨 1 또는 레벨 2 캐시(114, 116) 또는 메인 메모리(16)로부터 아키텍처 레지스터(106)로 데이터 값을 로드하고, (명령 디코더(108)에 의해 디코딩된 저장 명령들에 응답하여) 동작을 저장하여 아키텍처 레지스터(106)로부터 캐시(114, 116) 또는 메인 메모리(16)에 데이터 값을 저장하기 위해 제공된다. 도 1에 도시된 로컬 캐시(8)는 도 2의 레벨 1 명령 및 데이터 캐시(110, 114) 또는 레벨 2 캐시(116) 중의 어느 것인가에 대응할 수 있다는 것에 유념한다.
장치(102)는 또한 하드웨어 트랜잭션 메모리(HTM)를 지원하기 위한 다양한 리소스를 제공하는 트랜잭션 메모리 지원 회로(120)를 갖는다. 트랜잭션 메모리 지원 회로(120) 내의 HTM 리소스는, 예를 들어 트랜잭션의 추론 결과를 저장하기 위한 추론 결과 저장소(122), 트랜잭션에 의해 액세스된 어드레스들을 추적하기 위한 어드레스 추적 회로(124), 충돌이 검출될 때 트랜잭션이 중단될 수 있도록, 트랜잭션에 의해 이루어진 데이터 액세스와 다른 스레드들에 의해 이루어진 데이터 액세스 간의 충돌을 검출하기 위한 충돌 검출 회로(126), 및 이 상태를 복원하여 트랜잭션이 중단될 때 트랜잭션의 추론 결과를 덮어쓸 수 있도록, 트랜잭션 시작시 아키텍처 레지스터(106)로부터 아키텍처 상태 데이터의 스냅샷(snapshot)을 저장하기 위한 복원 상태 저장 회로(128)를 포함할 수 있다. 어드레스 추적 회로(124)가 도 2에서 별도의 구성 요소로서 도시되어 있지만, 일부 경우에는 주어진 어드레스가 트랜잭션에 대해 판독 또는 기록되었는지 여부를 추적하는 레벨 1 또는 레벨 2 캐시(114, 116)의 각 캐시 라인에서 메타데이터를 사용하여 구현될 수 있다. 일부 경우에, 어드레스 추적 회로(124)에 의해 주어진 트랜잭션에 대해 어드레스들의 별도의 판독 및 기록 세트가 구별될 수 있다.
또한 리소스는 트랜잭션들의 네스팅(nesting)의 레벨을 추적하는 네스팅 깊이 값(nesting depth value)을 저장하기 위한 네스팅 깊이 레지스터(132)를 포함할 수 있다. 프로그래머 또는 컴파일러가 네스트된 트랜잭션을 정의할 수 있는 것은 유용할 수 있다(제1 트랜잭션 시작 명령 이후 제1 트랜잭션 시작 명령에 대응하는 트랜잭션 종료 명령 이전에 제2 트랜잭션 시작 명령이 발생된다). 이는 제1 트랜잭션 시작 명령 이후에 코드의 일부에 분기가 있더라도 코드의 임계 섹션이 원자적으로 처리되도록 하는 데 유용할 수 있다. 그러나, 추론 결과 저장소에서 아키텍처 상태의 여러 체크포인트를 캡처할 필요가 없도록, 일부 마이크로아키텍처는 트랜잭션들의 네스트된 집합의 "내부" 트랜잭션을 효과적으로 무시하고 제1 트랜잭션 시작 명령에 응답하여 아키텍처 상태의 체크 포인트만 캡처할 수 있다. 얼마나 많은 트랜잭션 시작 명령이 발생했는지 추적하기 위해 네스팅 깊이 레지스터(132)가 증분될 수 있다는 것을 제외하고, 트랜잭션 종료 명령 이전에 발생하는 모든 후속 트랜잭션 시작 명령이 효과적으로 무시될 수 있으므로, 트랜잭션 종료 명령을 만날 때, 마이크로 아키텍처는, 어느 트랜잭션 종료 명령이 트랜잭션들의 네스트된 세트의 외부 트랜잭션과 관련이 있는지를 추적할 수 있다. 따라서, 트랜잭션 종료 명령을 만났을 때, 네스팅 깊이가 하나 이상이면, 트랜잭션 종료 명령이 무시되고, 네스팅 깊이가 0이면(트랜잭션이 네스트된 세트의 외부 트랜잭션임을 나타냄), 트랜잭션이 커밋될 수 있다.
도 2는 트랜잭션 메모리 지원 회로(120)를 갖는 처리 요소의 예를 도시한다. 일부 경우에, 도 1에 도시된 시스템(2)의 몇몇 처리 요소(6)는 그러한 트랜잭션 메모리 지원 회로(120)를 가질 수 있다. 그러나, 모든 처리 요소(6)에 트랜잭션 메모리 지원 회로가 반드시 필요한 것은 아니다 - 트랜잭션들을 실행할 수 없는 일부 처리 요소가 있을 수 있다. 또한, 도 2는 개별 처리 요소(6)의 마이크로 아키텍처 내의 트랜잭션 메모리 지원 회로(120)를 도시하지만, 이것이 필수적인 것은 아니다. 일부 경우에, 일부 트랜잭션 메모리 리소스는 처리 요소들 간에 공유될 수 있다 - 복원 상태(128) 또는 추적 어드레스(124)를 캡처하기 위한 일부 공통 저장소가 제공 될 수 있으며, 이는 다수의 처리 요소들 사이에서 사용하기 위해 공유될 수 있다.
도 3은 트랜잭션 메모리 지원 회로(120) 및 처리 로직(104)을 사용하여 주어진 스레드 내에서 트랜잭션을 실행하는 예를 도시한다. 트랜잭션은 트랜잭션 시작 명령(tstart) 및 트랜잭션 종료 명령(tcommit)에 의해 제한되는 프로그램 코드의 섹션이다. 도 3에 도시된 바와 같이, 트랜잭션 시작 명령에 응답하여, 아키텍처 레지스터(106)의 현재 아키텍처 상태가 캡처되어 복원 상태 저장 회로(128)에 저장된다(네스트된 트랜잭션의 경우, 트랜잭션들의 네스트된 세트의 외부 트랜잭션만 아키텍처 상태의 캡처를 트리거할 수 있다). 처리 로직(104)은 tstart 명령 다음에 후속 명령들의 추론적 실행을 수행하기 시작하고, 이들 명령이 실행될 때, 이들 명령에 의해 액세스된 어드레스들은 어드레스 추적 회로(124)에 의해 추적되고, 충돌 검출 회로(126)는 다른 스레드에 응답하여 로드/저장 유닛(112)을 사용하여 만들어진 액세스의 어드레스와 추적된 어드레스 사이의 충돌을 검출한다. 트랜잭션 내의 명령들의 적어도 일부 추론 결과는 추론 결과 저장소(122) 내에 저장된다. 예를 들어, 저장 명령 STR에 응답하여 캐시 또는 메모리에 저장된 값은, 트랜잭션이 계류중인 동안 추론 결과 저장소(122)에 보유될 수 있다. 그 동안 중단 이벤트가 발생하지 않고 트랜잭션 종료 명령(tcommit)에 도달하면, 트랜잭션 종료 명령에 응답하여 추론 결과가 커밋된다. 트랜잭션을 커밋할 때, 해당 스레드에 대한 추론 결과 저장소(122)에 저장된 모든 결과는 데이터 캐시(114) 또는 메모리(116)에 기록될 수 있으며 복원 상태(128)는 아키텍처 상태를 트랜잭션 시작 명령을 만나기 전의 지점으로 되감는 데 더 이상 필요하지 않기 때문에 폐기되거나 덮어쓰기가 허용될 수 있다.
반면에, 중단 이벤트가 발생하면, 예를 들어 또 다른 스레드가 트랜잭션에 의해 이미 액세스된 어드레스에 액세스할 때 충돌 검출 회로(126)에 의해 충돌이 검출될 때, 트랜잭션의 중단이 트리거되고 복원 상태 저장소(128)로부터의 복구 상태가 아키텍처 레지스터(106)로 복원된다. 중단 이벤트의 다른 원인은 예를 들어 트랜잭션 내에서 실행이 허용되지 않는 명령의 실행, 주어진 트랜잭션에 필요한 추론 결과 또는 어드레스를 처리하기 위한 추론 결과 저장소(122) 또는 어드레스 추적 회로(124) 내의 불충분한 리소스, 또는 트랜잭션 중에 수신되는 인터럽트를 포함할 수 있다.
도 3은 트랜잭션 시작 및 종료 명령을 사용하여 트랜잭션 모드에서 특정 세트의 처리 동작을 수행할 수 있는 방법을 도시한다. 비트랜잭션 스레드에 대한 잠금을 관리하는 또 다른 방법은 배타적 모니터를 사용하는 것이다. 처리 회로(4)는 다른 프로세스가 로드 전용 명령의 실행과 저장 전용 명령의 실행 사이에서 주어진 어드레스와 상호 작용하지 않는 한 프로세스가 코드의 후속 섹션으로 진행하지 않도록 보장하는 데 사용될 수 있는 로드 전용 명령 및 저장 전용 명령의 사용을 지원할 수 있다. 로드 전용 명령의 실행에 응답하여, 로드 전용 명령을 실행한 처리 요소(6)는 로드 전용 명령의 타겟 어드레스와 관련된 배타적 모니터 표시의 설정을 트리거한다. 도 1에 도시된 바와 같이, 이러한 배타적 모니터 표시는 처리 요소 자체 내에 제공된 로컬 배타적 모니터(30) 내에 또는 인터커넥트 내에 제공된 글로벌 배타적 모니터(32) 내에 보유될 수 있다. 예를 들어, 로드 전용 명령에 의해 지정된 어드레스가 다른 처리 요소에 의해 액세스되지 않도록 보장되는 공유 불가능한 어드레스이면 로컬 배타적 모니터(30)가 사용될 수 있는 반면, 글로벌 배타적 모니터(32)는 다수의 처리 요소(6)에 의해 액세스될 수 있는 공유 가능한 어드레스에 사용될 수 있다. 일부 구현에서는 로컬 및 글로벌 배타적 모니터(30, 32) 둘 다를 제공할 필요가 없을 수 있으며 이들의 기능은 결합될 수 있다.
로드 전용 명령의 타겟 어드레스에 대해 설정된 배타적 모니터 표시는, 로컬/글로벌 배타적 모니터(30, 32)가 다른 스레드 또는 다른 처리 요소에 의해 트리거된 동일한 어드레스에 대한 저장 동작, 또는 또 다른 스레드 또는 또 다른 처리 요소에 의해 동일한 어드레스에 대한 추가 로드 전용 명령의 실행과 같은, 해당 특정 어드레스에 대한 배타적 액세스가 더 이상 보장될 수 없음을 나타낼 수 있는 이벤트를 모니터링해야 한다는 것을 검출할 수 있는 표시일 수 있다. 일부 예에서, 어드레스의 블록당 인덱싱된 스토리지 구조는 해당 블록에 대해 배타적 모니터가 설정되었는지 여부를 나타내는 각 블록에 대해 설정된 플래그를 가질 수 있다. 그러나, 실제로 배타적 모니터가 설정되어야 하는 어드레스의 수는 상대적으로 적을 수 있으므로, 더 효율적인 구현은 배타적 모니터 표시가 설정되었던 위치의 어드레스를 저장하는 하나 이상의 레지스터를 단순히 제공하는 것일 수 있다.
인터커넥트(10)는 주어진 어드레스에 대한 배타적 액세스가 더 이상 보장되지 않는다는 것을 나타낼 수 있는 이벤트를 검출할 때, 그러한 이벤트가 각 처리 요소에 발생했음을 나타내는 메시지를 전송하여, 어떤 배타적 모니터가 관련 어드레스에 대서 설정되었다면 이것이 클리어될 수 있다. 배타적 표시가 어떻게 관리되는지에 대한 정확한 세부 사항은 특정 프로세서 구현을 위해 선택된 특정 마이크로 아키텍처의 측면일 수 있다. 따라서 일반적으로, 아키텍처는 다수의 이벤트가 배타적 모니터의 클리어링을 트리거해야 한다고 지정할 수 있지만, 이것이 인터커넥트(10)에 의해 시그널링되거나 배타적 모니터 로직(30, 32) 내에서 추적되는 정확한 방식은 다양할 수 있다.
저장 전용 명령이 주어진 처리 요소(6)에 의해 실행될 때, 처리 요소(6)는 저장 전용 명령의 필요한 어드레스에 대해 이전에 설정된 전용 모니터 표시가 여전히 설정되어 있는지 여부를 확인할 수 있으며, 그렇다면 저장 명령은 데이터를 주어진 메모리 어드레스에 저장하기 위해 성공적으로 실행할 수 있고 처리 요소는 또한 저장이 올바르게 완료되었음을 확인하기 위해 레지스터에 플래그를 설정하는 것과 같은, 저장 전용 성공 표시(store exclusive success indication)를 리턴할 수 있다. 후속 조건부 명령은 이후에 배타적 액세스가 필요한 리소스를 사용하는 후속 코드를 진행할지 여부를 결정하기 위해 저장 전용 성공 표시를 확인할 수 있다. 따라서, 잠금 변수를 제공하는 데 사용된 어드레스를 지정하는 로드 및 저장 전용 쌍을 실행하면, 비트랜잭션 스레드에서 코드의 일부 후속 섹션에 대한 원자적 액세스(atomic access)를 보장하는 방법을 제공할 수 있다. 배타적 모니터 표시가 이미 클리어되었을 때 저장 전용 명령이 실행되면 저장 전용 실패 표시가 리턴되고, 이는 후속 조건부 명령이 그것의 조건 코드를 실패하게 할 수 있어, 이전 리소스에 대한 배타적 액세스가 보장될 수 없을 때 코드의 임계 섹션이 입력되지 않도록 그 조건부 명령 이후에 프로그램 흐름이 진행되는 것을 방지할 수 있다.
일부 경우에 배타적 모니터 로직(30, 32)은 배타적 모니터 표시가 설정된 것과 같이 제한된 수의 어드레스를 동시에 추적하기 위한 리소스만을 가질 수 있다. 예를 들어, 일부 구현에서 배타적 모니터 표시는, 배타적 모니터 표시가 설정된 것으로 간주되는 단일 어드레스의 표시를 단순히 포함할 수 있으며, 상이한 어드레스를 지정하는 또 다른 로드 전용 명령이 실행되면, 이것은 이전의 로드 전용 명령에 의해 지정된 어드레스에 대해 이전에 설정된 표시를 클리어할 수 있다.
따라서, 처리 회로(4)에 의해 실행중인 처리의 일부 스레드는 도 3에 도시된 바와 같이 트랜잭션 모드를 사용하여 일부 어드레스 범위에 대한 상호 배제를 시행할 수 있는 반면, 다른 스레드들은 로드를 사용하여 잠금 기반 모드를 사용하고 전용 명령들을 저장하여 트랜잭션을 사용하지 않고 원자적 액세스를 시행할 수 있다. 예를 들어, 도 4는 코드의 임계 섹션 시작시 잠금을 설정한 다음 임계 섹션이 완료되면 잠금을 해제하는 방법을 도시한다(로드/저장 전용 명령을 사용하여 도 4의 스텝 140에서 잠금의 판독 및 요청을 처리할 수 있다). 예를 들어, 하드웨어 트랜잭션 메모리 리소스(120)를 갖지 않아 잠금 기반 접근 방식을 사용하도록 제한되는 일부 처리 요소(6)가 있을 수 있는 반면, 다른 처리 요소(6)는 하드웨어 트랜잭션 메모리 리소스(120)를 가질 수 있다. 또한, 트랜잭션 모드를 사용하여 처음에 시도된 스레드는, 이들 트랜잭션에 대해 자주 중단이 발생하면, 잠금을 사용하는 비트랜잭션 모드로 전환할 수 있다. 예를 들어, 충돌이 계속 발생하는 스레드의 세트가 있을 수 있으므로 이들 모든 스레드에 대해 트랜잭션을 계속 사용하는 것은 효율적이지 않다. 따라서, 한 스레드가 도 3에 나타낸 것과 유사한 트랜잭션 모드를 사용하고 있는 동안에도, 잠금 기반 메커니즘을 사용해야 하는 다른 스레드가 여전히 있을 수 있다. 또한, 트랜잭션 모드에서 작동하는 스레드들은 비트랜잭션 스레드에 의해서도 액세스되는 공유 리소스에 여전히 액세스해야 할 수도 있다. 어떤 경우에는, 비트랜잭션 스레드가 실제로 트랜잭션 스레드와 동일한 코드를 실행하고 있을 수 있지만, 코드는 트랜잭션 경로와 비트랜잭션 경로를 모두 가지고 있을 수 있으며, 이는 트랜잭션이 이전 경우에서 효율적인 것으로 확인되었는지 여부에 따라 선택될 수 있다(예를 들어, 트랜잭션 경로가 계속 중단되면 소프트웨어가 비트랜잭션 경로로 전환될 수 있다).
잠금으로 보호된 리소스에 대한 액세스를 공유해야 하는 트랜잭션 및 비트랜잭션 스레드 둘 다 있을 수 있으므로, 때때로 트랜잭션 스레드는 잠금 어드레스를 판독하고, 트랜잭션을 중단하거나 잠금이 현재 요청되거나 설정되면 일정 시간 동안 대기하는 몇몇 명령을 여전히 필요로 할 수 있다. 이러한 잠금 검사 명령들은 트랜잭션 스레드 자체의 올바른 처리를 보장하기 위해 필요하지 않지만, 충돌 검사 회로(126)는 또 다른 스레드가 트랜잭션과 충돌하는지 여부를 검출할 수 있을 것이고 만약 그렇다면 잘못된 결과를 방지하기 위해 트랜잭션을 중단할 수 있기 때문에, 또 다른 스레드가 잠금을 보유할 때 트랜잭션의 결과를 커밋하는 것을 방지하기 위해 잠금 검사가 필요하며, 이는 비트랜잭션 스레드의 동작을 손상시킬 수 있다.
처리 회로(4)는 또한 명령들의 추론적 실행을 지원할 수 있으며, 일부 명령들은 정말로 실행되어야 하는지 또는 명령에 대한 입력이 올바른지 여부가 알려지기 전에 실행된다. 예를 들어, 주어진 처리 요소는 결과가 실제로 결정되기 전에 조건부 분기 명령의 결과를 예측하는 분기 예측기를 가질 수 있고(분기 결과는 메모리 시스템으로부터 로드된 값 또는 아직 사용할 수 없는 이전 명령의 결과에 의존할 수 있다), 예측된 결과에 근거해서 나중 명령들이 실행될 수 있다. 분기가 올바르게 예측되면, 이것에 의해 성능이 향상될 수 있지만, 잘못된 예측이 있으면, 추론적으로 실행된 명령들의 결과는 폐기될 수 있으며 레지스터(106)의 아키텍처 상태는 분기의 지점으로 되감기될 수 있으며, 그런 다음 올바른 분기 결과와 관련된 후속 명령들이 실행될 수 있다. 잘못된 예측을 해결하는 것과 관련된 레이턴시 패널티(latency penalty)는, 예측이 올바른 경우 명령들을 더 빨리 페치하고, 디코딩하며, 실행할 수 있도록 하는 데 있어 성능 향상(gain in performance)보다 더 중요할 수 있다. 때때로 그러한 추론적 처리는 로드가 실제로 실행되었어야 하는지 여부를 제어하는 이전 조건부 분기가 해결되기 전에 메모리 시스템(8, 20, 16)으로부터 데이터를 로드하기 위한 로드 명령이 실행되는 것을 초래할 수 있다. 이 분기가 잘못 예측된 경우, 이로 인해 로드/저장 전용 명령을 사용하는 트랜잭션 스레드와 비트랜잭션 스레드 간의 상호 작용에 문제가 발생하여, 잠재적으로 상호 배제가 손실될 수 있다. 이 문제를 설명하기 위해 다음 예제가 제공된다.
상호 배제가 필요한 특정 변수 x에 대해 각각 동작을 수행하는 두 개의 처리 요소(P0 및 P1)를 고려한다:
P0 P1
lock () lock ()
x: = x + 2 x : = 1
unlock() unlock()
x가 처음에 0의 값을 가지면, x에 대한 최종 결과는 다음 중 하나가 될 것으로 예상된다.
· 1, P0의 업데이트가 먼저 수행된 후, P1가 P0의 결과인 x의 값에 대해 작동하는 경우, 또는
· 3, P1의 업데이트가 먼저 수행된 후, P0가 P1의 결과인 x의 값에 대해 작동하는 경우. 2의 최종 결과는, P1이 x를 처리하기 시작한 후 P1이 x의 신규 값을 다시 메모리에 기록하기 전에 P0이 x의 현재 값을 판독한다는 것을 의미하므로, 상호 배제의 위반이다. 이 예는 인위적이며 실제로 공유 데이터 리소스에 대한 처리의 각 스레드에 의해 수행된 처리 동작은 더 복잡할 수 있음을 알 수 있을 것이다. 그러나, 이 단순화된 예는 문제를 설명하는 데 유용하다.
도 5는 처리 요소 P0에서 수행된 스레드에 대한 잠재적 구현을 나타내는 "spinlock" 코드 예제를 도시하는데, 여기서 로드/저장 전용 명령 LDAXR, STXR을 사용하여, 잠금이 현재 요청되었는지 확인하고 다른 스레드가 잠금을 요청하지 않은 경우 잠금을 요청하며(또 다른 스레드가 로드 전용 명령과 저장 전용 명령 사이의 기간에 잠금을 요청하는 경우 인스턴스(instances)를 검출하는 배타적 모니터 로직(30)), 따라서 공유 "x" 변수를 사용하여 처리를 진행하는 것이 안전한지 여부를 확인한다.
도 6 및 7은 잠금을 취소하려는 시도 시에 트랜잭션을 사용하는 대체 구현을 나타내는 코드 예제를 도시한다. 도 7은 도 6에 나타낸 CHECK, WAIT_ACQ, LOCK, CHECK_ACQ 및 UNLOCK 함수를 더 자세히 도시한다. 도 6에 나타낸 코드는 트랜잭션을 시작 및 커밋하기 위한 코드뿐만 아니라, 트랜잭션을 수행할 때 또 다른 스레드가 잠금을 유지한 경우 트랜잭션을 재시도하기 위한 폴백 코드 경로("fallback:"으로 표기됨), 및 취소가 실패할 경우(트랜잭션이 이미 특정 횟수만큼 재시도를 실패한 경우) 실행될 잠금 경로("lock:"으로 표기됨)를 포함한다는 것에 유념한다. 도 7에 도시한 것처럼, LOCK (Xx) 함수의 잠금 경로는 도 5에 나타낸 예와 유사한 방식으로 로드/저장 전용 명령을 사용한다. 또한 도 6에서, 트랜잭션의 사용이 성공적인 경우(잠금을 유지하는 다른 프로세스가 없음), 도 6에 나타낸 코드는 잠금 자체를 요청하지 않고 "enter:"라는 표기가 있는 임계 섹션에 진입할 것이고(잠금 어드레스가 CHECK(X1)에서 트랜잭션의 작업 판독 세트에 추가되고), 트랜잭션 실패시 잠금 경로가 실행되지 않으면 잠금이 기록되지 않다.
도 8에 도시된 바와 같이, 도 5의 스핀록 코드(spinlock code)를 실행하는 처리 요소 P0는 로드가 실제로 실행되어야 하는지 여부가 알려지기 전에 일부 로드 명령들을 실행하기 위해 로드 추론을 수행할 수 있다. 이로 인해 공유 변수 x(잠금이 취득되지 않은 경우 실행되지 않아야 함)를 로드하는 로드 명령이, 저장 전용 명령이 성공했는지 여부를 테스트하는 조건부 분기의 해결 전에 실행될 수 있다(즉, 때때로 공유 변수 "x"의 로드는 잠금이 실제로 취득되기 전에 수행될 수 있다). 모든 처리 요소가 상호 배제를 보장하기 위해 동일한 메커니즘(전용 명령을 로드/저장)을 사용한다면, 이것은 수용 가능할 것이고, 저장 전용 명령이 나중에 실패한 것으로 결정되는 것처럼, 즉, 도 8의 조건부 분기 명령 CBNZ가 취해져야 하는 것처럼, 잘못된 추론을 해결하기 위해 제공된 메커니즘이 어떤 후속 명령들 및 공유 변수 "x"의 로드의 영향(effect)을 취소하고, "x" 변수의 로드가 수행되지 않았던 것처럼, 올바른 분기 결과에 근거해서 처리를 재설정한다. 이것은 루프가 다시 시도될 것이라는 것을 보장할 것이므로, 어떤 다른 스레드가 그 동안 "x" 변수를 업데이트했으면, 도 8에 도시된 현재 스레드는 "x"에 대한 최신 값을 판독할 것이고 현재 스레드의 결과는 저장 전용 명령 STXR이 성공한 경우에만 아키텍처 상태로 커밋될 것이며, 즉, 어떤 다른 스레드도 잠금을 요청하기 위해 STXR 명령이 실행되기 전에 LDAXR 명령에 응답하여 배타적 모니터 세트가 클리어되게 하지 않았다.
그러나, 처리 요소 P0이 로드/저장 전용 명령을 사용하여 임계 섹션을 처리하면, 처리 요소 P1이 잠금을 제거하기 위해 트랜잭션을 사용하여 임계 섹션을 처리하는 동안, 처리 요소 P0에 의한 순번을 무시한 "x" 변수의 로드의 추론적 실행은 상호 배제의 위반을 야기할 수 있으며, 예를 들어, P0 및 P1에 의해 실행되는 명령의 상대적 타이밍이 다음과 같은 경우:
· P0은 잠금 변수의 LDAXR을 실행하고(0 = free 참조), 잠금 변수 어드레스에 대한 배타적 모니터 표시를 설정한다.
· P0은 x 변수의 LDR을 실행한다(0 참조).
· P1은 잠금 변수의 TSTART 및 LDR을 실행한다(0 = free 참조).
· P1은 x 변수의 STR을 실행한다(그것을 1로 설정).
· P1은 TCOMMIT를 실행하고 성공한다.
· P0은 잠금 변수의 STXR을 실행하고(그것을 1로 설정), 잠금 변수에 대한 개입 기록(intervening write)이 잠금 변수 어드레스 예약에 대해 설정된 배타적 모니터 표시를 클리어하지 않았기 때문에 저장 전용이 성공한다.
· P0은 x 변수의 STR을 실행한다(그것을 2로 설정).
· P0은 잠금 변수의 STLR을 실행한다(그것을 0으로 설정).
이 시퀀스는 x의 최종 값이 2이기 때문에 상호 배제를 위반한다. 제거된 (트랜잭션) 경로가 잠금 변수에 기록되지 않으므로, 스핀록 코드에 의해 설정된 배타적 모니터가 그대로 유지되기 때문에, 상호 배제 위반이 가능하다. 로드 추론은 P0에 의해 잠금 저장보다 앞서 임계 섹션 로드를 끌어올릴 수 있으므로, P1에 대한 트랜잭션이 P0에 의해 잠금이 저장되기 전에 시작 및 종료하면, P0에 의해 로드된 "x"에 대한 값은 임계 섹션에서 오래된 것(구식)이다.
이 문제를 해결하는 한 가지 방법은 비트랜잭션 스핀록 코드에 추론 배리어를 도입하여 로드가 이전 조건부 분기 위로 올라오는 것을 방지하는 것이다. 그러나, 이것은 트랜잭션 메모리를 지원하지 않는 시스템용으로 이미 기록된 많은 프로그램이 다시 기록되는 것을 필요로 할 수 있으며, 이는 소프트웨어 개발자에게 부당한 부담이 될 수 있다.
트랜잭션 메모리를 지원하지 않는 시스템용으로 기록된 레거시 코드(legacy code)와의 역호환성(backwards compatibility)을 보장할 수 있는 접근방식은 트랜잭션 스레드와 비트랜잭션 스레드 간의 호환성을 보장하기 위해 아키텍처에 두 가지 추가 조치를 도입하는 것이다. 첫 번째로, 로드 전용 명령이 하나의 처리 요소(6)에서 실행될 때, 명령에 의해 지정된 어드레스에 대한 배타적 표시의 설정이 다른 처리 요소(적어도 HTM 리소스(120)를 갖는 처리 요소들)로 브로드캐스팅되어 어드레스들의 작업 세트(판독 세트)에 동일한 어드레스를 지정하는 모든 트랜잭션이 중단된다. 두 번째로, 아래에서 미리 결정된 유형의 로드 명령이라고 하는 새로운 클래스의 트랜잭션 로드 명령이 도입되어, 트랜잭션 내에서 실행될 때 로드 명령에 의해 지정된 어드레스를 작업 어드레스들의 트랜잭션의 판독 세트로 로드하고, 동일한 어드레스에 대해 이전에 설정된 배타적 모니터 표시가 클리어되는 것을 요청하는 인터커넥트(10)에 신호를 전송한다. 도 7의“CHECK(Xx)”기능 내의 로드 명령 LDR은 미리 정해진 유형의 로드로 대체될 수 있다.
상기 도시된 예에서, 처리 요소 P1에 대한 트랜잭션이 잠금 변수에 대해 미리 결정된 유형의 로드를 실행하면, 이것은 처리 요소 P0에 의해 잠금 변수에 대해 설정된 배타적 모니터 표시를 클리어할 것이기 때문에, 이들 조치는 상호 배제를 보장하고, 따라서, 후속 저장 전용 명령 STXR이 처리 요소 P0에 대해 실행되면, 배타적 모니터가 더 이상 설정되지 않기 때문에 이 명령이 실패할 것이다. 즉, 추론적 실행으로 인해 처리 요소 P1에 대한 트랜잭션의 실행 이상으로 x 변수의 로드가 상승하더라도, 스핀록 코드가 처리 요소 P0에 대해 실패했으므로, 스핀록 코드는 x 변수를 사용하는 코드의 임계 섹션의 실행하려는 그것의 현재 실행 시도를 중단한 후에 루프백(loop back)하여 또 다른 시간에 잠금을 요청하려고 시도하고, 이때 잠금 요청이 성공하면 x 변수의 로드는 트랜잭션이 실행되기 전에 판독한 오래된 값보다는 오히려 처리 요소 P1에 대한 트랜잭션이 제공한 커밋된 업데이트에서 비롯한 결과 값을 보게 될 것이다.
유사하게, 처리요소 P0에 대한 로드 전용 명령 이전에 처리요소 P1에서의 트랜잭션 내에서 잠금 변수의 로드가 발생하도록 처리요소 P0과 P1에 대한 동작들 간의 타이밍이 서로 다르면, 배타적 표시의 설정은, 다른 처리 요소로 브로드캐스트되어, 다른 처리 요소들이 어드레스 추적 회로(124)에 의해 추적된 어드레스들의 판독 세트에서 동일한 어드레스를 갖는 트랜잭션을 중단할 수 있게 한다. 이것은 상호 배제가 손실되는 것을 방지하는 데 왜냐하면 이번에는 트랜잭션이 실패할 것이고, 처리 요소 P0에 대한 스핀록 코드(spin lock code)에 의해 잠금 변수가 해제된 후에 트랜잭션을 실행하려는 후속 시도 시에, 트랜잭션은 이제 다른 처리 요소 P0에서의 코드의 임계 섹션을 성공적으로 완료한 결과인 x 변수의 값을 보게 될 것이기 때문이다.
도 9는 주어진 어드레스 X를 지정하는 로드 전용 명령에 응답하는 방법을 도시한 것이다. 로드 전용 명령은 스텝 200에서 주어진 처리 요소(6)에 의해 실행된다. 이에 대응하여, 스텝 202에서 처리 요소(6)는 어드레스 X에 대한 배타적 모니터 표시의 설정을 트리거한다. 배타적 모니터 표시가 동시에 설정될 수 있는 어드레스의 최대 개수에 이미 도달했으면, 스텝 202는 또한 이전에 설정된 어드레스와 관련된 배타적 모니터 표시의 클리어링을 트리거할 수 있다.
스텝 204에서 어드레스 X에 대한 배타적 모니터의 설정은 어드레스 X에 대해 이미 설정된 배타적 모니터를 클리어하기 위해 다른 처리 요소(6) 또는 스레드를 트리거하고/하거나 어드레스 X에 대한 스레드들 또는 다른 처리 요소들에 의해 설정된 배타적 모니터를 클리어하기 위해 글로벌 배타적 모니터(32)를 트리거한다. 또한, 스텝 206에서 하나의 처리 요소에서의 어드레스 X에 대한 배타적 모니터의 설정은 중단될 어드레스들의 작업 세트(판독 세트)에서 어드레스 X를 갖는 임의의 트랜잭션을 트리거한다. 일부 경우에, 스텝 204 및 206에 도시된 동작은 인터커넥트(10)에 의해 라우팅되는 별도의 메시지에 의해 트리거될 수 있거나, 대안적으로 두 동작 모두 동일한 메시지에 의해 트리거될 수있다.
스텝 208에서, 로드 전용 명령에 응답하여, 어드레스 X로부터의 데이터가 로드 전용 명령을 실행한 처리 요소(6)의 레지스터로 로드된다. 예를 들어, 이 데이터는 그 처리 요소의 캐시(8)로부터, 또는 다른 처리 요소들 내 또는 인터커넥트(10) 내의 캐시로부터, 또는 메인 메모리(16)로부터 취득될 수 있다.
도 10은 주어진 처리 요소(6)에 의해 처리되는 저장 전용 명령을 처리하는 방법을 도시한다. 스텝 210에서 주어진 어드레스 X를 지정하는 저장 전용 명령은 주어진 처리 요소(6)에 의해 실행된다. 이에 대응하여, 스텝 212에서 처리 요소(6)는 어드레스 X에 대해 주어진 처리 요소에 의해 배타적 모니터가 설정되었는지 여부를 판정한다. 그렇지 않으면, 스텝 214에서 저장 전용 실패 표시가 리턴되고(예를 들어, 레지스터에 설정된 미리 결정된 값) 저장 동작은 수행되지 않는다(저장 전용 명령으로 지정된 레지스터의 데이터 값은 캐시 또는 메모리에 기록되지 않는다). 주어진 처리 요소에 대한 배타적 모니터가 어드레스 X에 대해 여전히 설정되어 있으면, 스텝 216에서 저장 전용 명령에 의해 지정된 레지스터로부터의 데이터가 어드레스 X와 관련된 캐시 또는 메모리 내의 위치에 저장되고, 스텝 218에서 처리 요소는 저장 전용 성공 표시를 리턴하고, 예를 들어 스텝 214에서의 실패 사례에서 리턴된 값과 상이한 값이 레지스터에 저장된 것을 리턴한다. 이 값은 예를 들어 상호 배제가 시행되어야 하는 리소스에 액세스하는 코드의 섹션으로 계속 진행할 것인지 판정하기 위해 후속 조건부 분기 명령에 의해 확인될 수 있다.
도 11은 저장 전용 명령이 아닌 저장 명령의 처리를 도시한 것이다. 스텝 220에서 어드레스 X를 지정하는 저장 명령은 주어진 처리 요소에 의해 실행되고 스텝 222에서 이에 대응하여 어드레스 X에 대한 다른 스레드들 또는 처리 요소들에 의해 설정된 배타적 모니터 표시가 클리어된다. 스텝 224에서 저장 명령에 의해 지정된 레지스터로부터의 데이터는 어드레스 X와 관련된 위치에서의 캐시 또는 메모리에 저장된다. 저장 명령은 또한 어드레스 추적 회로(124)에 의해 추적되는 어드레스들의 판독 또는 기록 세트 내에서 어드레스 X를 지정하는 임의의 트랜잭션에 대한 충돌 액세스로서 검출될 수 있다.
도 12는 트랜잭션 내에서 처리 요소(6)에 의해 실행되는 로드 명령들을 처리하는 방법을 도시한 것이다. 스텝 240에서 로드 명령이 트랜잭션 내에서 실행되고,로드 명령은 주어진 로드 대산 어드레스 X를 지정한다. 이에 대응하여, 스텝 242에서 어드레스 추적 회로는 어드레스 X를 어드레스들의 작업 세트(판독 세트)에 추가한다. 스텝 244에서, 어드레스들의 기록 세트에서 어드레스 X를 갖는 다른 트랜잭션이 중단된다(그들 판독 세트에서 어드레스 X를 갖는 트랜잭션을 중단할 필요는 없다).
스텝 246에서, 로드 명령의 유형이 식별된다. 로드 명령이 미리 결정된 유형 (배타적 모니터 클리어링 유형)이면, 스텝 248에서 로드 명령을 실행한 처리 요소(6)가 어드레스 X에 대한 스레드들 또는 다른 처리 요소들에 의해 설정된 모든 배타적 모니터 표시의 클리어링을 트리거하는 판독 요청의 유형을 인터커넥트(10)에 발행한다. 반면에, 로드의 유형이 로드 명령의 제2 유형(비배타적 모니터 클리어링 유형)이면, 스텝 250에서 처리 요소(6)는 다른 스레드들 또는 처리 요소들에 의해 어드레스 X에 대해 이미 설정된 배타적 모니터가 유지되도록 허용하는 유형의 판독 요청을 발행한다. 로드 명령의 유형에 관계없이, 스텝 252에서 데이터가 판독 요청에 응답하여 리턴될 때(처리 요소(6)의 로컬 캐시(8)로부터, 또는 또 다른 처리 요소의 캐시(8) 또는 메인 메모리(16)로부터 데이터를 페치(fetch)한 후 인터커넥트(10)로부터), 데이터는 로드 명령에 의해 지정된 레지스터(106)에 다시 기록되며, 처리 요소(6)의 로컬 캐시(8)에 아직 없으면, 로컬 캐시(8)에도 할당될 수 있다.
따라서, (제2 유형의 로드와 달리) 배타적 모니터의 클리어링을 트리거하는 특수 유형의 로드 명령을 제공함으로써, 트랜잭션 내 잠금 변수를 확인하는 로드가 비트랜잭션 스레드에 의해 설정된 잠금 어드레스에 대해 이전에 설정된 배타적 모니터를 클리어할 수 있므로, 로드 추론이 있어도, 상호 배제가 유지될 수 있다.
도 13 ~ 15는 두 처리 요소 PE0, PE1 (6) 및 인터커넥트(10) 간의 메시징의 예를 도시한 것이다. 이들 예에서, 처리 요소 PE1은 어드레스 X를 잠금 변수로서 확인하는 트랜잭션 스레드를 실행하고 있고, PE0은 잠금 변수 어드레스 X에 대한 배타적 모니터 표시를 설정하는 비트랜잭션 스레드를 실행하고 있다(위에 표시된 예와 유사)고 가정한다.
도 13은 도 12에 표시된 제2 유형의 로드 명령의 처리를 도시한다. 제2 유형의 로드 명령에 응답하여, PE1은 로드 명령의 타겟 어드레스 X를 지정하는 인터커넥트(10)에 ReadShared 요청을 발행한다. 인터커넥트(10)는 어드레스 X에 대한 데이터의 가장 최신의 값을 식별하는 데 필요한 모든 스눕 메시지를 보내고, 또 다른 처리 요소(6)의 로컬 캐시(8) 내, 또는 시스템 캐시(20) 또는 메모리(16) 내에 있을 수도 있는 데이터를 취득한다. 인터커넥트(10)는 데이터에 대한 미래의 기록이 인터커넥트와의 검사를 필요로 할 것이라는 것을 나타내는 "공유(shared)" 상태로 데이터를 캐시하는, 처리 요소(6)로 데이터를 리턴한다(PE1이 로컬로 캐시된 복사본에 기록한 경우 다른 위치에 보유된 데이터가 무효화되어야 할 수 있으므로). 제2 유형의 로드 명령을 사용하면, 어드레스 X에 대해 이전에 설정된 배타적 모니터 표시를 클리어할 필요가 없다. 따라서, PE0은 이전에 비트랜잭션 스레드에 의해 설정된 경우 어드레스 X에 대한 배타적 모니터를 유지할 수 있다.
도 14는 PE1이 인터커넥트(10)에 "ReadUnique" 요청을 전송하는 것에 응답하여, 인터커넥트(10)로 확인하지 않고 데이터에 대한 추가 기록을 수행할 수 있는 상태에서 데이터를 PE1로 리턴하도록 요청하는, 미리 결정된 유형의 로드 명령의 처리를 도시한다. ReadUnique 메시지는 인터커넥트(10)가 다른 처리 요소들에 배타적 모니터 취소 메시지(260)를 전송하게 하는데, 이는 이 예에서 어드레스 X에 대해 이미 설정된 그것의 배타적 모니터를 취소하도록 PE0를 트리거한다. 데이터를 취득했으면, 인터커넥트(10)로 다시 확인하지 않고 로컬로 캐시된 데이터에 기록이 허용되는 "고유" 상태에서 PE1로 데이터를 리턴한다. ReadUnique 메시지는 또한 시스템의 다른 캐시 8, 20에 보유된 어드레스 X에 대한 캐시된 데이터 복사본을 무효화할 수 있도록 인터커넥트를 트리거한다.
다른 예들에서는, "고유" 상태의 데이터를 리턴하는 "ReadUnique" 요청을 사용하는 대신에, 미리 결정된 형태의 로드 명령에 응답하여 PE1에 의해 인터커넥트(10)에 상이한 형태의 코히런시 메시지가 발행될 수 있는데, 이는 고유 상태에서 데이터를 리턴하지 않지만(예를 들어, 대신 데이터가 "공유" 상태로 반환될 수 있는데, 이 상태에서는 캐시된 데이터에 대한 기록을 허용하기 위해 인터커넥트(10)에 대한 추가 메시지가 필요하므로, 다른 캐시된 복사본이 필요한 경우 무효화될 수 있다), 이는 여전히 어드레스 X에 대해 이전에 설정된 배타적 모니터 표시가 취소되도록 하기 위해 배타적 모니터 취소 메시지(260)를 트리거한다. 실제로, 미리 결정된 유형의 로드에 대한 예상 사용 사례는, 트랜잭션 내에서 기록이 예상되지 않는 잠금 변수를 확인하기 위한 것이므로, 데이터를 "고유" 상태로 리턴할 필요는 없다. 그럼에도 불구하고, 로드 명령에 응답하여 배타적 모니터의 취소를 트리거하는 코히런시 메시지의 형태를 정의함으로써, 이것은 위에서 설명한 것처럼 트랜잭션 스레드와 비트랜잭션 스레드 간의 인터워킹을 개선하는 데 도움이 될 수 있다.
도 15는 PE0이 어드레스 X를 그것의 타겟 어드레스로서 지정하는 로드 전용 명령을 실행할 때의 메시지를 도시한 것이다. 이에 응답하여, 배타적 모니터 설정 메시지(270)가 인터커넥트(10)로 전송되는데, 이는 트랜잭션 메모리를 지원하는 어떤 다른 처리 요소(6)로 전달된다. 배타적 모니터 설정 메시지(270)에 응답하여, PE1은 판독 세트에서 어드레스 X를 갖는 트랜잭션을 중단한다. PE0에서 인터커넥트(10)로 전송되는 배타적 모니터 설정 메시지(270)의 형태는 인터커넥트(10)로부터 PE1과 같은 다른 처리 요소(6)로 전송되는 배타적 모니터 설정 메시지의 형태와 동일하거나 상이할 수 있다.
도 16은 사용될 수 있는 시뮬레이터 구현을 도시한 것이다. 앞서 설명된 실시 예가 관련된 기술을 지원하는 특정 처리 하드웨어를 동작시키기 위한 장치 및 방법의 관점에서 본 기술을 구현하는 반면, 컴퓨터 프로그램의 사용을 통해서 구현되는 본 명세서에 기술된 실시 예에 따른 명령 실행 환경을 제공하는 것도 가능하다. 이러한 컴퓨터 프로그램은 하드웨어 아키텍처의 소프트웨어 기반 구현을 제공하는 한 시뮬레이터라고도 한다. 다양한 시뮬레이터 컴퓨터 프로그램에는 동적 이진 변환기(dynamic binary translators)를 포함하여, 에뮬레이터, 가상 머신, 모델 및 이진 변환기가 포함된다. 일반적으로, 시뮬레이터 구현은 호스트 프로세서(330)에서 실행될 수 있고, 선택적으로 호스트 오퍼레이팅 시스템(320)을 실행하고, 시뮬레이터 프로그램(310)을 지원할 수 있다. 일부 구성에서, 동일한 호스트 프로세서에서 제공된 여러 개별 명령 실행 환경 및/또는 제공된 명령 실행 환경과 하드웨어 사이에 시뮬레이션의 다중 계층(multiple layers)이 있을 수 있다. 역사적으로, 합리적인 속도로 실행되는 시뮬레이터 구현을 제공하려면 강력한 프로세서가 필요했지만, 호환성이나 재사용을 위해 또 다른 프로세서에 고유한 코드를 실행하려는 경우와 같은 특정 상황에서는 그러한 접근방식이 정당화될 수 있다. 예를 들어, 시뮬레이터 구현은 호스트 프로세서 하드웨어에 의해 지원되지 않는 추가 기능을 가진 명령 실행 환경을 제공하거나, 일반적으로 상이한 하드웨어 아키텍처와 관련된 명령 실행 환경을 제공할 수 있다. 시뮬레이션에 대한 개요는 "Some Efficient Architecture Simulation Techniques", Robert Bedichek, Winter 1990 USENIX Conference, Pages 53-63에 나와 있다.
실시 예들이 특정 하드웨어 구성 또는 특징을 참조하여 이전에 설명된 범위까지, 시뮬레이션된 실시 예에서는, 동등한 기능이 적절한 소프트웨어 구성 또는 특징에 의해 제공될 수 있다. 예를 들어, 컴퓨터 프로그램 로직으로서 시뮬레이션된 실시 예에서 특정 회로가 구현될 수 있다. 유사하게, 레지스터 또는 캐시와 같은 메모리 하드웨어는 시뮬레이션된 실시 예에서 소프트웨어 데이터 구조로서 구현될 수 있다. 전술한 실시 예에서 참조된 하나 이상의 하드웨어 요소가 호스트 하드웨어(예를 들어, 호스트 프로세서(330))에 존재하는 구성에서는, 일부 시뮬레이션된 실시 예들은 적절한 경우 호스트 하드웨어를 사용할 수 있다.
시뮬레이터 프로그램(310)은 컴퓨터 판독가능한 저장 매체(비일시적 매체일 수 있음)에 저장될 수 있으며, 시뮬레이터 프로그램(310)에 의해 모델링되는 하드웨어 아키텍처의 응용 프로그램 인터페이스와 동일한 타겟 코드(300)(어플리케이션, 오퍼레이팅 시스템 및 하이퍼바이저(hypervisor)를 포함할 수 있음)에 프로그램 인터페이스(명령 실행 환경)를 제공할 수 있다. 따라서, 위에서 설명한 미리 결정된 유형의 로드 명령 및 로드/저장 전용 명령을 포함하는, 타겟 코드(300)의 프로그램 명령은, 시뮬레이터 프로그램(310)을 사용하여 명령 실행 환경 내에서 실행될 수 있으므로, 위에서 논의된 장치(2)의 하드웨어 특징을 실제로 갖지 않는 호스트 컴퓨터(330)가 이들 특징을 에뮬레이트할 수 있다. 시뮬레이터 프로그램(310)은 처리 로직(104), 하드웨어 트랜잭션 메모리 리소스(120) 및 배타적 모니터(30, 32)에 각각 대응하는 기능을 제공하는 처리 프로그램 로직(312), 트랜잭션 메모리 프로그램 로직(314) 및 배타적 모니터 프로그램 로직(316)을 포함할 수 있다.
본 출원에서 "구성된…"이라는 단어는 장치의 요소가 정의된 동작을 수행할 수 있는 구성을 갖는 것을 의미하기 위해 사용된다. 이러한 맥락에서, "구성"은 하드웨어 또는 소프트웨어의 상호접속의 구성 또는 방식을 의미한다. 예를 들어, 장치는 정의된 동작을 제공하는 전용 하드웨어를 가질 수 있거나, 프로세서 또는 다른 처리 장치가 기능을 수행하도록 프로그래밍될 수 있다. 구성된"은 정의된 동작을 제공하기 위해 어떤 방식으로든 장치 요소가 변경되어야 함을 의미하지는 않는다.
본 발명의 예시적인 실시 예가 첨부된 도면을 참조하여 본 명세서에서 상세하게 설명되었지만, 본 발명은 이들 정확한 실시 예에 한정되지 않으며, 본 기술분양의 당업자에 의해 다양한 변경 및 수정이 첨부된 청구 범위에 의해 정의된 본 발명의 범위 및 정신을 벗어나지 않고 이루어질 수 있음을 이해해야 한다.

Claims (12)

  1. 장치로서,
    데이터 처리의 스레드들을 처리하는 처리 회로와,
    상기 처리 회로에 의해 처리된 스레드 내에서 트랜잭션의 실행을 지원하는 트랜잭션 메모리 지원 회로를 구비하고, 상기 트랜잭션은 트랜잭션 시작 명령과 트랜잭션 종료 명령 사이에서 추론적으로 실행된 스레드의 명령들을 포함하며, 상기 처리 회로는 트랜잭션 종료 명령이 도달될 때까지 추론적으로 실행된 명령들의 결과의 커밋(commitment)을 방지하도록 구성되고, 상기 트랜잭션 메모리 지원 회로는 또 다른 스레드로부터 상기 트랜잭션에 대해 추적된 어드레스들의 작업 세트 중 하나에 대한 충돌 액세스를 검출하는 것에 응답하여 상기 트랜잭션의 중단을 트리거하는 충돌 검출 회로를 구비하며,
    주어진 어드레스를 지정하는 로드 전용 명령에 응답하여, 상기 처리 회로는 상기 주어진 어드레스에 대한 배타적 모니터 표시를 설정하도록 구성되고,
    상기 주어진 어드레스를 지정하는 저장 전용 명령에 응답하여, 상기 처리 회로는 상기 주어진 어드레스에 더 이상 배타적 모니터 표시가 설정되어 있지 않을 때 저장 전용 실패 표시를 리턴하도록 구성되며,
    주어진 트랜잭션 내에서 실행되는 로드 타겟 어드레스를 지정하는 미리 결정된 유형의 로드 명령에 응답하여, 상기 처리 회로는 로드 타겟 어드레스에 대해 이전에 설정된 배타적 모니터 표시의 클리어링을 트리거하도록 구성되고,
    상기 로드 전용 명령에 응답하여, 상기 처리 회로 및 상기 트랜잭션 메모리 지원 회로 중 적어도 하나는 상기 주어진 어드레스가 어드레스들의 작업 세트 중 하나로서 지정되는 트랜잭션의 중단을 트리거하도록 구성되는, 장치.
  2. 제 1 항에 있어서,
    상기 처리 회로는 처리의 다중 스레드의 병렬 실행이 가능한 복수의 처리 요소를 구비하는, 장치.
  3. 제 2 항에 있어서,
    복수의 처리 요소 중 주어진 처리 요소에서 실행되는 로드 전용 명령에 응답하여, 주어진 처리 요소는 적어도 하나의 다른 처리 요소로의 메시지의 전송을 트리거하도록 구성되고, 메시지는 배타적 모니터 표시가 상기 주어진 어드레스에 대해 설정되었음을 나타내는, 장치.
  4. 제 2 항 또는 제 3 항에 있어서,
    복수의 처리 요소 중 주어진 처리 요소에서 실행되는 상기 미리 결정된 유형의 로드 명령에 응답하여, 주어진 처리 요소는 복수의 처리 요소 중 적어도 하나의 다른 처리 요소로의 메시지의 전송을 트리거하도록 구성되고, 메시지는 로드 타겟 어드레스에 대해 상기 적어도 하나의 다른 처리 요소에 의해 이전에 설정된 배타적 모니터 표시가 클리어되어야 함을 나타내는, 장치.
  5. 선행하는 청구항 중 어느 한 항에 있어서,
    주어진 트랜잭션 내에서 실행된 상기 미리 결정된 유형의 로드 명령에 응답하여, 상기 처리 회로는 주어진 트랜잭션에 대한 어드레스들의 작업 세트에 로드 타겟 어드레스를 추가하도록 구성되는, 장치.
  6. 선행하는 청구항 중 어느 한 항에 있어서,
    주어진 트랜잭션 내에서 실행되는, 로드 타겟 어드레스를 지정하는 제2 유형의 로드 명령에 응답하여, 상기 처리 회로는 로드 타겟 어드레스에 대해 이전에 설정된 배타적 모니터 표시를 유지하도록 구성되는, 장치.
  7. 선행하는 청구항 중 어느 한 항에 있어서,
    타겟 어드레스에 대한 배타적 액세스를 제어하기 위한 잠금 변수(lock variable)가 주어진 스레드에 의해 성공적으로 요청되었는지 여부를 상기 처리 회로가 결정하기 전에 상기 처리 회로는 상기 타겟 어드레스로부터 데이터 값을 로딩하기 위한 로드 명령을 추론적으로 실행하는 주어진 스레드를 지원하도록 구성되는, 장치.
  8. 선행하는 청구항 중 어느 한 항에 있어서,
    주어진 어드레스 또는 또 다른 어드레스를 지정하는 로드 전용 명령을 실행하는 상기 처리 회로와,
    로드 타겟 어드레스로서 주어진 어드레스를 지정하는 상기 미리 결정된 유형의 로드 명령을 실행하는 상기 처리 회로와,
    주어진 어드레스에 대응하는 메모리 위치에 데이터를 저장하는 저장 동작 중
    하나를 검출하는 것에 응답하여 주어진 어드레스에 대해 설정된 배타적 모니터 표시의 클리어링을 트리거하는 배타적 모니터 회로를 구비하는, 장치.
  9. 선행하는 청구항 중 어느 한 항에 있어서,
    상기 트랜잭션 메모리 지원 회로는 또한
    적어도 하나의 트랜잭션에 대해 추론적으로 실행된 명령들의 결과를 저장하는 추론 결과 저장 회로와,
    트랜잭션 중단 시 복원될 트랜잭션 시작 명령에 응답하여 캡처된 상태를 저장하는 복원 상태 저장 회로 중
    적어도 하나를 구비하는, 장치.
  10. 데이터 처리 방법으로서,
    주어진 어드레스를 지정하는 로드 전용 명령에 응답하여, 주어진 어드레스에 대한 배타적 모니터 표시를 설정하는 단계와,
    주어진 어드레스를 지정하는 저장 전용 명령에 응답하여, 주어진 어드레스에 더 이상 배타적 모니터 표시가 설정되어 있지 않을 때 저장 전용 실패 표시를 리턴하는 단계와,
    트랜잭션 내에서 실행되는, 로드 타겟 어드레스를 지정하는 미리 결정된 유형의 로드 명령에 응답하여, 로드 타겟 어드레스에 대해 이전에 설정된 배타적 모니터 표시를 클리어하는 단계를 포함하고, 상기 트랜잭션은 트랜잭션 시작 명령과 트랜잭션 종료 명령 사이에서 추론적으로 실행된 주어진 스레드의 명령들을 포함하며, 트랜잭션 종료 명령이 도달될 때까지 추론적으로 실행된 명령들의 결과의 커밋을 방지하고, 여기서 또 다른 스레드로부터 상기 트랜잭션에 대해 추적된 어드레스들의 작업 세트 중 하나에 대한 충돌 액세스를 검출하는 것에 응답하여 상기 트랜잭션을 중단하며,
    상기 로드 전용 명령에 응답하여, 주어진 어드레스가 어드레스들의 작업 세트 중 하나로서 지정되는 트랜잭션의 중단을 트리거하는 단계를 더 포함하는, 데이터 처리 방법.
  11. 데이터 처리의 스레드들의 실행을 위한 명령 실행 환경을 제공하는 호스트 데이터 처리 장치를 제어하기 위한 컴퓨터 프로그램으로서, 상기 컴퓨터 프로그램은,
    데이터 처리의 스레드들을 처리하는 처리 프로그램 로직과,
    상기 처리 프로그램 로직에 의해 처리된 스레드 내에서 트랜잭션의 실행을 지원하는 트랜잭션 메모리 프로그램 로직을 구비하고, 상기 트랜잭션은 트랜잭션 시작 명령과 트랜잭션 종료 명령 사이에서 추론적으로 실행된 스레드의 명령들을 포함하며, 상기 처리 프로그램 로직은 트랜잭션 종료 명령이 도달될 때까지 추론적으로 실행된 명령들의 결과의 커밋을 방지하도록 구성되고, 상기 트랜잭션 메모리 프로그램 로직은 또 다른 스레드로부터 상기 트랜잭션에 대해 추적된 어드레스들의 작업 세트 중 하나에 대한 충돌 액세스를 검출한 것에 응답하여 상기 트랜잭션의 중단을 트리거하는 충돌 검출 프로그램 로직을 포함하며,
    주어진 어드레스를 지정하는 로드 전용 명령에 응답하여, 상기 처리 프로그램 로직은 주어진 어드레스에 대한 배타적 모니터 표시를 설정하도록 구성되고,
    주어진 어드레스를 지정하는 저장 전용 명령에 응답하여, 상기 처리 프로그램 로직은 주어진 어드레스에 더 이상 배타적 모니터 표시가 설정되어 있지 않을 때 저장 전용 실패 표시를 리턴하도록 구성되며,
    주어진 트랜잭션 내에서 실행되는, 로드 타겟 어드레스를 지정하는 미리 결정된 유형의 로드 명령에 응답하여, 상기 처리 프로그램 로직은 로드 타겟 어드레스에 대해 이전에 설정된 배타적 모니터 표시의 클리어링을 트리거하도록 구성되고,
    상기 로드 전용 명령에 응답하여, 상기 처리 프로그램 로직 및 상기 트랜잭션 메모리 프로그램 로직 중 적어도 하나는 주어진 어드레스가 어드레스들의 작업 세트 중 하나로서 지정되는 트랜잭션의 중단을 트리거하도록 구성되는, 컴퓨터 프로그램.
  12. 인터커넥트로서,
    복수의 처리 요소들과 메시지를 교환하는 복수의 인터페이스와,
    복수의 처리 요소들 사이의 코히런시(coherency)를 관리하도록 구성된 제어 회로를 구비하고,
    주어진 어드레스에 대한 배타적 액세스를 추적하기 위해 주어진 어드레스와 관련된 배타적 모니터 표시의 설정을 나타내는 주어진 처리 요소로부터의 배타적 모니터 설정 메시지에 응답하여, 상기 제어 회로는 적어도 하나의 다른 처리 요소에 배타적 모니터 설정 메시지를 전송하는 상기 인터페이스를 트리거하도록 구성되며,
    제1 유형의 판독 요청에 의해 지정된 타겟 어드레스와 관련된 판독 데이터 값의 리턴을 요청하는 제1 처리 요소로부터 수신된 미리 결정된 유형의 판독 요청에 응답하여, 상기 제어 회로는 타겟 어드레스와 관련된 배타적 모니터 표시의 취소를 트리거하기 위해 적어도 하나의 다른 처리 요소에 배타적 모니터 취소 메시지를 전송하는 상기 인터페이스를 트리거하도록 구성되는, 인터커넥트.
KR1020217000307A 2018-06-25 2019-05-09 트랜잭션 메모리를 지원하는 장치에서의 로드 전용 명령 처리 KR20210021521A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
EP18386018.8 2018-06-25
EP18386018.8A EP3588280B1 (en) 2018-06-25 2018-06-25 Handling load-exclusive instructions in apparatus having support for transactional memory
PCT/GB2019/051276 WO2020002869A1 (en) 2018-06-25 2019-05-09 Handling load-exclusive instructions in apparatus having support for transactional memory

Publications (1)

Publication Number Publication Date
KR20210021521A true KR20210021521A (ko) 2021-02-26

Family

ID=62948064

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020217000307A KR20210021521A (ko) 2018-06-25 2019-05-09 트랜잭션 메모리를 지원하는 장치에서의 로드 전용 명령 처리

Country Status (8)

Country Link
US (1) US11579873B2 (ko)
EP (1) EP3588280B1 (ko)
JP (1) JP2021529372A (ko)
KR (1) KR20210021521A (ko)
CN (1) CN112236750A (ko)
IL (1) IL279126B2 (ko)
TW (1) TWI801603B (ko)
WO (1) WO2020002869A1 (ko)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11675899B2 (en) * 2020-12-15 2023-06-13 International Business Machines Corporation Hardware mitigation for Spectre and meltdown-like attacks
GB2603167B (en) * 2021-01-29 2023-04-26 Advanced Risc Mach Ltd Monitor exclusive instruction
CN115408178B (zh) * 2022-10-31 2023-02-21 北京登临科技有限公司 用于保护对片上资源的访问的方法、介质和电子设备

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7792805B2 (en) * 2006-05-30 2010-09-07 Oracle America, Inc. Fine-locked transactional memory
US8065490B2 (en) * 2007-09-28 2011-11-22 Intel Corporation Hardware acceleration of strongly atomic software transactional memory
GB2483903A (en) 2010-09-24 2012-03-28 Advanced Risc Mach Ltd Instruction which specifies the type of the next instruction to be executed
GB2491350B (en) * 2011-05-27 2020-02-12 Advanced Risc Mach Ltd Store-exclusive instruction conflict resolution
US9720837B2 (en) * 2014-06-27 2017-08-01 International Business Machines Corporation Allowing non-cacheable loads within a transaction
GB2529899B (en) * 2014-09-08 2021-06-23 Advanced Risc Mach Ltd Shared Resources in a Data Processing Apparatus for Executing a Plurality of Threads
US9760494B2 (en) * 2015-06-24 2017-09-12 International Business Machines Corporation Hybrid tracking of transaction read and write sets
US9792147B2 (en) * 2015-07-02 2017-10-17 International Business Machines Corporation Transactional storage accesses supporting differing priority levels

Also Published As

Publication number Publication date
IL279126B2 (en) 2024-03-01
EP3588280B1 (en) 2021-09-08
EP3588280A1 (en) 2020-01-01
TW202001566A (zh) 2020-01-01
WO2020002869A1 (en) 2020-01-02
CN112236750A (zh) 2021-01-15
IL279126A (en) 2021-01-31
JP2021529372A (ja) 2021-10-28
US20210342152A1 (en) 2021-11-04
US11579873B2 (en) 2023-02-14
TWI801603B (zh) 2023-05-11
IL279126B1 (en) 2023-11-01

Similar Documents

Publication Publication Date Title
US6801986B2 (en) Livelock prevention by delaying surrender of ownership upon intervening ownership request during load locked / store conditional atomic memory operation
US9514049B2 (en) Cache backing store for transactional memory
JP2011529603A (ja) バーチャル化可能な高度な同期機構
EP2889769B1 (en) Processor with transactional capability and logging circuitry to report transactional operations
TWI786181B (zh) 在例外遮罩更新指令之後允許未中止的交易處理
US10108464B2 (en) Managing speculative memory access requests in the presence of transactional storage accesses
JP7281491B2 (ja) トランザクショナル比較及び破棄命令
WO2017012667A1 (en) Hardware transactional memory in non volatile memory with log and no lock
US9430380B2 (en) Managing memory transactions in a distributed shared memory system supporting caching above a point of coherency
KR20210021521A (ko) 트랜잭션 메모리를 지원하는 장치에서의 로드 전용 명령 처리
US10671400B2 (en) Enhanced managed runtime environments that support deterministic record and replay
US11347539B2 (en) Checking lock variables for transactions in a system with transactional memory support