KR102253788B1 - 마이크로프로세서 시스템에서의 다차원 인덱싱 방법 및 장치 - Google Patents

마이크로프로세서 시스템에서의 다차원 인덱싱 방법 및 장치 Download PDF

Info

Publication number
KR102253788B1
KR102253788B1 KR1020140045218A KR20140045218A KR102253788B1 KR 102253788 B1 KR102253788 B1 KR 102253788B1 KR 1020140045218 A KR1020140045218 A KR 1020140045218A KR 20140045218 A KR20140045218 A KR 20140045218A KR 102253788 B1 KR102253788 B1 KR 102253788B1
Authority
KR
South Korea
Prior art keywords
index
kernel
bitfield
dimension
call
Prior art date
Application number
KR1020140045218A
Other languages
English (en)
Other versions
KR20140124337A (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 KR20140124337A publication Critical patent/KR20140124337A/ko
Application granted granted Critical
Publication of KR102253788B1 publication Critical patent/KR102253788B1/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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44505Configuring for program initiating, e.g. using registry, configuration files
    • 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Image Processing (AREA)

Abstract

마이크로프로세서 시스템에서의 다차원 인덱싱 방법 및 장치가 제공된다. OpenCL 커넬이 실행될 때, 커넬 호출의 인덱스에 대해서 사용되는 비트필드 인덱스 표현은, 커넬용 각 인덱스 차원에 대해서 필요로 하는 최대값을 나타내는 데에 필요한 비트 개수에 의거해서 결정된다. 비트필드 인덱스 표현이 어떻게 분할되는지를 설명하는 비트필드 배치 데이터 구조(33)는, 커넬에 대해서 사용되는 최대의 인덱스 차원 값을 나타내는 최대값 데이터 구조(32)와 함께 준비된다. 프로세서는 최대값 데이터 구조(32)로 나타낸 인덱스 공간 전체에 걸쳐 커넬 호출(36)을 실행한다. 비트필드 배치 데이터 구조(33)에 따라 구성된 비트필드 인덱스 표현 35, 37, 38을, 각 커넬 호출과 관련지어서 그것의 인덱스를 나타낸다.

Description

마이크로프로세서 시스템에서의 다차원 인덱싱 방법 및 장치{METHODS OF AND APPARATUS FOR MULTIDIMENSIONAL INDEXING IN MICROPROCESSOR SYSTEMS}
본 발명은 마이크로프로세서 시스템에서 사용하는 다차원 메카니즘에 관한 것으로, 특히 예를 들면 OpenCL 및 DirectCompute와 같은, 컴퓨트 셰이더(compute-shader) APIs 하에서 실행되는 다수의 컴퓨트 커넬(compute kernel)을 실행하는 시스템용 다차원의 커넬 호출 인덱싱 메카니즘에 관한 것이다.
본 기술분야에 알려진 바와 같이, OpenCL(Open Computing Language)은 CPU(Central Processing Units), GPU(Graphics Processing Units) 및/또는 다른 프로세서들로 구성되는 이종 플랫폼(heterogeneous platforms)에 대해서 실행하는 프로그램을 기록하기 위한 표준화된 프레임워크(framework)이다. 그것은 "커넬"을 기록하기 위한 언어(주어진 기능들을 실행하기 위한 프로그램)와, 커넬이 실행되어야 하는 플랫폼을 정의하여 제어하는 데에 사용되는 API(Application Programming Interfaces)을 포함한다. OpenCL의 대표적인 사용은, 미분 방정식 등을 반복적으로 푸는, 화상 처리(예를 들면, 필터링), 텍스처 또는 다른 데이터 어레이 압축과 같은, 고병렬(highly parallel) 데이터 처리 동작들을 위한 그래픽 처리 유닛(그래픽 프로세서)을 사용하는 것이다.
OpenCL API 하에서는, "커넬"은 여러 번 호출되는 (보통 작은) 프로그램이다. 커넬의 대표적인 사용은 큰 계산을 병렬로 행하는 것이고, 여기서 커넬의 각 호출은 작은 부분의 계산만 행한다(예를 들면, 처리될 화상 혹은 압축될 텍스처의 소정의 영역에 대해서). 커넬 호출은 병렬로 작동하기 위해서 취해지고, 어떤 제한(이후에 설명할 것이다)을 제외하고, 그들 사이에는 어떠한 실행 순서 제약도 없다. 그러한 구성에 의해, 각 커넬 호출은, 동일한 커넬의 상이한 호출이 전체 계산의 상이한 부분에서 동작하는 것을 허용하기 위해서, 식별될 수 있어야 한다. 예를 들면, 각 커넬 호출은 문제의 데이터 세트(예를 들면, 화상)의 어느 특정 부분을 처리할 것인지를 알아야 한다. 이것은 보통 적절한 커넬 호출 ID 혹은 인덱스를 이용해서, 커넬 호출을 인덱싱함으로써 행해진다(그 인덱스는 예를 들면 문제의 호출에 대한 데이터 세트 등을 식별하기 위해서 사용될 수 있다). 이 인덱스는 예를 들면 처리할 한 개의 특정한 화상 화소 위치 혹은 디인터레이스(de-interlace)할 한 줄의 비디오 버퍼 등을 식별하기 위해서 커넬에 의해 해석될 수 있다.
OpenCL API에 있어서, 각 커넬 호출은 2개의 주요한 부분, 즉 소위 "워크 그룹" ID 및 "워크 아이템" ID로 구성되는 호출 ID(identifier)를 가지고 있다. "워크 그룹"은 커넬 호출을 정의된 그룹으로 구조화하기 위해서 OpenCL에 사용된 메카니즘이다. 워크 그룹의 두드러진 특징은, 주어진 워크 그룹 내의 모든 커넬 호출이 "배리어(barrier)"에 참여할 수 있다는 점이다. (본 기술분야에서 알려진 것처럼, "배리어"는 배리어가 적용되는 모든 커넬 호출이, 그들 중의 어느 것인가 특정 단계로부터 계속하는 것이 허용되기 전에, 그들의 실행시에 그 특정 단계에 도달하는 데에 필요한 병렬 컴퓨팅 구성이다. 단 한 개의 워크 그룹 내의 모든 커넬 호출은 동일한 워크 그룹 ID를 가지고 있다. 주어진 워크 그룹 내의 각 커넬 호출은 워크 그룹 내의 유니크한 워크 아이템 ID을 가지고 있다(그러한 워크 그룹 ID 및 워크 아이템 ID는 모두 문제의 커넬 호출을 유일하게 식별한다).
OpenCL에 있어서의 워크 그룹 ID 및 워크 아이템 ID는 각각 3정수의 튜플로 이루어져 있다. 이와 같이 이들 튜플은 6차원 인덱스 공간을 정의한다. 커넬이 실행을 위해서 지정되면, 그것은 또한 그것에 대해서 그것의 인덱스 공간의 크기, 즉 최대값을 정의했었을 것이고, 각 커넬 호출 ID의 각 크기는 문제의 커넬을 소모할 수 있다. 그 다음 커넬을 실행하는 프로세서는 그 커넬에 대해서 지정된 인덱스 공간 내의 각 포인트에 대해서 한 개의 커넬 호출을 실행한다.
워크 그룹 ID를 정의하는 워크 그룹 정수의 사이즈는 OpenCL 내지 32비트로 제한된다.
워크 아이템 ID를 정의하는 정수의 사이즈는 최대 허용된 워크 그룹 사이즈에 의해 결정되고, 예를 들면 어떤 한 개의 워크 그룹에서의 1024 워크 아이템일 수도 있다. 워크 아이템 ID를 정의하는 각 정수는, 어떻게 워크 아이템이 3차원의 워크 아이템 ID 전체에 분포되는지 알려져 있는 않으므로, 워크 그룹 내의 가능한 워크 아이템들의 총수를 나타낼 수 있어야 한다(그들은 예를 들면 모두 1차원으로만 배열될 수 있다). 이와 같이, 여기에서의 워크 그룹은 1024 워크 아이템까지 포함할 수 있고, 각 워크 아이템 정수는 10비트를 필요로 할 것이다.
이와 같이, 이 방식으로 풀 OpenCL 커넬 호출 ID를 나타내면,
3*32 = 워크 그룹 ID에 대하여 96 비트 및
3*10 = 워크 아이템 ID에 대하여 30비트(여기서 각 워크 그룹은 1024 워크 아이템까지 포함할 수 있다)이 필요하고,
그것은 126비트로 합산된다. 도 1은 이것을 나타낸 것이고, 이 방식으로 OpenCL 커넬 호출을 나타내는 데에 필요한 필드를 나타낸다.
커넬 호출을 이용하면, 이 126비트 ID가 각 커넬 호출과 관련되어서 추적될 필요가 있다. 그러므로, 그것은 프로세스에 대한 꽤 상당한 오버헤드를 나타낼 수 있다.
엄격한 록스텝(lockstep)으로 작동하는 16 내지 64 커넬 호출의 그룹으로 커넬 호출을 함께 그룹화하는 실행 단위 접근법을 이용해서 그래픽 프로세서에 사용하는 커넬 호출 ID의 비용을 줄이려고 하는 것이 알려져 있다. 이것은 "록스텝(lockstepped)" 호출의 그룹 전체에 걸친 호출 인덱싱의 비용을 상각한다(amortize). 그렇지만, 이 기술은 분기 브렌칭(divergent branching)에 특징이 있는 커넬에 대해서 사용될 수 없다(록스텝된 그룹에서의 호출이 함께 록(lock)되어야 하므로).
또한, CPU 시스템에서는, 차례로 커넬 호출을 연속해서 실행하는 각 실행 스레드(thread)를 가지고 있는 것이 알려져 있다. 이 경우에, 한 개의 풀 커넬 호출 인덱스만 통상적으로 각 스레드에서 유지될 필요가 있는데, 그 이유는 이 인덱스가 통상적으로 실행 스레드가 한 개의 호출로부터 다음 호출로 진행할 때 간단한 추가로 갱신될 수 있기 때문이다. 그렇지만, 이것은 일반적으로 처리 코어당 4개의 스레드만 가지고 있는 CPU 시스템에서 가능하고, 이 기술의 비용은 처리 코어에서의 가능한 실행 스레드의 수가 커질 때 매우 높아진다(그것은 일반적으로 예를 들면 처리 코어당 1024 스레드가 있을 수 있는 그래픽 프로세서에 대한 경우이다).
그러므로, 본 출원인은 커넬 호출 인덱스와 같은, 특히 그러한 커넬들이 그래픽 프로세서 및 컴퓨트 엔진과 함께 사용되고 있는 다차원 인덱스를 처리하기 위한 기술에 대한 개선의 여지가 남아있다고 생각한다.
본 발명의 제1 국면에 의하면, 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원(index dimension)의 세트를 정의하는 시스템에서 커넬 호출을 처리하는 방법이 제공되고, 이 방법은,
정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서:
커넬의 인덱스의 각 차원에 대해서 표시되어야 하는 최대값을 나타내는 데에 필요한 비트의 개수를 결정하고;
커넬의 인덱스의 각 차원에 대해서 표시되어야 하는 최대값을 나타내는 데에 필요한 결정된 비트의 개수에 의거해서 커넬의 호출용 인덱스를 나타내기 위해 사용되는 비트필드 인덱스 표현을 결정하며;
커넬의 호출용 인덱스를 표시하기 위해 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 나타내는 비트들의 배치를 표시하는, 커넬에 대한 비트필드 배치 데이터 구조를 준비하고;
비트필드 배치 데이터 구조를 커넬을 실행해야 하는 프로세서 또는 프로세서들에 제공하며; 및
커넬 호출이 실행되어야 하는 경우에, 커넬 호출용 각 인덱스 차원의 값을, 비트필드 배치 데이터 구조로 표시된 각 비트 위치에 표시하고, 비트필드 배치 데이터 구조로 나타낸 비트필드 배치에 따라 구성된 비트필드 인덱스 표현을 커넬 호출과 관련지어서, 커넬 호출용 커넬 호출 인덱스를 표시하는 것을 포함한다.
본 발명의 제2 국면에 의하면, 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 커넬 호출을 처리하는 시스템이 제공되고, 이 시스템은,
정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서:
커넬의 인덱스의 각 차원에 대해서 표시되어야 하는 최대값을 나타내는 데에 필요한 비트의 개수를 결정하고;
커넬의 인덱스의 각 차원에 대해서 표시되어야 하는 최대값을 나타내는 데에 필요한 결정된 비트의 개수에 의거해서 커넬 호출용 인덱스를 표시하기 위해서 사용되는 비트필드 인덱스 표현을 결정하며;
커넬 호출용 인덱스를 표시하기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타내는, 커넬용 비트필드 배치 데이터 구조를 준비하고; 및
비트필드 배치 데이터 구조를, 커넬을 실행하는 프로세서 또는 프로세서들에 제공하도록 구성된 한 개 이상의 프로세서들을 구비하고,
상기 시스템은,
커넬을 실행하고; 및
커넬 호출이 실행될 때, 커넬 호출용 각 인덱스 차원의 값을, 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내고, 비트필드 배치 데이터 구조로 나타낸 비트필드 배치에 따라 구성된 비트필드 인덱스 표현을 커넬 호출 비트필드와 관련지어서, 커넬 호출용 커넬 호출 인덱스를 나타내도록 구성된 한 개 이상의 프로세서를 더 구비한다.
본 발명에 있어서, 커넬이 실행될 때, 커넬의 ID의 각 상이한 차원을 나타내는 데에 필요한 최대의 비트 개수가 먼저 결정되고, 커넬의 각 호출용 인덱스를 나타내는 데에 사용되는 비트필드 인덱스 표현 데이터 구조는 커넬의 ID의 각 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거해서 결정된다. 즉, 각 커넬 호출용 인덱스는 커넬의 ID의 각 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거하는 데이터 구조로 팩(pack)킹된다.
이것은 후술하는 것처럼, 주어진 커넬 ID가 어떤 주어진 차원에서도 가질 수 있었던 이론적인 최대값을 나타내기 위해서 예를 들면 충분한 비트를 사용하는 것보다 더 효율적으로 커넬 호출 인덱스를 나타내는 효과가 있다. 인덱스의 각 차원을 나타내는 데에 필요한 실제의 최대의 비트 개수를 결정함으로써, 각 커넬 호출용 인덱스를 나타내기 위한 불필요한 비트의 제공을 피할 수 있다.
이와 같이, 본 발명의 제3 국면에 의하면, 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 시스템에서 커넬 호출의 인덱스를 나타내는 방법이 제공되고, 이 방법은,
정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서:
커넬의 인덱스의 각 차원에 대해서, 그 커넬의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고;
커넬에 대해서 정의된 각 인덱스 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거하는 데이터 구조로 실행될 각 커넬 호출용 인덱스를 팩ㅋldg하는 것을 포함한다.
본 발명의 제4 국면에 의하면, 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 시스템에서 커넬 호출의 인덱스를 나타내는 시스템이 제공되고, 이 시스템은,
정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서:
커넬의 인덱스의 각 차원에 대해서, 그 커넬의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고;
커넬에 대해서 정의된 각 인덱스 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거하는 데이터 구조로 실행될 각 커넬 호출용 인덱스를 팩킹하도록 구성된 한 개 이상의 프로세서를 구비한다.
본 발명은 비트필드 인덱스 표현용 비트필드 배치와 주어진 커넬의 각 차원을 나타내는 데에 필요한 비트의 개수를 결정하는 것에 관해서 추가 처리를 필요로 하지만, 본 출원인은 이것이 개개의 커넬 호출 ID를 보다 효율적으로 나타냄으로써 달성되는 포텐셜 세이빙(potential saving)보다 더 중요할 것이라고 믿는다.
이와 같이, 본 발명은 그 중에서도 저비용으로 커넬 호출 ID를 제공하기 위한 메카니즘을 제공한다. 또한, 본 발명은, 종래의 기술과 대조해서, 분기 브렌칭(그것은 분기 플로우 제어를 지지한다)에 특징이 있는 커넬을 사용할 수 있고, 다수의 스레드(threads)에 대해서, 여전히 커넬 호출 ID를 처리하기 위한 보다 효율적이며 저비용의 메카니즘을 제공한다.
일부 실시예에 있어서는, 시스템 및/또는 장치는 커넬용 비트필드 배치 데이터 구조를 저장 및/또는 실행되고 있는 각 커넬 호출용 비트필드 인덱스 표현을 저장 및/또는 커넬을 실행하기 위한 소프트웨어 코드를 저장 및/또는 여기에 기술된 데이터를 저장 및/또는 여기에 기술된 데이터 구조를 저장 및/또는 여기에 기술된 프로세스를 실행하기 위한 소프트웨어를 저장하는 한 개 이상의 메모리 또는 메모리 디바이스를 구비하고, 프로세서 또는 프로세서들은 이 한 개 이상의 메모리 또는 메모리 디바이스와 통신할 수 있다. 또한, 이 시스템, 장치 및/또는 프로세서 또는 프로세서들은 여기에 기술된 데이터를 처리 및/또는 여기에 기술된 프로세스를 실행하기 위한 호스트 CPU 및/또는 그래픽 프로세서의 일부와 통신하거나 구비할 수 있다.
본 발명은 또한 비트필드 인덱스 표현 자체의 결정과, 그에 대응하여 커넬 호출의 인덱스를 나타내기 위한 비트필드 인덱스 표현의 사용에 확장된다.
이와 같이, 본 발명의 제5 국면에 의하면, 실행될 커넬들이 커넬들에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 처리 시스템을 동작시키는 방법이 제공되고, 이 방법은,
정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서:
커넬의 인덱스의 각 차원에 대해서, 그 커넬의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고;
커넬의 인덱스의 각 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거해서 커넬의 호출용 인덱스들을 나타내기 위해서 사용되는 비트필드 인덱스 표현을 결정하며;
커넬 호출용 인덱스들을 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타내는, 커넬용 비트필드 배치 데이터 구조를 준비하는 것을 포함한다.
본 발명의 제6 국면에 의하면, 실행될 커넬들이 커넬들에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 시스템에서 사용하는 장치가 제공되고, 이 장치는,
정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서:
커넬의 인덱스의 각 차원에 대해서, 그 커넬의 인덱스의 차원을 나타내는 데 필요한 최대의 비트 개수를 결정하고;
커넬의 인덱스의 각 차원을 나타내는 데 필요한 결정된 최대의 비트 개수에 의거해서 커넬 호출용 인덱스들을 나타내기 위해서 사용되는 비트필드 인덱스 표현을 결정하고;
커넬 호출용 인덱스들을 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타내는, 커넬용 비트필드 배치 데이터 구조를 준비하도록 구성된 한 개 이상의 프로세서를 구비한다.
본 발명의 제7 국면에 의하면, 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 시스템에서 실행되고 있는 커넬 호출을 인덱싱하는 방법이 제공되고, 이 방법은,
정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서:
커넬의 호출용 인덱스를 나타내기 위해서 사용되는 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타내는, 커넬용 비트필드 배치 데이터 구조를 판독하고; 및
커넬의 호출이 실행될 때, 커넬 호출용 각 인덱스 차원의 값을, 커넬용 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내는 비트필드 인덱스 표현을 커넬 호출과 관련지어서, 커넬 호출용 인덱스를 나타내는 것을 포함한다.
본 발명의 제8 국면에 의하면, 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 시스템에서 커넬 호출을 실행하는 프로세스가 제공되고, 이 프로세서는,
정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대한 비트필드 배치 데이터 구조 - 비트필드 배치 데이터 구조는 커넬 호출용 인덱스를 나타내기 위해서 사용되는 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타낸다 - 를 판독하도록 구성되고,
커넬의 호출이 실행될 때, 커넬 호출용 각 인덱스 차원에 대한 값을, 커넬용 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내는 비트필드 인덱스 표현을 커넬 호출과 관련지어서, 커넬 호출용 인덱스를 나타내도록 구성된다.
일부 실시예에 있어서는, 시스템 및/또는 장치는 커넬용 비트필드 배치 데이터 구조를 저장 및/또는 실행되고 있는 각 커넬 호출용 비트필드 인덱스 표현을 저장 및/또는 커넬을 실행하기 위한 소프트웨어 코드를 저장 및/또는 여기에 기술된 데이터를 저장 및/또는 여기에 기술된 데이터 구조를 저장 및/또는 여기에 기술된 프로세스를 실행하기 위한 소프트웨어를 저장하는 한 개 이상의 메모리 또는 메모리 디바이스를 구비하고, 및/또는 프로세서 또는 프로세서들은 이 한 개 이상의 메모리 또는 메모리 디바이스와 통신할 수 있다. 또한, 이 시스템, 장치 및/또는 프로세서 또는 프로세서들은 여기에 기술된 데이터를 처리 및/또는 여기에 기술된 프로세스를 실행하기 위한 호스트 CPU 및/또는 그래픽 프로세서의 일부와 통신하거나 구비할 수 있다.
비트필드 인덱스 표현은 커넬의 ID의 각 차원을 나타내는 데 필요한 결정된 비트 개수에 의거해서 어떤 원하는 적절한 방식으로 호출 인덱스를 나타내도록 구성될 수 있다.
바람직하게는, 비트필드 인덱스 표현은 표시되어야 하는 상이한 인덱스 차원의 1개 이상 또는 몇몇, 바람직하게는 복수, 또 바람직하게는 각각에 대해서 별개의 필드들을 포함한다.
각 인덱스 차원 필드에서의 비트 개수는 바람직하게는 문제의 인덱스 차원에 대해서 사용되는 최대값을 나타내는 데 필요한 비트 개수에 적어도 부분적으로 근거하다. 이 최대값은 예를 들면 문제의 인덱스 차원에 대해서 정의되거나 지정되는 최대값일 수 있고, 또는 이하에 더 설명하는 것처럼, 그것은 일단 문제의 인덱스 차원에 대한 원래("참(true)")의 최대값으로부터 오프셋이 제거되었을 때 표시될 필요가 있는 최대값일 수 있다. 마찬가지로, 커넬의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수는 바람직하게는 문제의 인덱스 차원에 대해서 사용되는 최대값에 근거하고, 그 최대값은 다시 바람직하게는 문제의 인덱스 차원에 대해서 정의 또는 지정되는 최대값, 또는 문제의 인덱스 차원에 대한 원래("참")의 최대값으로부터 오프셋이 제거되었을 때 표시될 필요가 있는 최대값이다.
바람직한 실시예에 있어서는, 비트필드 인덱스 표현에서의 인덱스 차원 필드들 중의 일부(1개 이상)는 문제의 인덱스 차원에 대해서 표시되는 최대값을 나타내는 데 필요한 비트 개수와 같은 사이즈(비트 개수)를 갖는다. 바람직한 일 실시예에 있어서는, 이것은 모든 인덱스 차원 필드의 경우이지만, 다른 바람직한 실시예에 있어서(후술하는 것처럼)는, 이것은 인덱스 차원 필드의 전부가 아닌 일부의 경우이다.
바람직한 실시예에 있어서는, 비트필드 인덱스 표현은 인덱스 공간 차원이 비트필드 내에서 미리 결정된 순으로, 바람직하게는 비트필드 내에서 가장 낮은 차원에서 가장 높은 차원으로, 바람직하게는 오른쪽에서(비트 0 내지 가장 높은 비트) 왼쪽으로 표시되도록 구성된다. (OpenCL의 경우에는, 가장 낮은 3개의 인덱스 차원 필드가 워크 아이템 ID를 나타낼 것이고, 가장 높은 3개의 인덱스 차원 필드가 워크 그룹 ID를 나타낼 것이다.)
특히 바람직한 실시예에 있어서는, 커넬의 인덱스 공간에 대해서 지정된 차원이 단 한 개의 상수값(값의 범위보다는)을 가지면, 그 값을 나타내기 위해서 비트필드 표현에서의 비트들을 따로 설정하는 것보다는, 그것은 비트필드 표현에 기록되지 않고(즉, 비트필드 표현에서의 어떤 비트도 그 인덱스 차원에 할당되지 않는다), 대신 비트필드 표현으로 나타낸 것처럼 그것의 값은 호출 인덱스를 도출하기 위해서 비트필드를 해석할 때의 것이라고 가정한다.
각 커넬용 비트필드 인덱스 표현에 필요하다고 판정된 (즉, 커넬 인덱스 공간의 각 차원에 대한 최대값을 나타내는데 필요한) 실제의 비트 개수를 이용하는 것이 항상 가능할 것이다. 이 경우에, 비트필드 표현은 커넬의 인덱스의 각 차원의 최대값을 나타내는 데 필요하다고 판정된 총 비트 개수로 이루어졌을 것이다.
그렇지만, 특히 바람직한 실시예에 있어서는, 바람직하게는 32비트와 같은 소정의 비트 개수가 비트필드 인덱스 표현에 대해서 따로 설정된다(즉, 사용되는 비트필드 인덱스 표현은 주어진 커넬용 인덱스 공간의 실제의 사이즈에 관계없이, (각 커넬에 대한) 소정의 비트 개수로 이루어진다). 이것은 서로 다른 커넬용 인덱스 표현들 사이에서처럼 잠재적으로 변환하는 비트 개수보다는, 공지된 비트 개수가 본 발명에 사용된 비트필드 인덱스 표현에 대해서 사용될 것이라는 이점이 있다.
이 구성에 있어서, 커넬용 인덱스 공간은 비트필드 표현에 대해서 소정의 비트 개수를 모두 필요로 하지 않는 경우, 어떤 불필요한 비트들은 예를 들면 바람직하게는 인덱스 차원들 중의 하나(바람직하게는 상위 차원 등)의 필드에 할당되고 제로로 설정될 수 있다.
비트필드 배치 데이터 구조는 어떤 원하는 방식으로든 비트필드 인덱스 표현에서의 서로 다른 차원의 비트필드 위치를 나타낼 수 있다. 하나의 바람직한 실시예에 있어서는, 비트필드 배치 데이터 구조는 비트필드 인덱스 표현 내에서 인덱스 차원용 필드에 대한 개시 비트들을 나타내고, 바람직하게는 비트필드 인덱스 표현 내의 비트 0에서 시작하고, 가장 낮은 차원에서 가장 높은 차원으로 동작한다. 또 다른 바람직한 실시예에 있어서는, 비트필드 배치 데이터 구조는, 비트필드 인덱스 표현 내에서의 커넬의 인덱스의 각 차원에 대해서 사용되고 있는 비트 개수를 나타내고, 한번 더 바람직하게는 비트필드 인덱스 표현 내에서의 비트 0에서 시작하고, 가장 낮은 차원에서 가장 높은 차원으로 동작한다.
비트필드 배치 데이터 구조는 어떤 원하는 적절한 방식으로 커넬을 실행하는 프로세서(들)에 제공될 수 있다. 예를 들면, 그것은 문제의 프로세서(들)에 의해 판독될 수 있는 메모리, 레지스터 등에 기억될 수 있고, 또는 그것은 문제의 프로세스(들) 등에 전송될 수 있다. 이와 같이, 바람직한 실시예에 있어서는, 본 발명의 방법 및 시스템은 커넬의 호출용 인덱스를 표시하기 위해 사용되는 결정된 비트필드 인덱스 표현 내에서의 커넬의 인덱스의 각 차원을 표현하는 비트들의 배치를 나타내는, 커넬용 비트필드 배치 데이터 구조를 준비해서 저장하도록 구성된 프로세스(들) 혹은 그것의 스텝들을 포함한다.
특히 바람직한 실시예에 있어서는, 커넬을 실행하는 프로세서(들)에 제공되는 비트필드 배치 데이터 구조를 생성하는 것뿐만 아니라, 커넬의 인덱스의 각 차원에 대해서, 커넬의 호출에 대해서 사용되는 차원에 대한 최대값을 나타내는 커넬 인덱스 최대의 차원 값 데이터 구조도 생성해서 커넬을 실행하는 프로세서(들)에 제공한다. 이것은 커넬을 실행하는 프로세서(들)에, 커넬이 실행되어야 하는 워크 그룹의 사이즈 및 개시할 커넬 호출의 개수(즉, 커넬 호출이 실행되어야 하는 인덱스 공간의 사이즈)를 효율적으로 나타낼 것이다. 이 커넬 인덱스 최대값 데이터 구조는 바람직하게는 커넬을 실행해야 하는 프로세서 또는 프로세서들에 제공하기 위한 비트필드 배치 데이터 구조로 나타낸 구성을 갖는 데이터 구조로 저장된다.
이와 같이, 바람직한 실시예에 있어서는, 본 발명의 방법은,
비트필드 배치 데이터 구조로 나타낸 구성을 갖는 데이터 구조에, 커넬의 호출용 차원에 대해서 사용되는 최대값을, 커넬의 인덱스의 각 차원에 대해서 나타내는 커넬 인덱스 최대의 차원 값 데이터 구조를 준비해서 저장하는 단계와,
커넬 인덱스 최대의 값 데이터 구조를 커넬을 실행해야 하는 프로세서 또는 프로세서들에 제공하는 단계를 더 포함한다.
마찬가지로, 바람직한 실시예에 있어서는, 본 발명의 시스템 및 프로세서(들)은,
비트필드 배치 데이터 구조로 나타낸 구성을 갖는 데이터 구조에, 커넬의 호출용 차원에 대해서 사용되는 최대값을, 커넬의 인덱스의 각 차원에 대해서 나타내는 커넬 인덱스 최대의 차원 값 데이터 구조를 준비해서 저장하고,
커넬 인덱스 최대의 차원 값 데이터 구조를 커넬을 실행해야 하는 프로세서 또는 프로세서들에 제공하도록 더 구성된다.
커넬의 ID의 각 차원을 나타내는 데에 필요한 비트 개수의 결정과, 비트필드 배치 구조 및 최대의 차원 값 데이터 구조(제공된다면)의 생성은 원하는 대로 행해질 수 있다. 바람직한 실시예에 있어서는, 커넬을 실행해야 하는 프로세서에 전송될 커넬을 실행하는 지시를 생성하는 호스트 CPU(프로세서) 상의 드라이버가 이것을 행한다.
커널을 실행시키기 위한 지시와 함께, 비트필드 배치 및 최대의 차원 값 데이터 구조는, 바람직하게는 커넬을 실행해야 하는 프로세서 또는 커넬을 실행해야 하는 프로세서들(예를 들면, 멀티 코어(multi-core) 시스템에서)에 제공된다. 프로세서(들)는 바람직하게는 필요한 커넬 호출을 생성해서 실행하고, 본 발명의 비트필드 인덱스 표현의 형태로 인덱스를 각 호출과 관련짓는다.
커넬을 실행하는 각 프로세서는 어떤 적절한 프로세서여도 된다. 그것은 바람직하게는 그래픽 프로세서이지만, 예를 들면 컴퓨트 엔진일 수도 있다.
예를 들면, 커넬을 실행해야 하는 그래픽 프로세서(들)는, 원하는 대로 커넬에 필요한 커넬 호출을 생성해서 실행할 수 있다. 바람직하게는, 이것은 최대의 차원 값 데이터 구조로 나타낸 인덱스 공간에 대해 반복하여, 최대의 차원 값 데이터 구조에 의해 정의된 인덱스 공간 내에서의 각 포인트에 대하여 한 개의 커넬 호출을 생성해서 실행함으로써 행해진다.
프로세서(들)는 바람직하게는 비트필드 배치 데이터 구조에서의 정보를 이용해서 최대의 차원 값 데이터 구조를 해석한다(즉, 최대의 차원 값 데이터 구조에서 어느 비트가 ID의 어느 차원의 값을 나타내는지 결정한다).
커넬을 실행하고 있는 프로세서(들), 예를 들면 그래픽 프로세서(들)는, 바람직하게는 각 호출을 시작함에 따라 각 커넬 호출용 인덱스를 생성한다. 그것은 비트필드 배치 데이터 구조에서의 정보를 이용해서 각 호출용 인덱스를 비트필드 배치 데이터 구조로 나타낸 비트필드 인덱스 표현 데이터 구조로 팩킹(pack)한다.
이렇게 해서 팩킹된 각 인덱스(ID)는, 본 기술분야에 알려진 것처럼, 문제의 호출과 관련되어 있어야 하고, 예를 들면 데이터의 어느 세트를 문제의 커넬 호출이 처리해야 하는지를 식별하기 위해서 사용되어야 하며, 여기서 그것은 그것의 결과를 저장하거나 그렇지 않으면 출력해야 한다. 이 인덱스들은 예를 들면 이 목적을 위해서 메모리에 적절히 저장될 수 있다.
호출용 인덱스가 사용될 필요가 있는 경우에는, 호출(과 관련된)에 대해서 생성된 팩킹된 인덱스가 판독될 것이고, 그 후에 비트필드 배치 데이터 구조에서의 정보를 이용해서 팩킹된 인덱스를 해석함으로써(즉, 어느 비트가 인덱스의 어느 차원의 값을 나타내는지), 호출용 인덱스를 결정한다. 이와 같이, 특히 바람직한 실시예에 있어서는, 본 발명은 비트필드 배치 데이터 구조를 이용해서 커넬 호출용 팩킹된 인덱스 비트필드 표현을 해석하는 것을 더 포함한다.
그것은 그것의 "풀(full)" 팩킹된 인덱스(즉, 각 호출용 비트필드 팩킹된(packed) 인덱스의 별개의 완전한 표현을 갖도록)을 각 호출과 관련짓는 것이 가능할 것이고, 이것은 커넬 호출 인덱스를 나타내기 위한 보다 효율적인 메카니즘을 여전히 제공할 것이지만, 본 출원인은, 추가로 커넬 호출이 함께 (OpenCL에 대한 워크 그룹을 갖는 경우와 같이)처리하기 위한 정의된 그룹으로 그룹화될 수 있는 경우, 본 발명의 인덱스 표현 기술은 훨씬 더 효율적으로 이용될 수 있다는 것을 알아냈다.
특히 OpenCL의 경우와 같이, 커넬 호출이 정의된 최대의 호출 개수(OpenCL에서의 워크 아이템)의 그룹(OpenCL에서의 워크 그룹)으로 그룹화될 수 있고, 이들 소자들은 커넬 인덱스 공간 내에서 서로 다른 차원으로 표시되는 경우, 인덱스 차원의 일부는 주어진 호출의 그룹 내에서(예를 들면, 주어진 워크 그룹 내에서) 모든 호출(예를 들면, 워크 아이템)에 대해서 동일한 값을 유지할 것이다. 이것은, 사실상 인덱스 차원의 일부가 호출당(per-invocation)(워크 아이템당) 단위로 값이 변할 것이지만, 다른 인덱스 차원의 값들은, 단지 호출당 그룹(워크 그룹당) 단위로 변할 것이다.
본 출원인은 이 경우에 모든 그룹의 호출에 대해서 공통으로 호출당 그룹 차원 값을 사용하는 것이 가능하다는 것을 알아냈기 때문에, 호출당 단위로 변하는 차원만이 호출당 단위로 저장될 필요가 있다. 이것은 호출당 단위로 더 제한된 인덱스 데이터의 양을 사용(예를 들면, 저장)함에 따라, 추가 절약을 제공할 수 있다.
이와 같이, 특히 바람직한 실시예에 있어서는, 주어진 커넬 호출용 비트필드 인덱스 표현이 2부분, 즉 문제의 커넬 호출에 특정한 제1 부분과, 커넬 호출의 한 그룹에 의해 공유되는 제2 부분으로 처리되어 사용된다(예를 들면, 저장된다). 바람직하게는 제2 부분은 그것과 관련된 커넬 호출의 그룹에 대해서 한 번만 저장된다. 그리고, 주어진 커넬 호출용 인덱스가 필요한 경우에는, 인덱스 표현의 2부분이 풀 비트필드 인덱스 표현을 제공하기 위해 함께 연결되어 있다(각 부분, 및 연결된 부분은, 상기 설명한 것처럼, 호출 인덱스를 결정하기 위해서 비트필드 배치 데이터 구조에서의 정보를 이용해서 해석되는 것이 바람직하다).
이 구성에 있어서는, 커넬 호출용 호출 인덱스는, (풀 커넬 호출 인덱스보다는) 호출당 단위로 보다 제한된 양의 정보를 추적해야만 하는 중에는 사실상 올바른 인덱스가 검색될 수 있도록 브레이크 다운(break down)된다.
상기 설명한 것처럼, 인덱스 표현의 첫 번째 호출당 (호출 명확한) 부분은 바람직하게는 호출당 단위로 변하는 인덱스 차원을 나타내고(OpenCL에서, 워크 아이템 ID을 나타내는 차원), 인덱스 표현의 두 번째 공유 부분은 호출 그룹 단위로 변하는 이들 인덱스의 차원을 나타낸다(OpenCL에서, 워크 그룹 ID를 나타내는 차원).
인덱스 표현의 어느 비트들이 호출당 차원을 나타내고 이들 비트만을 각 호출과 관련짓는 데에 필요한지를 커넬마다 단위로 결정하는 것이 가능하다. 그렇지만, 본 출원인은 일반적으로 호출당 단위로 변하는 인덱스 차원을 나타내는 데에 필요한 비트 개수의 보수적 추정을 결정할 수 있다는 것을 인지했고, 이 각 비트필드 인덱스 표현의 비트 개수가, 얼마나 많은 비트가 언제나 호출당 차원에 대해서 필요한지를 정확하게 결정할 필요 없이, 각 호출과 관련되어 있다.
예를 들면, 주어진 호출 그룹(예를 들면, 워크 그룹)이 포함할 수 있는 최대의 호출 개수가 2^P(그것은 대표적인 경우일 것이다)로 설정되면, 이 호출 개수를 나타내는 데에 항상 필요할 수 있는 최대의 가능한 비트 개수는, 그들이 어떻게 인덱스 차원 전체에 분포되는지에 관계없이 결정될 수 있고, 이 비트 개수는 각 개개의 호출과 관련되도록 따로 설정된다.
이와 같이, 한 그룹의 호출이 포함할 수 있는 최대 허용된 호출 개수를 고려한 어떤 호출당 인덱스 차원 구성을 나타내는 데에 필요한 최대의 비트 개수가 결정되는 것이 바람직하고, 이 비트 개수는 호출당 단위로 저장되는 비트 개수로서 설정된다.
예를 들면, 워크 그룹이 2^P 워크 아이템을 포함할 수 있고, 3차원이 워크 아이템 인덱스를 나타내기 위해 사용될 수 있는 OpenCL에 있어서, 본 출원인은 3개의 워크 아이템 차원 전체에 어떻게 P^2 워크 아이템이 분포되는지에 관계없이, P+2비트 이하가, 본 발명의 시스템에서 3개의 워크 아이템 ID 차원을 나타내는 데에 필요하다는 것을 발견했다. (예를 들면, OpenCL 워크 그룹에 있어서 최대의 1024(2^10) 워크 아이템이 있으면, 또 표시하는 데에 10비트를 필요로 하는 워크 아이템이 한 개의 인덱스 차원을 따라 모두 분포되어 있으면, 또 그들이 각 인덱스 차원을 따라 가능한 한 균등하게 분포되어 있으면(즉,
Figure 112014036075044-pat00001
각 차원을 따른 인덱스 값 1-10(10×10×10=1000과 같이)), 각 차원은 그 차원에 있어서의 가능한 인덱스 값을 나타내기 위해서 4비트를 필요로 할 것이고, 모든 워크 아이템 ID를 나타내기 위해서 총 12비트를 제공한다.)
이와 같이, 특히 바람직한 실시예에 있어서는, 팩킹된 인덱스의 비트필드 표현에서의 소정의 비트 개수가 각 호출과 관련되어 있고(호출당 기준으로 저장되어 있고), 비트필드 인덱스 표현의 나머지의 비트는 (호출당 그룹(예를 들면, 워크 그룹) 단위로 저장된) 한 그룹의 커넬 호출과 관련되어 있다. 소정의 비트 개수는 바람직하게는 주어진 호출 그룹에 대해서 허용된 최대의 호출 개수에 근거하고, 바람직하게는 최대의 호출 그룹 사이즈가 2^P 호출인 P+2이다.
본 출원인은 추가로 비트필드 인덱스 표현이, 상기 설명한 것처럼, 소정의 비트 개수로 제한되면, 사실상 비트필드 표현에 대해서 허용된 소정의 비트 개수로 전부 그것의 인덱스 공간이 표시될 수 없는 커넬이 있을 수 있다는 것을 인지했다. 이것은 커넬이 2^N 호출 이상을 갖는 경우일 것이고, 여기서 N은 비트필드 인덱스 표현에 대해서 허용된 비트 개수이다. 이것은 커넬의 인덱스 공간이 바람직하게는 인덱스 공간의 2개 이상의 서브 세트(파티션)로 세분 또는 분할되는 경우이고, 그 서브세트(파티션)에 대해서는 호출 개수가 비트필드 인덱스 표현에 대해서 허용된 소정의 비트 개수를 이용해서 표현될 수 있다. 각 그러한 인덱스 공간 서브세트(파티션)는 바람직하게는 본 발명의 방식으로 처리된다.
이와 같이, 특히 바람직한 실시예에 있어서는, 본 발명은 추가로 커넬에 대해서 지정된 인덱스 공간을 인덱스 공간의 2개 이상의 서브 세트로 구분(분할)하고, 각 인덱스 공간 서브세트(파티션)에 대해서 본 발명의 방식으로 비트필드 인덱스 표현을 결정해서 이용하는 것을 더 포함한다.
바람직하게는, 커넬용 인덱스 공간이 분할될 필요가 있는지(이에 따라, 인덱스 공간이 분할되는지 분할되지 않는지)를 확인하기 위해서 체크가 이루어진다. 바람직한 실시예에 있어서는, 이것은 커넬에 대해서 지정된 풀 인덱스 공간을 나타내는 데에 필요한 비트 개수를 결정하고, 그 후에 이것이 비트필드 인덱스 표현에 대해서 지정된 소정의 비트 개수를 초과했는지를 확인함으로써 행해진다.
커넬의 인덱스 공간의 파티셔닝(partitioning)이 필요한 정도는 비트필드 인덱스 표현에 대해서 허용된 비트 개수와, 대표적인 커넬의 인덱스 공간의 사이즈에 의존한다는 것을 알 수 있을 것이다. 이와 같이, 비트필드 표현에 대해서 허용된 비트 개수는 행해질 필요가 있는 인덱스 공간 파티셔닝의 양과 비트필드 표현의 사이즈 사이의 트레드 오프(trade-off)로서 선택될 수 있다. 본 출원인은 비트필드 인덱스 표현에 대해서 32비트를 이용하면 행해질 필요가 있는 인덱스 공간 파티셔닝의 양과 비트필드 인덱스 표현의 사이즈 사이에 적절한 밸런스가 제공된다는 것을 알아냈다.
인덱스 공간이 2개 이상의 서브세트로 파티셔닝되면, 이 파티셔닝(세분)은 커널 호출의 어떤 정의된 그룹(OpenCL에서, 워크 그룹)도 서로 다른 파티션 사이에서 분할되지 않도록 하는 것이 바람직하다(즉, 각 파티션은 전체 호출 그룹을 포함하는 것이 바람직하고, 파티션 중의 아무것도 정의된 호출 그룹(워크 그룹)의 전체가 아닌 일부만 포함하지 않는다).
본 출원인은 커넬용 인덱스 공간이 분할될 필요가 있는 경우, "보다 높은" 파티션에 대해서는, 이들 차원에 대한 일부 또는 모든 인덱스 공간 차원이 값 1에서 시작하는 것이 아니라, 보다 높은 정수 값에서 시작할 것이라는 것을 추가로 ㅇ인지했다. 이 경우, 비트필드 인덱스 표현은 그것 자체만으로 이들 높은 값을 나타낼 수 없다. 이것에 대해서 허용하기 위해서, 특히 바람직한 실시예에 있어서는, 추가 데이터 구조가 문제의 커넬 호출 파티션(서브 세트)에 대해서 준비되고, 문제의 차원(또는 차원들)에 대한 비트필드 표현으로 나타낸 인덱스값에 추가될 오프셋 값(또는 값들)을 나타낸다. 그 후에, 이 오프셋은, 문제의 호출에 대해서 사용되는 실제의 차원 값을 주기 위해서, 비트필드 인덱스 표현으로 차원에 대해서 나타낸 값에 더해진다. 차원 오프셋 값 또는 값들은, 바람직하게는 주어진 인덱스 공간 파티션(서브 세트)에 대해서 한 번만 저장되어야 하는데, 그 이유는 그들이 문제의 파티션 내의 모든 호출에 대해서 공통으로 사용될 수 있기 때문이다.
또한, 그것은 OpenCL에 있어서는 적어도, 커넬에 대해서 지정된 인덱스 공간이 어떤 주어진 인덱스 차원 또는 차원들의 것보다 큰 정수에서 시작하도록 지정될 수 있는 경우이다. 이 경우에, 그것은 다시 비트필드 인덱스 표현이 필요한 차원 값들의 범위를 자체적으로 나타낼 수 없지만, 이것이 상기 설명한 것처럼, 문제의 커넬과 적절한 차원 오프셋을 관련지음으로써 달성될 수 있는 경우일 수도 있다.
이와 같이, 특히 바람직한 실시예에 있어서는, 비트필드 인덱스 표현으로 나타낸 값에 더해질 오프셋 값은 비트필드 인덱스 표현으로 나타낸 1개 이상의 인덱스 차원에 대해서 (바람직하게는) 생성되어 저장될 수 있다. 바람직하게는 오프셋 값(들)의 단 한 개의 카피가 주어진 비트필드 인덱스 표현의 세트로 나타내는 주어진 인덱스 공간에 대해서 공유 및 저장된다.
본 발명은 단 한 개의 커넬의 처리를 참조해서 상기에서 설명했지만, 본 기술분야의 당업자에게는 자명한 것으로, 실제로는 실행될 복수의 커넬이 있을 것이다. 그러한 경우에, 각 커넬은 본 발명의 방식으로 처리 및 취급되는 것이 바람직하다. 본 기술분야의 당업자에게는 자명한 것으로서, 실행될 각 커넬은 그것의 인덱스 차원의 구성에 의존해서, 그 자신의 비트필드 인덱스 표현을 가질 것이고: 각 커넬이 같은 비트필드 인덱스 표현을 가질 필요가 없고, 정말로 서로 다른 커넬들이 (예를 들면, 비트필드 표현 내에서의 각 인덱스 차원에 대한 필드의 레이아웃에 관해서는) 상이한 비트필드 표현을 가질 가능성이 있다.
본 발명은 OpenCL을 참조해서 상기에서 설명했지만, 본 기술분야의 당업자에게는 자명한 것으로, DirectCompute와 같은, 다차원의 인덱스 공간 내의 다수의 커넬 호출을 실행하는 다른 시스템에 균일하게 적용가능하다.
정말로, 본 출원인은 예를 들면 인덱스와 관련된 커넬 또는 데이터 구조와 같은, 일부 엔티티(entity)와 다차원의 인덱스를 관련짓는 데에 필요한 어느 곳이든지, 보다 일반적으로 다차원의 인덱스의 사용에 본 발명이 적용가능하다고 생각한다.
이것의 예는 컴퓨터 그래픽을 처리할 때 정점 셰이더 인덱스(vertex shader indices)의 처리를 위한 것이다. 그래픽 프로세서가 인스턴스(instanced) 모드에서 동작하고 있을 때, 정점 셰이더는 주어진 정점에 대한 복수의 인스턴스를 처리할 것이다. 이에 따라 처리되는 정점의 각 인스턴스는 그것과 관련된 정점 ID와 인스턴스 ID 양쪽을 가질 것이다. 이들 ID는, 상기 설명한 방식으로, 본 발명의 기술을 이용해서 보다 효율적으로 처리되어 팩킹될 수 있다. 예를 들면, 바람직하게는 정점 ID는 OpenCL에서의 워크 그룹 ID와 OpenCL에서의 워크 아이템 ID와 같은 인스턴스 ID와 동등한 것으로 간주될 수 있다.
이와 같이, 추가 국면에 의하면, 본 발명은 더 일반적으로 다차원의 인덱스에 대한 본 발명의 기술의 사용에 확장된다.
이와 같이, 본 발명의 제9 국면에 의하면, 처리될 엔티티(entities)가 그들에 대해서 별개의 엔티티의 예가 처리되어야 하는 복수의 인덱스 차원의 한 세트를 정의할 수 있었던 시스템에서 인덱스를 표시하는 방법이 제공되고, 이 방법은
정의된 인덱스 차원의 세트를 갖는 처리될 엔티티에 대해서:
엔티티의 인덱스의 각 차원에 대해서, 그 엔티티의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고; 및
엔티티에 대해서 정의된 각 인덱스 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거하는 데이터 구조로 처리될 엔티티의 각 인스턴스에 대한 인덱스를 팩킹하는 것을 포함한다.
본 발명의 제10 국면에 의하면, 처리될 엔티티(entities)가 그들에 대해서 별개의 엔티티의 인스턴스가 처리되어야 하는 복수의 인덱스 차원의 한 세트를 정의할 수 있었던 시스템에서 처리될 엔티티의 인스턴스의 인덱스를 표시하는 방법이 제공되고, 이 시스템은,
정의된 인덱스 차원의 세트를 갖는 처리될 엔티티에 대해서:
엔티티의 인덱스의 각 차원에 대해서, 그 엔티티의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고; 및
엔티티에 대해서 정의된 각 인덱스 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거하는 데이터 구조로 처리될 엔티티의 각 인스턴스에 대한 인덱스를 팩킹하도록 구성된 1개 이상의 프로세서를 구비한다.
본 발명의 제11 국면에 의하면, 처리될 엔티티들이 그들에 대해서 별개의 엔티티의 인스턴스가 처리되어야 하는 복수의 인덱스 차원의 한 세트를 정의했던 처리 시스템을 작동시키는 방법이 제공되고, 이 방법은,
정의된 인덱스 차원의 세트를 갖는 처리될 엔티티에 대해서:
엔티티의 인덱스의 각 차원에 대해서, 그 엔티티의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고;
엔티티의 인덱스의 각 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거해서 엔티티의 인스턴스에 대한 인덱스를 나타내기 위해 사용되는 비트필드 인덱스 표현을 결정하며; 및
엔티티의 인스턴스에 대한 인덱스를 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에 엔티티의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타내는, 엔티티에 대한 비트필드 배치 데이터 구조를 준비하는 것을 포함한다.
본 발명의 제12 국면에 의하면, 처리될 엔티티들이 그들에 대해서 별개의 엔티티의 인스턴스가 처리되어야 하는 복수의 인덱스 차원의 한 세트를 정의할 수 있었던 시스템에 사용하는 장치가 제공되고, 이 장치는,
정의된 인덱스 차원의 세트를 갖는 처리될 엔티티에 대해서:
엔티티의 인덱스의 각 차원에 대해서, 그 엔티티의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고;
엔티티의 인덱스의 각 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거해서 엔티티의 인스턴스에 대한 인덱스를 나타내기 위해 사용되는 비트필드 인덱스 표현을 결정하며; 및
엔티티의 인스턴스에 대한 인덱스를 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에 엔티티의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타내는, 엔티티에 대한 비트필드 배치 데이터 구조를 준비하도록 구성된 1개 이상의 프로세서를 구비한다.
본 발명의 제13 국면에 의하면, 처리될 엔티티가 그것에 대해서 별개의 엔티티의 인스턴스가 처리되어야 하는 복수의 인덱스 차원의 한 세트를 정의할 수 있었던 시스템에서 처리되고 있는 엔티티의 인스턴스를 인덱싱하는 방법이 제공되고, 이 방법은,
정의된 인덱스 차원의 세트를 갖는 처리될 엔티티에 대해서:
엔티티의 인스턴스에 대한 인덱스를 나타내기 위해서 사용되는 비트필드 인덱스 표현 내에 엔티티의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타내는, 엔티티에 대한 비트필드 배치 데이터 구조를 판독하고; 및
엔티티의 인스턴스가 처리될 때, 엔티티의 인스턴스에 대한 각 인덱스 차원의 값을, 엔티티에 대한 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내는 비트필드 인덱스 표현을 엔티티의 인스턴스와 관련지어서, 엔티티의 인스턴스에 대한 인덱스를 표시하는 것을 포함한다.
본 발명의 제14 국면에 의하면, 처리될 엔티티가 그것에 대해서 별개의 엔티티의 인스턴스가 처리되어야 하는 복수의 인덱스 차원의 한 세트를 정의할 수 있었던 시스템에서 엔티티의 인스턴스를 처리하는 프로세서가 제공되고, 이 프로세서는,
엔티티의 정의된 인덱스 차원의 세트를 갖는 처리될 엔티티에 대한 비트필드 배치 데이터 구조 - 이 비트필드 배치 데이터 구조는 엔티티의 인스턴스에 대한 인덱스를 나타내기 위해서 사용되는 비트필드 인덱스 표현 내에 엔티티의 인덱스의 각 차원을 나타내는 비트들의 배치를 나타낸다 - 를 판독하도록 구성되고,
엔티티의 인스턴스가 처리될 때, 엔티티의 인스턴스에 대한 각 인덱스 차원의 값을, 엔티티에 대한 비트필드 배치 데이터 구조로 나타낸 각 비트 위치들에 나타내는 비트필드 인덱스 표현을 엔티티의 인스턴스와 관련지어서, 엔티티의 인스턴스에 대한 인덱스를 표시하도록 구성된다.
본 발명의 제15 국면에 의하면, 처리될 엔티티가 그것에 대해서 별개의 엔티티의 인스턴스가 처리되어야 하는 복수의 인덱스 차원의 한 세트를 정의했던 시스템에서 엔티티들의 인스턴스를 처리하는 방법이 제공되고, 이 방법은,
정의된 인덱스 차원의 세트를 갖는 처리될 엔티티에 대해서:
엔티티의 인덱스의 각 차원에 대해서 표시될 최대값을 나타내는데 필요한 비트의 개수를 결정하고;
엔티티의 인덱스의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 결정된 비트의 개수에 의거해서 엔티티의 인스턴스에 대한 인덱스를 나타내기 위해 사용되는 비트필드 인덱스 표현을 결정하며;
엔티티의 인스턴스에 대한 인덱스를 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에 커넬의 인덱스의 각 차원을 나타내는 비트의 배치를 나타내는, 엔티티에 대한 비트필드 배치 데이터 구조를 준비하고;
비트필드 배치 데이터 구조를, 엔티티를 처리해야 하는 프로세서 또는 프로세서들에 제공하며; 및
엔티티의 인스턴스가 처리될 때, 엔티티의 인스턴스에 대한 각 인덱스 차원의 값을, 엔티티에 대한 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내고, 비트필드 배치 데이터 구조로 나타낸 비트필드 배치에 따라 구성된 비트필드 인덱스 표현을 엔티티의 인스턴스와 관련지어서, 엔티티의 인스턴스에 대한 인덱스를 표시하는 것을 포함한다.
본 발명의 제16 국면에 의하면, 처리될 엔티티가 그것에 대해서 별개의 엔티티의 인스턴스가 처리되어야 하는 복수의 인덱스 차원의 한 세트를 정의했던 처리될 엔티티의 인스턴스를 처리하는 시스템이 제공되고, 이 시스템은,
정의된 인덱스 차원의 세트를 갖는 처리될 엔티티에 대해서:
엔티티의 인덱스의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 비트의 개수를 결정하고;
엔티티의 인덱스의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 결정된 비트의 개수에 의거해서 엔티티의 인스턴스에 대한 인덱스를 나타내기 위해 사용되는 비트필드 인덱스 표현을 결정하며;
엔티티의 인스턴스에 대한 인덱스를 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에 엔티티의 인덱스의 각 차원을 나타내는 비트의 배치를 표시하는, 엔티티에 대한 비트필드 배치 데이터 구조를 준비하고; 및
비트필드 배치 데이터 구조를, 엔티티를 처리해야 하는 프로세서 또는 프로세서들에 제공하도록 구성된 1개 이상의 프로세서를 구비하고,
또 이 시스템은,
엔티티를 처리하고; 및
엔티티의 인스턴스가 처리될 때, 엔티티의 인스턴스에 대한 각 인덱스 차원의 값을, 엔티티용 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 표시하고, 비트필드 배치 데이터 구조로 나타낸 비트필드 배치에 따라 구성된 비트필드 인덱스 표현을 엔티티의 인스턴스와 관련지어서, 엔티티의 인스턴스에 대한 인덱스를 표시하도록 구성된다.
본 기술분야의 당업자에게는 자명한 것으로, 본 발명의 이들 국면 및 실시예는, 여기에 기술된 본 발명의 바람직한 선택적인 특징들 중의 한 개 이상 또는 모두를 적절히 포함할 수 있거나 포함하는 것이 바람직하다.
예를 들면, 다차원의 인덱스는 바람직하게는 OpenCL 또는 DirectCompute 커넬 호출, 그래픽 처리 시스템에서 처리될 특별한 정점의 인스턴스, 보다 높은 순서의 표면 제어 포인트, 추적될 레이(ray)(예를 들면, 레이 트레이싱(ray-tracing) 그래픽 처리 시스템에서) 등을 나타낸다. 이에 따라 처리될 엔티티는 바람직하게는 정점, 보다 높은 순서의 표면 제어 포인트, 추적될 레이, 또는 프로그램과 같은 데이터 구조 또는 커넬과 같은 루틴 등을 구비한다.
마찬가지로, 비트필드 인덱스 표현은 바람직하게는 소정의 비트 개수를 포함하고, 인덱스 공간은 필요하다면 인덱스 공간의 2개 이상의 서브세트로 분할되는 것이 바람직하다.
동일하게는, 상기의 방법 및 장치는 바람직하게는 비트필드 배치 데이터 구조로 나타낸 구성을 갖는 데이터 구조에, 엔티티의 인스턴스에 대한 차원에 대해서 사용되는 최대의 값을, 엔티티의 인덱스의 각 차원에 대해서 나타내는 엔티티 인덱스 최대의 차원 값 데이터 구조를 준비하여 저장하고, 및/또는 바람직하게는, 비트필드 배치 데이터 구조 및/또는 엔티티 인덱스 최대의 값 데이터 구조를 엔티티를 처리해야 하는 프로세서 또는 프로세서들에 제공하는 것을 더 포함한다.
일부 실시예에 있어서는, 상기의 시스템 및/또는 장치는 엔티티용 비트필드 배치 데이터 구조를 저장 및/또는 처리되고 있는 각 엔티티 인스턴스에 대한 비트필드 인덱스 표현을 저장 및/또는 엔티티를 처리하기 위한 소프트웨어 코드를 저장 및/또는 여기에 기술된 데이터를 저장 및/또는 여기에 기술된 데이터 구조를 저장 및/또는 여기에 기술된 프로세스를 실행하기 위한 소프트웨어를 저장하는 한 개 이상의 메모리 또는 메모리 디바이스를 구비하고, 및/또는 프로세서 또는 프로세서들은 이 한 개 이상의 메모리 또는 메모리 디바이스와 통신할 수 있다. 또한, 이 시스템, 장치 및/또는 프로세서 또는 프로세서들은 여기에 기술된 데이터를 처리하기 위한 및/또는 여기에 기술된 프로세스를 실행하기 위한 호스트 CPU 및/또는 그래픽 프로세서의 일부와 통신하거나 구비할 수 있다.
본 기술분야의 당업자에게는 자명한 것으로, 각 커넬 호출(또는 엔티티 인스턴스 인덱스)은 실행(처리)되고 있으므로 커넬 호출(혹은 엔티티 인스턴스)의 추적을 유지하기 위해서, 또 예를 들면 문제의 커넬 호출(혹은 엔티티 인스턴스)에 의해 처리될 데이터를 검색하기 위해서, 또 커넬 호출(또는 엔티티 인스턴스)의 결과(출력)를 저장하기 위해서 커넬 호출을 실행(또는 엔티티 인스턴스를 처리)할 때 사용되어야 한다.
이와 같이, 특히 바람직한 실시예에 있어서는, 본 발명의 방법 및 장치 및 시스템은 실행될 커넬의 한 개 이상 커넬 호출 및 바람직하게는 각 커넬 호출을 실행하고(또는 실행 및 사용하도록 구성된 프로세서(들)), 커넬 호출이 실행되고 있을 때, 본 발명의 방식으로 나타낸 커넬 호출 인덱스를 이용해서: 문제의 커넬 호출을 식별하고; 문제의 커넬 호출에 대해서 처리되어야 하는 데이터를 식별하며; 및/또는 문제의 커넬 호출의 출력을 저장할 위치를 결정하는 것을 더 포함한다.
마찬가지로, 특히 바람직 실시예에 있어서는, 본 발명의 방법 및 장치 및 시스템은, 처리될 엔티티의 한 개 이상의 인스턴스 및 바람직하게는 각 인스턴스를 처리하고(또는 처리 및 사용하도록 구성된 프로세서(들)), 엔티티의 인스턴스가 처리되고 있을 때, 본 발명의 방식으로 나타낸 엔티티 인스턴스 인덱스를 이용해서: 문제의 엔티티의 인스턴스를 식별하고; 문제의 엔티티의 인스턴스에 대해서 처리되어야 하는 데이터를 식별하며; 및/또는 문제의 엔티티의 인스턴스의 출력을 저장할 위치를 결정하는 것을 더 포함한다.
본 발명의 다양한 기능들은 어떤 원하는 적절한 방식으로든지 실행될 수 있다. 예를 들면, 본 발명의 기능들은 원하는 대로, 전용 하드웨어 또는 프로그래머블 하드웨어로 구현될 수 있다. 이와 같이, 예를 들면, 본 발명의 다양한 기능 소자들 및 "수단(means)"은 적절한 전용 하드웨어 소자들, 프로세서들 또는 처리 회로, 및/또는 프로그래머블 하드웨어 소자들과 같은, 다양한 기능 등을 행하도록 동작가능한 적절한 프로세서 또는 프로세서들, 기능유닛들, 회로, 처리로직, 마이크로프로세서 구성 등을 구비하고, 프로세서 또는 처리회로는 원하는 방식으로 동작하도록 프로그램될 수 있다.
마찬가지로, 다양한 인덱스 및 다른 값, 데이터 구조 등은, 어떤 적절한 원하는 방식으로 정의, 구현 및 저장될 수 있다.
여기에서는 본 기술분야의 당업자에게는 자명한 것으로, 본 발명의 다양한 기능 등은 주어진 프로세서상에서 병렬로 복제 및/또는 수행될 수 있고, 및/또는 복수의 프로세서들(예를 들면, 멀티 코어 시스템에서) 사이에서 공유될 수 있다.
본 발명은 호스트 프로세서, 그래픽 프로세서, 컴퓨트 엔지 등의 어떤 적절한 형태 또는 구성에든 적용가능하다.
본 발명은 여기에 기술된 본 발명의 한 개 이상의 국면의 장치를 포함하고 그 방법에 따라 동작하는 그래픽 프로세서 또는 프로세서들 또는 그래픽 처리 플랫폼을 포함하는 마이크로프로세서 시스템에 확장된다. 상기 설명한 특정 기능들을 실행하는 데에 필요한 어떤 하드웨어에 따라, 그러한 시스템은 그러한 시스템이 포함하는 한 개 이상 또는 모든 유용한 기능유닛 등을 포함할 수 있다.
기술한 본 발명의 국면 및 실시예는 모두 여기에 기술된 바람직하고 선택적인 특징들 중의 어느 하나 또는 그 이상 또는 모두를 적절히 포함할 수 있다는 것도 본 기술분야의 당업자에게는 자명한 것일 것이다.
본 발명에 따른 방법은 소프트웨어, 예를 들면 컴퓨터 프로그램을 이용해서 적어도 부분적으로 구현될 수 있다. 이와 같이, 본 발명의 추가 국면으로부터 보면 데이터 처리 수단상에 인스톨될 때 여기에 기술된 방법들을 수행하도록 특별히 구성된 컴퓨터 소프트웨어와, 프로그램 소자가 데이터 처리 수단상에서 동작할 때 여기에 기술된 방법들을 수행하기 위한 컴퓨터 소프트웨어 코드부를 구비하는 컴퓨터 프로그램 소자와, 프로그램이 데이터 처리 시스템상에서 작동할 때 여기에 기술된 방법 또는 방법들의 모든 스텝들을 수행하도록 구성된 코드 수단을 구비하는 컴퓨터 프로그램이 제공된다는 것을 알 것이다. 데이터 처리 시스템은 마이크로프로세서, 프로그래머블 FPGA(Field Programmable Gate Array) 등이다.
본 발명은 또한 데이터 처리 수단을 구비하는 그래픽 프로세서 또는 마이크로프로세서 시스템을 동작시키는 데에 사용될 때, 상기 데이터 처리 수단과 함께 상기 프로세서 또는 시스템으로 하여금 본 발명의 방법들의 스텝들을 수행하게 하는 그러한 소프트웨어를 구비하는 컴퓨터 소프트웨어 캐리어에도 확장된다. 그러한 컴퓨터 소프트웨어 캐리어는 ROM 칩, CD ROM 또는 디스크와 같은 물리적인 기억매체이거나, 와이어 상의 전자 신호와 같은 신호, 광학 신호 또는 위성 등과 같은 무선 신호일 수도 있다.
본 발명의 방법들의 모든 스텝이 반드시 컴퓨터 소프트웨어에 의해 실행될 필요가 없으므로, 추가의 넓은 국면에서 본 발명은 여기서 개시된 방법들의 스텝들 중의 적어도 하나를 수행하기 위한 컴퓨터 소프트웨어 캐리어 상에 인스톨된 컴퓨터 소프트웨어 및 그러한 소프트웨어를 제공한다는 것을 추가로 알 수 있을 것이다.
따라서, 본 발명은 컴퓨터 시스템과 함께 사용하기 위한 컴퓨터 프로그램 제품으로서 적절히 구현될 수도 있다. 그러한 구현은 비일시 컴퓨터 판독가능한 매체, 예를 들면 디스켓, CD-ROM, ROM 또는 하드디스크와 같은, 유형 매체 상에 고정된 일련의 컴퓨터 판독가능한 명령들을 포함할 수도 있다. 그것은 또한 광학 또는 아날로그 통신선을 포함하지만 그것에 한정되지 않는 유형 매체 상에서, 또는 마이크로파, 적외선 또는 다른 송신 기술을 포함하지만 그것에 한정되지 않는 무선 기술을 무형으로 이용해서, 모뎀 또는 다른 인터페이스 디바이스를 통해서, 컴퓨터 시스템에 송신가능한 일련의 컴퓨터 판독가능한 명령도 포함할 수 있다. 일련의 컴퓨터 판독가능한 명령들은 여기에 이전에 기술된 기능성의 모두 또는 일부를 구현한다.
본 기술분야의 당업자는 그러한 컴퓨터 판독가능한 명령들이 많은 컴퓨터 아키텍처 또는 작동 시스템과 함께 사용하기 위한 다수의 프로그래밍 언어로 기록될 수 있다는 것을 인식할 것이다. 또한, 그러한 명령들은 반도체, 자성, 광학을 포함하지만 그것에 한정되지 않는 어떤 메모리 기술을 이용해서 현재 또는 미래에 저장되거나 또는 광학, 적외선 또는 마이크로파를 포함하지만 그것에 한정되지 않는 어떤 통신 기술을 이용해서 현재 또는 미래에 송신될 수 있다. 그러한 컴퓨터 프로그램 제품은 예를 들면 시스템 ROM 또는 고정 디스크 상에, 컴퓨터 시스템이 프리 로드된, 수반하는 인쇄된 또는 전자 문서, 예를 들면 수축 포장된 소프트웨어(shrink wrapped sofware)를 가진 제거가능한 매체로서 분포되거나, 네트워크, 예를 들면 인터넷 또는 월드 와이드 웹 상에서 서버 또는 전자 게시판으로부터 분포될 수 있다는 것을 고려한다.
본 발명의 바람직한 실시예들에 대해서는 첨부도면을 참조하여 예로서 설명할 것이다.
도 1은 종래기술의 방식의 OpenCL 커넬 호출 ID를 나타내는 데에 필요한 필드를 나타낸다.
도 2는 OpenCL 커넬이 그래픽 프로세서상에서 실행되는 대표적인 구성을 개략적으로 나타낸 것이다.
도 3은 본 발명의 실시예에 있어서의 인덱스 공간 전체에서 커넬 호출을 실행하고 있을 때의 그래픽 프로세서의 동작을 개략적으로 나타낸 것이다.
본 발명의 바람직한 실시예에 대해서는 그래픽 프로세서상의 OpenCL 커넬의 실행을 참조해서 설명할 것이다. (그렇지만, 상기 설명한 것처럼, 본 발명은 OpenCL 및 그래픽 프로세서와의 사용에 한정되지 않지만, 예를 들면 컴퓨트 커넬이 주어진 프로세서상에서 실행되어야 하는 곳 어디에서나 사용될 수 있다.
도 2는 OpenCL 커넬이 그래픽 프로세서상에서 실행될 수 있는 대표적인 구성을 개략적으로 나타낸 것이다. 도 2에 나타낸 바와 같이, 호스트 CPU(20)는 OpenCL API를 실행하고, 그래픽 프로세서(21)가 OpenCL 커넬을 실행하는 명령을 생성한다. 커넬은 예를 들면 대표적으로 화상을 처리하도록, 예를 들면 화상을 필터링 또는 압축 또는 인코딩하도록 구성될 수 있다. 이 커넬은 예를 들면 노이즈 감소, 에지 개선, 포맷 변환, 최고 해상도, 화상 분석(예를 들면, 얼굴 또는 특징 인식), 입체 재구성, 패턴 매칭 등을 제공할 수 있다.
본 기술분야에서 알려진 것처럼, 그래픽 프로세서는 호스트 CPU(20) 상의 OpenCL API에 의해 생성된 명령 리스트를 판독하고, 명령 리스트 내의 명령들을 실행할 것이다. 이들 명령들은 OpenCL 커넬을 실행하기 위한 1개 이상의 명령을 포함할 것이다. 커넬들은 예를 들면 화상의 압축 또는 필터링 등의 기능들을 수행하도록 구성될 수 있다.
본 기술분야에 알려진 것처럼, 그리고 상기 설명한 것처럼, 6차원이 그래픽 프로세서(21)상에서 실행될 각 OpenCL 커넬에 대해서 지정될 수 있고, 각 차원은 1에서 그 차원에 대한 가능한 가장 큰 값까지의 범위의 정수이다. 따라서, 이것은 문제의 커넬에 대해서 실행되어야 하는 호출을 정의하는 6차원의 인덱스 공간을 정의한다. OpenCL에 있어서, 차원 중의 3개는 커넬용 워크 그룹 내에서의 워크 그룹 ID를 나타내고, 다른 3차원은 워크 아이템 ID를 나타낸다. 이 지정된 인덱스 공간 내의 모든 포인트에 대해서는, 1개의 커넬 호출이 시작된다. 각 호출은 처리되어야 하는 예를 들면 화상의 예를 들면 특정 영역에 커넬을 적용할 것이다.
이와 같이, 그것이 커넬을 실행할 때, 그래픽 프로세서(21)는 문제의 커넬에 대해서 지정된 인덱스 공간 내의 각 포인트에 대해서 커넬 호출을 시작(실행)한다.
상기 설명한 것처럼, 각 호출을 인덱스 공간 내의 그것의 유니크한 인덱스와 관련짓는 것이 필요하다. 이 호출 인덱스를 이용해서 예를 들면 화상 데이터의 어느 부분을, 문제의 호출이 처리해야 하는지를 식별하고, 그 출력은 호출의 처리의 결과에 대한 대상이다.
본 실시예에 있어서는, 각 커넬 호출에 대한 인덱스는 비트들 중의 고정된 수 N을 갖는 비트필드 인덱스 표현을 이용해서 사용중에 표현된다. 본 실시예에 있어서는, 각 비트필드 인덱스 표현은 32비트(즉, N=32)를 갖는다.
또한, 커넬의 인덱스 공간은, 필요하다면, 인덱스 공간의 1개 이상의 서브세트로 분할되고, 각 그러한 서브세트(파티션)는 비트필드 인덱스 표현으로 나타낼 수 있는 인덱스(인덱스 공간 내의 포인트)의 개수보다 크지 않다. 이와 같이, 본 실시예에 있어서는, 인덱스 공간의 각 파티션(서브 세트)는 2^32 포인트(인덱스) 이하를 포함하도록 구성된다. 이것은 그 중에서도 각 파티션(서브 세트) 내의 모든 인덱스가 32비트의 비트필드를 이용해서 표현될 수 있는 효과가 있다. (N의 다른 값이 가능할 것이다 - 일반적으로 각 "파티션"은 2^N 포인트(인덱스) 이하를 포함하도록 제한되어야 하고, 여기서 N은 양의 정수이고, 비트필드 인덱스 표현이 사용되고 있는 최대의 비트 개수가 포함될 수 있다.)
인덱스 공간이 2개 이상의 서브세트로 분할되는 경우, 그 파티셔닝(세분)은 어떤 워크 그룹도 서로 다른 파티션 사이에서 분할되지 않도록 한다.
그러한 인덱스 공간 파티셔닝이 필요한 경우에는, 이것은 호스트 프로세서 상의 드라이버에 의해 행해진다. 인덱스 공간 파티셔닝의 필요성은 문제의 커넬에 대해서 지정된 각 인덱스 차원의 최대값을 나타내는 데에 필요한 총 비트의 개수를 합산하고, 비트필드 인덱스 표현에 할당되는 N비트(본 실시예에 있어서는 32비트)보다 큰지 여부를 확인함으로써 결정된다.
이 인덱스 공간(여기서 인덱스 공간은 2^N 포인트 미만을 포함한다), 또는 인덱스 공간의 각 파티션(서브 세트)(여기서 인덱스 공간은 2^N 포인트 이상을 포함한다)을 다음과 같이 처리해서 커넬의 호출용 인덱스를 표현하기 위해서 사용되는 비트필드 인덱스 표현을 결정하여 생성한다.
우선, 문제의 인덱스 공간 파티션에 대한 각 차원의 차원들(최대의 차원 값)이 결정된다. 각 차원으로부터 하나가 제외되고, 각 인덱스 차원의 그렇게 변경된 최대의 차원 값을 나타내는 데에 필요한 비트의 개수가 결정된다.
이 정보를 이용해서, 인덱스 공간 파티션 내의 커넬의 각 호출용 호출 인덱스를 나타내는 데에 사용되는 N비트(32비트) 비트필드 인덱스 표현에서 각 인덱스 차원을 나타내는 데에 사용되는 필드의 사이즈 및 위치를 다음과 같이 결정한다:
● 가장 낮은 인덱스 차원은 비트 필드 표현의 가장 낮은 비트에 저장되고: 이 인덱스 차원의 비트 0은 비트필드 표현 등의 비트 0에 저장된다.
● 각 다음의 인덱스 차원에 대해서는, 이미 설정되었던 비트필드 표현에서의 가장 높은 비트의 위치가 결정되고, 다음 인덱스 차원의 위치는 다음 비트로부터 앞으로 시작된다.
이렇게 함으로써, 문제의 커넬 인덱스 공간 파티션의 차원은 N비트(32비트) 비트필드로 팩킹될 수 있다.
예를 들면, 아래에 명시된 대로 6 인덱스 차원을 갖고, 각 인덱스 차원에 대한 사이즈를 갖는, 인덱스 공간 파티션(서브 세트)에 대해서:
Figure 112014036075044-pat00002
다음과 같이 변경된 최대의 인덱스 차원 값의 세트를 주기 위해서 이들 값의 각각으로부터 1을 뺄 것이다.
Figure 112014036075044-pat00003
(풀 인코딩 공간이 사용될 수 있는 인덱스 차원 사이로부터 1을 뺀다(각 인덱스 차원의 사이즈 값은 항상 적어도 1이므로, "0"의 인코딩값은 결코 사용되지 않을 것이다).)
이렇게 각 인덱스 차원에 대해서 결정된 최대의 차원 값을 나타내는 데에 필요한 비트의 개수가 결정되는데, 그것은 이 예에서는 각각 이하의 비트 개수를 포함하는 필드를 필요로 할 것이다.
Figure 112014036075044-pat00004
커넬 호출의 인덱스에 대해서 사용되는 비트필드 표현은, 상기 설명한 방식으로, 이들 비트를 N비트(이 예에서는 32비트) 비트필드 표현으로 팩킹함으로써, 각 인덱스 차원에 대한 최대 값을 나타내는 데에 필요한 이들 결정된 비트 개수에 의거해서 결정된다.
따라서, 이 예에서는, 각 인덱스 차원의 값을 나타내기 위한 비트필드 인덱스 표현에서의 비트필드 위치는 다음과 같을 것이다(오른쪽에서 가장 낮은 차원을 갖는다): 20, 11, 4, 4, 2, 0
이와 같이, 비트필드 인덱스 표현은 다음과 같이 구성될 것이다.
필드의 비트 위치
Figure 112014036075044-pat00005

이 예에서는, 인덱스의 제3 인덱스 차원에 대한 필드가 0비트(즉, 제3 인덱스 차원에 대한 비트필드 인덱스 표현에 포함된 어떠한 필드도 없다)를 갖는다는 점에 유념해야 한다. 이것은 그것의 값이 항상 1이기 때문이다.
이와 같이, 호출 인덱스는 연속된 6개(혹은 더 적은)의 비트필드로서 표현될 것이다.
일단 사용될 비트필드 인덱스 표현이 결정되었다면, 문제의 인덱스 공간 파티션(서브 세트)에 대하여 결정된 최대의 인덱스 차원 값이 나중 사용을 위해서 이 형태로 저장된다. 최대의 인덱스 차원 값의 이 비트필드 표현은, "VLLset"(variable length limit set)라고 칭할 것이고, 최대의 인덱스 차원 값의 N비트(이 실시예에서는 32비트) 비트필드 표현(결정된 비트필드 인덱스 표현의 형태를 갖는다)으로 이루어질 것이다.
상기 예에서, 따라서, VLLset는 다음과 같이 구성될 것이다:
Figure 112014036075044-pat00006

비트필드 인덱스 표현을 구성하기 위한 예시적인 절차와 VLLset는 C++ 코드로 다음과 같이 표현될 수 있다:
// find-highest-set-bit function; returns 0 if no bit is set, or else the index of the highest bit set using 1-based counting (e.g. if the very top bit is set, return 32)
int fhs( uint32_t input )
{
int p = 0;
while( input != 0 ) { p++; input >>= 1; }
return p;
}
// construct the actual VLLset
uint32_t produce_vllset( const int dimensions[6], int placements[7] )
{
uint32_t vllset = 0;
for(int i=0;i<6;i++)
{
cutoffs[i] = fhs(vllset);
vllset |= (dimensions[i]-1) << placements[i];
}
placement[6] = 32;
return vllset;
}
인덱스 공간 파티션(서브 세트)에 대한 VLLset을 생성할 뿐만 아니라, N비트(32비트) 비트필드 인덱스 표현에서의 인덱스 공간의 서브 세트의 각 인덱스 차원에 대한 필드의 위치(비트필드 배치)도 나중에 사용하기 위해서 비트필드 배치 데이터 구조로 기록된다.
상기 주어진 예에 있어서, 이 비트필드 배치 정보(데이터 구조)는 차원 1이 32비트 비트필드에서 비트 0-1을 차지하고, 차원 2가 비트필드에서 비트 2-3을 차지하며, 차원 3이 비트필드에서 0비트를 차지하고, 차원 4가 비트필드에서 비트 4-10을 차지하며, 차원 5가 비트필드에서 비트 11-19를 차지하고, 차원 6이 비트필드에서 비트 20-31을 차지하는 것을 나타낼 것이다(혹은, 또 다른 방식으로 보면, 비트 0-1은 차원 1의 값을 포함하고, 비트 2-3은 차원 2의 값을 포함하며, 비트 4-10은 차원 4의 값을 포함하고, 비트 11-19는 차원 5의 값을 포함하며, 비트 20-31은 차원 6의 값을 포함한다).
비트필드 배치 데이터 구조는 예를 들면 각 인덱스 차원의 비트필드에 대한 시작 비트 위치를 나타낸다(인코드한다)("0"비트에서 항상 시작해서, 명시적으로 나타내는 것을 필요로 하지 않는 첫 번째를 세이브한다). 각 인덱스 차원에 대해서 사용되었던 실제의 비트 개수를 나타내는 등의 다른 구성은, 원하는 경우에 사용될 수 있다.
VLLset 및 비트필드 배치 데이터 구조는 같이 커넬 호출 인덱스 공간이 분할되는 각 파티션(서브 세트)에 대해서 지정되는 파라미터를 형성한다.
사용할 비트필드 인덱스 표현 및 비트필드 배치 데이터 구조 및 VLLset의 결정은 바람직하게는 처리하기 위한 커넬 또는 커넬들을 컴파일(compiles)하는 호스트 프로세서상의 컴파일러(compiler)에 의해 수행된다. 그렇지만, 그것은 다른 방식으로, 예를 들면 하드웨어로 또는 어떤 다른 방식으로든 행해질 수 있다.
일단 인덱스 공간 파티션에 대한 비트필드 배치 정보 및 VLLset가 생성되어 저장되었다면, 인덱스 공간 파티션에 대한 커넬 호출이 실행될 수 있다. 이것을 행하기 위해서, 그래픽 프로세서(21)는 VLLset에서 지정된 모든 차원에 대해서 반복해서, VLLset로 정의된 인덱스 공간 내의 각 포인트에 대한 커넬 호출을 생성해서 실행한다.
VLLset에 의해 정의된 인덱스 공간에 대해서 반복할 때 생성된 커넬 호출의 세트는, 이하의 C++ 코드에 의해 생성되는 세트 커넬 호출과 같다:
// function to extract a bitfield between two bit positions
uint32_t xbf( uint32_t inp, int lowbit, int highbit )
{
inp &= (1 << highbit) - 1;
return inp >> lowbit
}
void start_kernel_invocations( uint32_t vllset, int placements[7])
{
for(int i=0; i <= xbf( vllset, placements[5], placements[6]; i++)
for(int j=0; j <= xbf( vllset, placements[4], placements[5]; j++)
for(int k=0; k <= xbf( vllset, placements[3], placements[4]; k++)
for(int l=0; l <= xbf( vllset, placements[2], placements[3]; l++)
for(int m=0; m <= xbf( vllset, placements[1], placements[2]; m++)
for(int n=0; n <= xbf( vllset, placements[0], placements[1]; n++)
start_kernel_invocation_with_ID(n,m,l,k,j,i);
}
상기 프로세서는, VLLset를 이용하여, 문제의 파티션과 관련된 인덱스 공간의 파티션(서브 세트)에 대해서 실행되는 커넬 호출을 생성한다.
상기 설명한 것처럼, 각 호출을 그것의 대응하는 인덱스와 관련짓고 그 호출이 실행될 때 그 인덱스를 추적하는 것도 필요하다.
본 실시예에 있어서는, 본 발명에 따라, 주어진 커넬 호출용 6차원 인덱스는 언팩된 형태로 직접적으로 표현되지 않는다. 대신, 호출의 인덱스는 상기 설명한 것처럼 결정된 N비트(상기 설명한 것처럼, 본 실시예에서는 32비트) 비트필드 인덱스 표현으로 패킹된다(즉, 비트필드 표현은 커넬 인덱스 공간 파티션에 대한 비트필드 인덱스 표현에 대해서 결정된 필드의 개수를 포함하고, 각 필드는, 문제의 파티션(인덱스 공간 서브 세트)에 대해서 사용되는 비트필드 인덱스 표현의 필드와 매칭하는 사이즈를 갖고, 그 필드가 문제의 커넬 호출에 대해서 나타내는 인덱스 차원의 값을 나타낸다). 커넬 호출의 인덱스의 비트필드 인덱스 표현은 "VLIset"(variable length index set)라고 칭할 것이다.
이와 같이, 예를 들면, (1, 232, 66, 1, 2, 3)과 같은, 상기 인덱스 파티션(1, 400, 120, 1, 4, 4) 내의 호출 인덱스는, 다음과 같이 32비트 VLIset 비트필드 인덱스 표현으로서 저장될 것이다:
필드의 비트 위치
Figure 112014036075044-pat00007
이와 같이, 문제의 파티션(인덱스 공간 서브세트) 내의 각 커넬 호출용 인덱스는 N비트 비트필드 인덱스 표현(본 실시예에서는 32비트 비트필드 표현)으로서 표현된다. 그 다음 이것은 그것의 완전한 언팩 형태로 호출의 6차원의 인덱스를 나타내는 데에 필요한 저장 공간(storage space)에 대한 절약이다.
주어진 커넬 호출에 대한 VLIset를 구성하기 위한 예시적인 절차는 다음과 같이 C++ 코드로 표현될 수 있다:
uint32_t vliset_from_invocation_ID( int id[6], int placements[7] )
{
uint32_t vliset = 0;
for(int i = 0; i<6; i++)
vliset[i] |= id[i] << placements[i];
return vliset[i];
}
일단 VLIset가 커넬 호출에 대해서 생성되어서 그것과 관련되었다면, 커넬 호출이 실행될 수 있다. VLIset는 호출용 인덱스가 필요할 때마다 참고될 것이다. 이 인덱스가 필요할 때, VLIset가 판독되어 팩킹되지 않을 것이고, 그 후에 (VLIset 내의 어느 비트가 어느 인덱스 차원의 값을 나타내는지를 나타내는) 비트필드 배치 데이터 구조에 나타낸 정보에 따라 해석될 것이다.
주어진 커넬 호출에 대한 인덱스를 팩킹된 형태로 나타내지만, VLIset 비트필드 인덱스 표현 자체가 커넬 호출의 인덱스에 필요한 저장 공간에 대한 절약을 제공하기 때문에, 본 실시예에 있어서는, 추가 스텝들이 훨씬 더 효율적으로 각 커넬 호출의 인덱스를 나타내기 위해서 사용된다.
OpenCL에서, 커넬 호출은 통상 워크 그룹으로 그룹화되고, 호출 인덱스의 하위 3차원은 워크그룹 내의 워크 아이템의 공간을 지정하기 위해 사용되고, 호출 인덱스의 상위 3차원은 워크그룹의 공간을 정의하기 위해 사용된다. 본 출원인은, 일반적인 경우 것처럼, 주어진 구현에 있어서, 최대의 워크그룹 사이즈가 2^P 호출로 설정되어 있는 경우에, VLIset가 이들 호출의 각각에 할당되면, 서로 다른 호출의 VLIset는 단지 각 VLIset의 맨 아래의 P+2비트에서는 다를 수 있다. (이것은 본질적으로 워크 그룹 내의 워크 아이템의 개수에 제한이 있으면, 그 워크 아이템의 개수에 필요한 인덱스를 나타내는 데에 언제든지 필요할 수 있는 결정가능한 최대 인덱스 공간이 있을 수 있기 때문이다.)
본 실시예에 있어서는, 최대의 워크그룹 사이즈는 1024 호출(즉, 2^10)이다. 이것은, 주어진 인덱스 공간 파티션 내의 주어진 워크그룹 내의 서로 다른 커넬 호출의 인덱스를 나타내는 VLIset가 각 VLIset의 낮은 12비트에서만 다를 수 있다는 것을 의미한다. 즉, 같은 워크 그룹 내의 커넬 호출용 각 VLIset의 맨 위 20비트는 동일할 것이다.
본 실시예는, 호출당 단위로 주어지는 정보로서 각 VLIset의 맨 아래 12비트만 제공하도록 구성됨으로써 이 인식을 이용한다. 각 VLIset의 나머지의 20비트는 대신 각 워크 그룹과 관련되어 있으므로, 워크그룹당 단위로 공급 및 저장된다. 액티브 워크그룹의 개수는 통상적으로 어떤 소정의 시간에서의 액티브 호출보다도 훨씬 작기 때문에, 이것은 매우 중요한 저장 공간 절약을 제공할 수 있다.
그 다음, 커넬 호출의 인덱스를 판독하려고 시도할 때, 호출의 워크그룹에 대해서 저장되는 20비트는 개개의 호출(과 관련된)에 대해서 제공되는 12비트와 함께 연결되어서, 호출에 대한 VLIset를 생성한다. 그리고, 호출의 인덱스는 비트필드 배치 데이터 구조로 나타낸 비트필드 배치 정보에 따라, VLIset의 필드를 언팩킹(unpacking)함으로써 검색된다.
비트필드 인덱스 표현의 한 세트가 풀 커넬 실행을 나타내는 경우를 처리하기 위해서(예를 들면, 풀 커넬 실행이 2^N 이상의 호출(즉, 한 개의 N비트 비트필드 인덱스 표현이 나타낼 수 있는 2^N 이상의 호출)을 포함하기 때문에), 커넬의 호출 스페이스가 분할되는 각 파티션(서브 세트)에 대해서 커넬 파라미터가 준비되는데, 그것은 커넬 실행의 인덱스 공간 내의 파티션의 시작 위치(오프셋)를 지정한다.
예를 들면, 상기의 예에 따르면, 인덱스 공간에 대한 파티션뿐만 아니라:
Figure 112014036075044-pat00008

상기 설명한 대로, 이하의 인덱스 차원 값 범위를 갖는 인덱스 공간에 대한 추가 파티션이 있었다:
Figure 112014036075044-pat00009
한 세트의 오프셋은, 문제의 인덱스 공간 파티션(서브 세트)(과 관련되어)에 대해서 결정되어 저장될 것이고, 이 파티션 내의 각 인덱스 차원에 대한 시작점 값을 나타낸다. 이 예에 있어서, 이들 오프셋 값은 아래와 같다:
Figure 112014036075044-pat00010
이와 같이, 이 파티션에서의 인덱스 차원 5에 대한 값이 사실상 401에서 시작하는 것을 나타낸다.
그 다음, 이것은 단일의 N비트(2^N) 비트필드 표현이 자체적으로 인덱스 차원의 참 값을 나타낼 수 없다는 사실을 고려한다.
커넬이 전체 글로벌 호출 ID 또는 어떤 일부를 판독하려고 할 때, 이 커넬 오프셋 파라미터가 호출의 VLIset로부터 검색되는 파라미터에 부가된다. (오프셋에 대한 직접적인 지원이 있으면, 이것은 커넬 호출로 돌아가기 전에 이들 값을 부가함으로써 행해질 수 있거나, 또는 그것은 예를 들면 컴파일 시간에서 적절한 기능들을 포함함으로써 소프트웨어로 구현될 수 있었다.)
(오프셋 파라미터들은, 어플리케이션에 의해서 API에 제공될 수 있고, 그것은 커넬 코드를 컴파일링할 때 그들을 전용 데이터 구조에 저장하거나 그들을 베이크(bake)할 수 있는데, 그 이유는 그들이 고정이기 때문이다. 이 베이킹(baking)은 예를 들면 커넬 바이너리 자체에서의 삽입된 상수 또는 값에 대한 메모리에 런타임 변경가능한 값을 이용할 수 있었다.)
어떤 오프셋도 필요로 하지 않아야 하는 가장 낮은 파티션의 경우에는, 또는 단 한 개의 파티션만이 필요한 경우에는(즉 커넬이 2^N 이상의 호출을 필요로 하지 않는다), 파티션 오프셋 파라미터들의 이용은 간단히 제거될 수 있거나, 또는 그렇지 않으면 (예를 들면, 시스템이 실제로 필요한지 아닌지의 여부에 관계없이 오프셋 파라미터를 생성해서 사용하도록 구성되면), 각 인덱스 차원에 대한 0 오프셋으로 간단히 설정된 오프셋 파라미터가 사용될 수 있었다.
그러한 오프셋 파라미터는 또한 예를 들면, 커넬에 대해서 지정된 인덱스 공간이 원점에서 시작하는 것이 아니라, 어떤 다른 지점에서 시작하도록 설정된 경우에, 사용될 수 있다. 이것은 OpenCL이 주어진 커넬용 인덱스 공간으로 하여금 원점 이외의 위치에서 시작하게 하기 때문에, OpenCL을 갖진 경우일 수 있다.
본 실시예에서는, 주어진 커넬 호출용 OpenCL 호출 인덱스의 풀 126비트를 제공하는 총 비용이 다음과 같이 감소될 수 있다는 것을 알 수 있다:
● 호출당 12비트
● 워크그룹당 20비트, 및
● 인덱스 공간 파티션(서브 세트)당 한 번 제공되는 커넬 파라미터에 대해서 96비트.
따라서, 이것은 호출 인덱스를 제공하는 비용의 관점에서 상당한 절약이다.
한 개의 높은 다이나믹 레인지 화상을 그 입력으로서 취하고, 3개의 서로 다른 개선된 낮은 다이나믹 레인지 출력 화상을 그 출력으로서 생성하는 병렬 화상 필터 처리 알고리즘을 실행할 때에 본 실시예를 이용하는 것을 기술해서 본 실시예의 동작을 추가로 설명할 것이다.
이 예에서는, 화상 필터링 알고리즘이 OpenCL 커넬에 의해서 구현된다. 이와 같이, 화상 필터링 잡이 예를 들면, 처리하기 위한 (즉, 예를 들면, 호스트 CPU 20 상에서 작동하고 있는) OpenCL 구현에 그것을 필요로 하는 어플리케이션에 의해 제공될 것이다. 이 단계에서, 어플리케이션에 의해 제공된 잡은 기본적으로 입력 화상 데이터, 필터링 알고리즘을 구현하는 커넬, 6 커넬 차원의 사이즈 및 출력 데이터를 놓는 위치에 대한 정보로 구성될 것이다.
OpenCL 구현은 예를 들면 그것의 드라이버 소프트웨어에 의해, VLLset 및 비트 필드 배치 정보(상기 설명한 것처럼)를 계산할 것이다.
이 예에서는, 입력 및 출력 화상의 해상도가 같다 - 그 입력 화상 해상도는 1920×1080이고, 따라서 각 출력 화상의 해상도도 1920×1080이다 -고 가정하고, 또 화상 필터링 알고리즘이 출력 화소마다 한 번 실행되어야 하는 OpenCL 커넬로 구현되고, 즉 각 출력 화소는 워크 아이템이다.
워크 아이템(처리될 화소)이 따라서 차원 8×8×3 워크 아이템의 워크 그룹으로 그룹화됨으로써, 워크 아이템의 각 그룹이 각 출력 화상의 8×8 2D 영역(에 대응하고)을 커버하고, 그 위치에서 3개의 출력 화상의 각각을 함께 그룹화한다(그것에 의해 3개의 출력 화상이 같은 입력 데이터를 이용할 것이라는 사실로 인해 더 나은 캐시 이용에서 이득이 있다).
이와 같이 3개의 1920×1080 출력 화상은 한 세트의 240×135=32400 워크 그룹, 8×8×3=192 워크 아이템의 각각이 된다.
본 실시예의 방식으로 글로벌 워크 아이템 ID의 6차원에 이것을 맵핑하면, 다음과 같다:
Figure 112014036075044-pat00011
커넬 호출의 인덱스에 사용되는 비트필드 인덱스 표현은 각 인덱스 차원에 필요한 최대 값을 나타내는 데에 필요한 결정된 비트의 개수에 의거해서 결정된다. 이 경우, 32비트 비트필드 표현을 가정하면, 인덱스 차원 필드는 다음과 같은 비트필드 표현으로 배열될 것이다.
Figure 112014036075044-pat00012
(화살표는 인덱스 필드의 각각에 대한 시작 비트 위치를 나타낸다.)
이 경우에 Work Group ID의 Z 차원(WZ)은, 그것의 차원이 1이고 최대값이 항상 0이므로 비트필드 인덱스 표현에서 0비트를 사용할 수 있었지만, 고정된 32비트 비트필드 인덱스 표현 워드에서 어떤 추가 비트를 절약할 필요가 없기 때문에, 어떠한 종료 종단도 없고, WZ가 나머지 비트로 인코딩된다는 점에 유념해야 한다.
비트필드 인덱스 표현이 어떻게 분할되는지를 설명하는 비트필드 배치 데이터 구조(정보)가 준비된다. 본 실시예에 있어서는, 이 데이터 구조가 함축적으로 0인 첫 번째를 제외하고 각 인덱스 필드에 대한 시작 비트 위치를 인코딩한다. 이 경우에 각 비트필드 인덱스 표현이 32비트 워드이므로, 비트필드 배치 데이터 구조에서의 각 시작 값 필드는 양쪽 '0' 및 '32'를 인코딩할 수 있도록 6비트로 설정된다.
Figure 112014036075044-pat00013
서로 다른 인덱스 차원의 사이즈에 추가적인 제약을 적용함으로써, 그에 대응해서 이들 필드가 조절될 수 있다는 점에 유념해야 한다. 예를 들면, 워크그룹당 최대 256 워크 아이템을 갖는 구현에 대해서는, 로컬 3차원의 워크 아이템 ID의 각 차원을 인코딩하는 데에 필요한 최대의 비트 개수가 10일 것이다. 이 경우, 로컬 워크 아이템 차원 LX/LY/LZ의 각각은, 그들의 시작 비트 위치를 인코딩하기 위해서 6비트 대신에 4비트만을 필요로 할 것이다(가시적인 인코딩 구조도 변경할 필요없이 나중에 워크 그룹 사이즈 제한을 증가시킬 수 있는 공간(room)을 남겨두는 것이 여전히 바람직할 수도 있지만).
시작 비트 정보 대신에, 비트필드 배치 데이터 구조로 인코딩된 값들은 예를 들면 인덱스 차원당 필요한 비트 개수일 수 있다. 이것은 6차원에 대한 각각에 대해서 최악의 경우에 5비트를 필요로 할 것이지만, (적어도 단일 포인트 디코딩에 대해서 동작가능하지만, 분포된 디코딩에 대해서는 덜 바람직할 수도 있는) 순환(recursive) 디코더를 필요로 할 것이다.
비트필드 배치 데이터 구조뿐만 아니라, 드라이버도 커넬에 대해서 사용되는 최대의 인덱스 차원 값들을 비트필드 인덱스 표현의 비트필드에서 인코딩하고, 비트필드 인덱스 표현의 형태를 갖는 최대값 데이터 구조(VLLset)를 생성한다. 이와 같이, 본 예에서는, VLLset는 아래의 인덱스값을 인코딩한다:
Figure 112014036075044-pat00014
일단 비트필드 배치 데이터 구조 및 VLLset가 준비되었다면, 그들이 처리하기 위한 GPU 하드웨어(21)에 커넬과 함께 전송된다. 이것은 그들을 메모리 데이터 구조에 저장함으로써 행해지만, 전용 명령 버퍼 등을 이용하는 것과 같은 다른 구성도 원한다면 가능할 것이다.
GPU(21)는 VLLset로 나타낸 인덱스 공간 전체에 걸쳐 커넬 호출을 실행한다. 이 프로세서는 표시된 인덱스 공간 전체에 걸쳐 반복하는 GPU(21)의 동작을 개략적으로 나타내는 도 3에 예시되어 있다.
이 실시예에 있어서, GPU 하드웨어는, GPU(많이 있을 수 있는)의 이용가능한 컴퓨트 유닛에 워크 그룹 태스크(31)를 발행하고, 커넬 인덱스 공간의 3개의 가장 높은 차원을 관통하는 워크 그룹 반복유닛(30)을 갖는다. 이것을 행하기 위해서, 워크 그룹 반복유닛(30)은 VLLset(32) 및 비트필드 배치 정보(33)를 이용해서 워크 그룹 세트의 인덱스 차원을 묘사하는 3개의 정수를 추출한다. 횡단 순서는 임의적일 수 있지만, 본 실시예에서는, 이 반복은 WX 차원을 통해서, 즉 워크 그룹 세트의 라인별로 선형으로 행해진다.
컴퓨트 유닛이 그것의 3차원의 워크 그룹 ID(35)에 의해 식별된 워크 그룹 태스크(31)를 수신할 때, 그것은 워크 아이템 반복자(34)를 이용해서 3개의 가장 낮은 인덱스 차원 전체를 횡단함으로써 실행용 스레드(커넬 호출)를 생성하고, 각 워크 아이템에 대해서 한 개의 스레드(thread)(호출)를 생성한다. 이 워크 아이템 반복자(34)는 다시 VLLset(32) 및 비트필드 배치 정보(33)를 이용해서 로컬 워크 아이템 세트의 인덱스 차원을 묘사하는 3개의 정수를 추출한다. 다시 횡단 순서는 임의적일 수 있지만, 이 예에서는, 이 반복은 LX 차원을 통해서 선형적으로, 즉 각 출력 서브 화상의 라인별로 행해진다.
상기 설명한 것처럼, 워크 그룹 내의 워크 아이템의 최대 개수가 256일 때, 로컬 워크 아이템 ID(37)를 인코딩하는 데에 필요한 최대 비트 개수는 10이고, 이것은 워크 그룹 ID(35)에 대해서 22비트를 남긴다(완전한 글로벌 워크 아이템 ID에 대한 상한이 32비트인 경우). 이것은 다음과 같이 각 컴퓨트 유닛에 의해 이용되고: 워크 그룹이 컴퓨트 유닛 상에서 실행되고 있고, 그것은 모든 워크 아이템들 사이에서 공유 상태로서 팩킹된 워크 그룹 ID(35)의 22비트 및 풀 비트필드 배치 정보(33)를 이용하지만, 팩킹된 개개의 로컬 워크 아이템 ID(37)의 10비트를 프라이빗(private) 상태로서 각 대응하는 워크 아이템에 제공한다.
각 생성된 스레드(36)는 잡의 커넬을 실행하는 것을 시작하고, 완전한 6 인덱스 차원으로 이루어진 그것의 글로벌 ID(38)를 찾는다. 하드웨어는 공유된 워크 그룹 ID(35)와 프라이빗 로컬 워크 아이템 ID(37)를 결합하고, 비트필드 배치 정보(33)를 이용해서 인덱스 공간 내의 워크 아이템을 식별하는 완전한 6정수의 세트를 디코딩하고, 그것을 스레드(커넬 호출)(36)로 돌려보낸다
그 ID의 지식으로, 스레드(36)는 입력 화상으로부터 정확한 데이터를 로드해서 처리할 수 있고(이 경우에 화상 필터링 알고리즘을 실행), 출력값을 출력 화상에서의 정확한 위치에 저장할 수 있다. 입력 및 출력 화상은 GPU(21)에 또는 GPU(21)에 의해 액세스가능한 적절한 메모리에 저장될 수도 있다.
이것은 모든 워크 아이템(커넬 호출)이 실행될 때까지 반복될 것이고, 그 포인트에서 출력 화상은 완전할 것이고, 사용하기 위해서, 예를 들면 표시 및/또는 분석하기 위해서 이용가능할 것이다.
본 실시예는 주어진 커넬을 처리하는 것을 참조해서 상기에서 설명했지만, 본 발명의 기술은 실행되어야 하는 각각의 커넬 및 모든 커넬에 대해서 이용될 수 있고 바람직하게는 이용된다는 것을 인지할 것이다. 이와 같이, 보통 실행될 일련의 커넬이 있을 것이고, 각 커넬은 본 실시예의 방식으로 처리될 것이다.
마찬가지로, 본 실시예는 OpenCL 커넬을 참조하고 6차원의 인덱스 공간을 이용해서 상기에서 설명했지만, 본 기술분야의 당업자에게는 자명한 것으로, 본 발명은 다른 다차원의 인덱싱 구성에도 동등하게 적용가능하다. 이와 같이, 예를 들면, 본 발명은 그래픽 프로세서에서의 정점 셰이딩(vertex shading)의 경우가 될 수 있는 것처럼, DirectCompute와 같은, 다른 커넬 호출 프로세스, 또는, 정말로, 다차원의 인덱스가 처리 또는 실행될 스레드 등과 관련될 필요가 있는 기타의 상황에도 동등하게 적용될 수도 있다.
동등하게는, 비트필드 인덱스 표현의 구조는 원하는 대로 변경될 수 있다. 예를 들면, 비트필드 인덱스 표현에 필요한 필드의 개수는 인덱스가 얼마나 많은 차원을 가지는지(실제로 어떤 주어진 인덱스의 세트에 대한 필요성)에 의해 결정될 것이다.
본 발명은 그것의 바람직한 실시예에 있어서 적어도, 다차원의 인덱스를 저장해서 이용하기 위한 보다 효율적인 메카니즘을 제공하는 것을 상기로부터 알 수 있다. 이것은 인덱스를 제공해서 사용하는 비용의 관점에서 이점이 있다.
이것은 필요한 인덱스의 범위를 평가해서 인덱스에 대한 보다 치밀한 비트필드 표현을 결정함으로써 적어도 본 발명의 바람직한 실시예에서 달성되고, 그 표현은 인덱스에 대해서 사용된다.

Claims (23)

  1. 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 시스템에서 커넬 호출을 처리하는 방법으로서, 상기 방법은,
    정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서,
    커넬의 인덱스의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 비트의 개수를 결정하고,
    커넬의 인덱스의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 결정된 비트의 개수에 의거해서 커넬의 호출용 인덱스를 나타내기 위해 사용되는 비트필드 인덱스 표현을 결정하며,
    커넬의 호출용 인덱스를 나타내기 위해 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 표시하는 비트들의 배치를 나타내는, 커넬에 대한 비트필드 배치 데이터 구조를 준비하고,
    비트필드 배치 데이터 구조를 커넬을 실행해야 하는 프로세서 또는 프로세서들에 제공하며,
    커넬 호출이 실행될 때, 커넬 호출용 각 인덱스 차원의 값을, 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내고, 비트필드 배치 데이터 구조로 나타낸 비트필드 배치에 따라 구성된 비트필드 인덱스 표현을 커넬 호출과 관련지어서, 커넬 호출용 커넬 호출 인덱스를 나타내는 것을 포함하는 것을 특징으로 하는, 방법.
  2. 실행될 커넬들이 커넬들에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 처리 시스템을 동작시키는 방법으로서, 상기 방법은,
    정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서,
    커넬의 인덱스의 각 차원에 대해서, 그 커넬의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고,
    커넬의 인덱스의 각 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거해서 커넬의 호출용 인덱스들을 나타내기 위해서 사용되는 비트필드 인덱스 표현을 결정하고,
    커넬의 호출용 인덱스들을 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 표현하는 비트들의 배치를 나타내는, 커넬에 대한 비트필드 배치 데이터 구조를 준비하는 것을 포함하는 것을 특징으로 하는 방법.
  3. 제 1 항 또는 제 2 항에 있어서,
    커넬에 대한 인덱스 차원이 단일의 상수(constant)값을 가지면, 상기 비트필드 인덱스 표현에서의 어떤 비트도 그 인덱스 차원에 할당하지 않는 것을 특징으로 하는, 방법.
  4. 제 1 항 또는 제 2 항에 있어서,
    커넬에 대한 인덱스 공간의 실제의 사이즈에 관계없이, 커넬에 대한 비트필드 인덱스 표현에 대해서 미리 결정된 비트 개수를 이용하는 것을 더 포함하는 것을 특징으로 하는, 방법.
  5. 제 1 항 또는 제 2 항에 있어서,
    비트필드 배치 데이터 구조로 나타낸 구성을 갖는 데이터 구조에, 커넬의 호출에 대한 차원에 대해서 사용되는 최대값을, 커넬의 인덱스의 각 차원에 대해서 나타내는 커넬 인덱스 최대 차원 값 데이터 구조를 준비해서 저장하는 것을 더 포함하는 것을 특징으로 하는, 방법.
  6. 제 1 항 또는 제 2 항에 있어서,
    커넬에 대해서 명시된 인덱스 공간을 2개 이상의 서브세트로 분할하고,
    그 후에 각 인덱스 공간 서브세트에 대하여,
    커넬에 대한 인덱스 공간 서브세트의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 비트의 개수를 결정하고,
    커넬에 대한 인덱스 공간 서브세트의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 결정된 비트의 개수에 의거해서 커넬의 호출용 인덱스들을 나타내기 위해 사용되는 비트필드 인덱스 표현을 결정하며,
    커넬의 호출용 인덱스들을 나타내기 위해 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬에 대한 인덱스 공간 서브세트의 각 차원을 표시하는 비트들의 배치를 나타내는, 커넬에 대한 비트필드 배치 데이터 구조를 준비하고,
    비트필드 배치 데이터 구조를 커넬을 실행해야 하는 프로세서 또는 프로세서들에 제공하며,
    커넬 호출이 실행될 때, 커넬 호출용 각 인덱스 차원의 값을, 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내고, 비트필드 배치 데이터 구조로 나타낸 비트필드 배치에 따라 구성된 비트필드 인덱스 표현을 커넬 호출과 관련지어서, 커넬 호출용 커넬 호출 인덱스를 나타내는 것을 더 포함하는 것을 특징으로 하는, 방법.
  7. 제 1 항 또는 제 2 항에 있어서,
    비트필드 인덱스 표현으로 나타낸 1개 이상의 인덱스 차원에 대한 비트필드 인덱스 표현으로 나타낸 값에 부가되는 오프셋 값을 생성하는 것을 더 포함하는 것을 특징으로 하는, 방법.
  8. 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 시스템에서 실행되고 있는 커넬 호출을 인덱싱하는 방법으로서, 상기 방법은,
    정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서,
    커넬의 호출용 인덱스를 나타내기 위해 사용되는 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 표현하는 비트들의 배치를 나타내는, 커넬에 대한 비트필드 배치 데이터 구조를 판독하고,
    커넬의 호출이 실행될 때, 커넬 호출용 각 인덱스 차원의 값을, 커넬에 대한 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내는 비트필드 인덱스 표현을 커넬 호출과 관련지어서, 커넬 호출용 인덱스를 나타내는 것을 포함하는 것을 특징으로 하는 방법.
  9. 제 1 항, 제 2항 또는 제 8항 중 어느 한 항에 있어서,
    커넬 호출이 실행되고, 또 비트필드 인덱스 표현에서의 어떤 비트도 인덱스 차원에 할당되지 않은 경우에는, 호출의 인덱스를 도출하기 위해서 비트필드 인덱스 표현을 해석할 때 그 인덱스 차원에 하나의 값을 할당하는 것을 더 포함하는 것을 특징으로 하는 방법.
  10. 제 1 항, 제 2항 또는 제 8항 중 어느 한 항에 있어서,
    각 커넬 호출에 대한 비트필드 인덱스 표현을, 2개의 부분, 문제의 커넬 호출에 특정한 제1 부분과, 커넬 호출의 그룹으로 공유되는 제2 부분으로 분할하는 것을 더 포함하는 것을 특징으로 하는 방법.
  11. 실행될 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 커넬 호출을 처리하는 시스템으로서, 상기 시스템은,
    정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서,
    커넬의 인덱스의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 비트의 개수를 결정하고,
    커넬의 인덱스의 각 차원에 대해서 표시될 최대값을 나타내는 데에 필요한 결정된 비트의 개수에 의거해서 커넬의 호출용 인덱스를 나타내기 위해서 사용되는 비트필드 인덱스 표현을 결정하며,
    커넬의 호출용 인덱스를 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 표현하는 비트의 배치를 나타내는, 커넬에 대한 비트필드 배치 데이터 구조를 준비하고,
    비트필드 배치 데이터 구조를, 커넬을 실행하는 프로세서 또는 프로세서들에 제공하도록 구성된 한 개 이상의 프로세서를 구비하고,
    상기 시스템은,
    커넬을 실행하고,
    커넬 호출이 실행될 때, 커넬 호출용 각 인덱스 차원의 값을, 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내고, 비트필드 배치 데이터 구조로 나타낸 비트필드 배치에 따라 구성된 비트필드 인덱스 표현을 커넬 호출과 관련지어서, 커넬 호출용 커넬 호출 인덱스를 나타내도록 구성된 한 개 이상의 프로세서를 더 구비하는 것을 특징으로 하는, 처리 시스템.
  12. 실행될 커넬들이 커넬들에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 커넬 호출을 처리하는 시스템으로서, 상기 시스템은,
    정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대해서,
    커넬의 인덱스의 각 차원에 대해서, 그 커넬의 인덱스의 차원을 나타내는 데에 필요한 최대의 비트 개수를 결정하고,
    커넬의 인덱스의 각 차원을 나타내는 데에 필요한 결정된 최대의 비트 개수에 의거해서 커넬의 호출용 인덱스를 나타내기 위해서 사용되는 비트필드 인덱스 표현을 결정하고,
    커넬의 호출용 인덱스를 나타내기 위해서 사용되는 결정된 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 표현하는 비트들의 배치를 나타내는, 커넬에 대한 비트필드 배치 데이터 구조를 준비하도록 구성된 한 개 이상의 프로세서를 구비하는 것을 특징으로 하는 처리 시스템.
  13. 제 11 항 또는 제 12 항에 있어서,
    한 개 이상의 프로세서는,
    커넬용 인덱스 차원이 단일의 상수값을 가질 경우, 상기 비트필드 인덱스 표현에서의 어떤 비트도 그 인덱스 차원에 할당하지 않도록 더 구성된 것을 특징으로 하는 처리 시스템.
  14. 제 11 항 또는 제 12 항에 있어서,
    한 개 이상의 프로세서는,
    커넬용 인덱스 공간의 실제의 사이즈에 관계없이, 각 커넬에 대한 비트필드 인덱스 표현에 대하여 미리 결정된 비트의 개수를 사용하도록 더 구성된 것을 특징으로 하는 처리 시스템.
  15. 제 11 항 또는 제 12 항에 있어서,
    한 개 이상의 프로세서는,
    비트필드 배치 데이터 구조로 나타낸 구성을 갖는 데이터 구조에, 커넬의 호출용 차원에 대해서 사용되는 최대값을, 커넬의 인덱스의 각 차원에 대해서 나타내는 커넬 인덱스 최대 차원 값 데이터 구조를 준비해서 저장하도록 더 구성된 것을 특징으로 하는 처리 시스템.
  16. 제 11 항 또는 제 12 항에 있어서,
    한 개 이상의 프로세서는,
    커넬에 대해서 지정된 인덱스 공간을 2개 이상의 서브 세트로 분할하고, 그 다음 각 인덱스 공간 서브세트에 대하여 각 비트필드 인덱스 표현을 결정하여 사용하도록 더 구성된 것을 특징으로 하는 처리 시스템.
  17. 제 11 항 또는 제 12 항에 있어서,
    한 개 이상의 프로세서는,
    비트필드 인덱스 표현으로 나타낸 한 개 이상의 인덱스 차원에 대하여 비트필드 인덱스 표현으로 나타낸 값에 부가되어야 하는 오프셋 값을 생성하도록 더 구성된 것을 특징으로 하는 처리 시스템.
  18. 실행된 커넬이 커넬에 대한 별도의 호출이 실행되는 복수의 인덱스 차원의 세트를 정의하는 시스템에서 커넬 호출을 실행하는 프로세서로서, 상기 프로세서는,
    정의된 인덱스 차원의 세트를 갖는 실행될 커넬에 대한 비트필드 배치 데이터 구조 - 이 비트필드 배치 데이터 구조는 커넬의 호출용 인덱스를 나타내기 위해서 사용되는 비트필드 인덱스 표현 내에서 커넬의 인덱스의 각 차원을 표현하는 비트들의 배치를 나타낸다 - 를 판독하도록 구성되고,
    커넬의 호출이 실행될 때, 커넬 호출용 각 인덱스 차원의 값을, 커넬에 대한 비트필드 배치 데이터 구조로 나타낸 각 비트 위치에 나타내는 비트필드 인덱스 표현을 커넬 호출과 관련지어서, 커넬 호출용 인덱스를 나타내도록 구성된 것을 특징으로 하는, 프로세서.
  19. 제 11 항 또는 제 12 항에 있어서,
    상기 한 개 이상의 프로세서는,
    커넬 호출이 실행되고, 그리고 비트필드 인덱스 표현에서의 어떤 비트도 인덱스 차원에 할당되지 않은 경우에, 호출의 인덱스를 도출하기 위해서 비트필드 인덱스 표현을 해석할 때 그 인덱스 차원에 하나의 값을 할당하도록 더 구성된 것을 특징으로 하는 처리 시스템.
  20. 제 11 항 또는 제 12 항에 있어서,
    상기 한개 이상의 프로세서는
    각 커넬 호출에 대한 비트필드 인덱스 표현을 2개의 부분, 문제의 커넬 호출에 특정한 제1 부분과, 커넬 호출의 한 그룹에 의해 공유되는 제2 부분으로 분할하도록 더 구성된 것을 특징으로 하는 처리 시스템.
  21. 제 18항에 있어서,
    상기 프로세서는,
    커넬 호출이 실행되고, 그리고 비트필드 인덱스 표현에서의 어떤 비트도 인덱스 차원에 할당되지 않은 경우에, 호출의 인덱스를 도출하기 위해서 비트필드 인덱스 표현을 해석할 때 그 인덱스 차원에 하나의 값을 할당하도록 더 구성된 것을 특징으로 하는 프로세서.
  22. 제 18항 또는 제 21항에 있어서,
    상기 프로세서는
    각 커넬 호출에 대한 비트필드 인덱스 표현을 2개의 부분, 문제의 커넬 호출에 특정한 제1 부분과, 커넬 호출의 한 그룹에 의해 공유되는 제2 부분으로 분할하도록 더 구성된 것을 특징으로 하는 프로세서.
  23. 프로그램이 데이터 처리 수단에서 실행될 때 제 1항, 제 2항 또는 제 8항 중 어느 한 항에 기재된 방법을 수행하기 위한 컴퓨터 소프트웨어를 포함하는 컴퓨터 프로그램을 기록한 컴퓨터 판독가능한 기록매체.
KR1020140045218A 2013-04-16 2014-04-16 마이크로프로세서 시스템에서의 다차원 인덱싱 방법 및 장치 KR102253788B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US13/863,599 2013-04-16
US13/863,599 US9772864B2 (en) 2013-04-16 2013-04-16 Methods of and apparatus for multidimensional indexing in microprocessor systems

Publications (2)

Publication Number Publication Date
KR20140124337A KR20140124337A (ko) 2014-10-24
KR102253788B1 true KR102253788B1 (ko) 2021-05-21

Family

ID=50845092

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020140045218A KR102253788B1 (ko) 2013-04-16 2014-04-16 마이크로프로세서 시스템에서의 다차원 인덱싱 방법 및 장치

Country Status (4)

Country Link
US (1) US9772864B2 (ko)
KR (1) KR102253788B1 (ko)
CN (1) CN104111967B (ko)
GB (1) GB2516145B (ko)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP3018587B1 (en) * 2014-11-05 2018-08-29 Renesas Electronics Europe GmbH Memory access unit
US9965343B2 (en) * 2015-05-13 2018-05-08 Advanced Micro Devices, Inc. System and method for determining concurrency factors for dispatch size of parallel processor kernels
US10467724B1 (en) 2018-02-14 2019-11-05 Apple Inc. Fast determination of workgroup batches from multi-dimensional kernels
US10593094B1 (en) * 2018-09-26 2020-03-17 Apple Inc. Distributed compute work parser circuitry using communications fabric

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
TW494322B (en) 2000-05-29 2002-07-11 Ibm Prefix search method and data structure using compressed search tables
US7283987B2 (en) 2001-03-05 2007-10-16 Sap Ag Compression scheme for improving cache behavior in database systems
US7430560B1 (en) 2005-07-22 2008-09-30 X-Engines, Inc. Multi-level compressed lock-up tables formed by logical operations to compress selected index bits
US7584342B1 (en) * 2005-12-15 2009-09-01 Nvidia Corporation Parallel data processing systems and methods using cooperative thread arrays and SIMD instruction issue
US7698285B2 (en) 2006-11-09 2010-04-13 International Business Machines Corporation Compression of multidimensional datasets
US8321849B2 (en) * 2007-01-26 2012-11-27 Nvidia Corporation Virtual architecture and instruction set for parallel thread computing
CN101241506A (zh) * 2008-03-17 2008-08-13 张建中 一种多维检索方法和装置以及系统
JP5707265B2 (ja) * 2011-07-20 2015-04-22 ルネサスエレクトロニクス株式会社 演算制御装置及び演算制御方法並びにプログラム、並列プロセッサ
WO2013025970A1 (en) * 2011-08-17 2013-02-21 Volcano Corporation Classification trees on gpgpu compute engines

Also Published As

Publication number Publication date
KR20140124337A (ko) 2014-10-24
GB2516145A (en) 2015-01-14
US9772864B2 (en) 2017-09-26
GB2516145B (en) 2016-02-10
GB201406835D0 (en) 2014-05-28
CN104111967B (zh) 2019-06-07
US20140310507A1 (en) 2014-10-16
CN104111967A (zh) 2014-10-22

Similar Documents

Publication Publication Date Title
US11127167B2 (en) Efficient matrix format suitable for neural networks
US20240176601A1 (en) Method and system of command buffer between a cpu and gpu
CN106251392B (zh) 用于执行交织的方法和设备
TWI525540B (zh) 具有橫跨多個處理器之平行資料執行緒的映射處理邏輯
CN112085658B (zh) 用于非均匀帧缓冲器栅格化的装置和方法
US9947084B2 (en) Multiresolution consistent rasterization
US9478002B2 (en) Vertex parameter data compression
US10176627B2 (en) Tree-based graphics primitive rendering
KR102253788B1 (ko) 마이크로프로세서 시스템에서의 다차원 인덱싱 방법 및 장치
JP5778343B2 (ja) グラフィックス処理ユニットでの命令カリング
US10186068B2 (en) Method, apparatus and system for rendering an image
US20180165092A1 (en) General purpose register allocation in streaming processor
US20190130524A1 (en) Graphics Rendering Using a Hierarchical Acceleration Structure
CN111240744B (zh) 一种提高涉及稀疏矩阵并行计算效率的方法和系统
US20200184002A1 (en) Hardware accelerated convolution
US20160232642A1 (en) Parallel Image Processing Method and System
KR20230010672A (ko) 데이터 압축의 방법 및 장치
CN117271136A (zh) 数据处理方法、装置、设备和存储介质
US20210295584A1 (en) Graphics processing
CN111882482A (zh) 图形分块数据读写方法、装置、设备及存储介质
US20130166887A1 (en) Data processing apparatus and data processing method
US20230144553A1 (en) Software-directed register file sharing
Yu et al. A study of scientific visualization on heterogeneous processors using Legion
CN117806828A (zh) 一种基于对等内存访问的gpu合并舒尔补的方法
EP3101650A1 (en) Method and apparatus for performing interleaving

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