KR20140131200A - 멀티스레드 프로그램 코드의 변환 장치 및 방법 - Google Patents

멀티스레드 프로그램 코드의 변환 장치 및 방법 Download PDF

Info

Publication number
KR20140131200A
KR20140131200A KR1020130050251A KR20130050251A KR20140131200A KR 20140131200 A KR20140131200 A KR 20140131200A KR 1020130050251 A KR1020130050251 A KR 1020130050251A KR 20130050251 A KR20130050251 A KR 20130050251A KR 20140131200 A KR20140131200 A KR 20140131200A
Authority
KR
South Korea
Prior art keywords
loop
code
group
statement
work
Prior art date
Application number
KR1020130050251A
Other languages
English (en)
Other versions
KR102062208B1 (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 삼성전자주식회사
Priority to KR1020130050251A priority Critical patent/KR102062208B1/ko
Priority to EP14166856.6A priority patent/EP2799986B1/en
Priority to US14/268,383 priority patent/US9665354B2/en
Priority to CN201410184147.0A priority patent/CN104133668B/zh
Publication of KR20140131200A publication Critical patent/KR20140131200A/ko
Application granted granted Critical
Publication of KR102062208B1 publication Critical patent/KR102062208B1/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/38Concurrent instruction execution, e.g. pipeline or look ahead
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/458Synchronisation, e.g. post-wait, barriers, locks
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

멀티스레드 프로그램 코드의 변환 방법이 개시된다. 일 양상에 따른 멀티스레드 프로그램 코드의 변환 방법은, 멀티스레드 프로그램 코드를 동기화 지점에 따라 적어도 2이상의 스테이트먼트로 분할하는 단계와, 분할된 스테이트먼트 내의 인스트럭션 개수를 기반으로, 적어도 하나 이상의 인접 스테이트먼트를 결합하여 적어도 하나 이상의 루프 그룹을 생성하는 단계와, 루프 그룹 각각에 대하여, 해당 루프 그룹에 포함되는 스테이트먼트 별로 상이한 작업 그룹의 작업 항목을 직렬적으로 실행할 수 있도록, 각 스테이트먼트 내의 변수를 확장하거나 이름을 바꾸는 단계와, 루프 그룹 각각에 대하여 작업 항목 합체 루프로 감싸는 단계를 포함할 수 있다.

Description

멀티스레드 프로그램 코드의 변환 장치 및 방법{Apparatus and Method for translating multithreaded program code}
프로그램의 컴파일링에 관한 것으로, 특히, 멀티스레드 프로그램 코드의 변환 장치 및 방법에 관한 것이다.
멀티코어(multicore) 또는 매니코어(manycore)가 발전하고 있다. 또한 데이터 병렬 프로그램(Data Parallel program)을 실행하기 위한 이종 시스템(Heterogeneous system)이 고성능 컴퓨팅(High Performance Computing) 분야에서 관심을 받고 있다. 이러한 요구에 이종 시스템에서 데이터 병렬 프로그램을 동작시키기 위한 표준인 OpenCL(Open Computing Language)이 제안되었다. OpenCL은 CPU, GPU, DSP 등의 프로세서로 이루어진 이종 플랫폼에서 병렬 프로그래밍을 하기 위한 표준으로, 다양한 플랫폼에서 동일한 프로그램 소스를 사용할 수 있도록 하여, 소프트웨어 개발자에게 이동성(portability)과 여러 플랫폼의 프로세싱 파워를 쉽게 이용할 수 있도록 해준다.
멀티스레드 프로그램 코드의 변환 장치 및 방법을 제공하는 것을 목적으로 한다.
일 양상에 따른 멀티스레드 프로그램 코드의 변환 방법은, 멀티스레드 프로그램 코드를 동기화 지점에 따라 적어도 2이상의 스테이트먼트로 분할하는 단계와, 분할된 스테이트먼트 내의 인스트럭션 개수를 기반으로, 적어도 하나 이상의 인접 스테이트먼트를 결합하여 적어도 하나 이상의 루프 그룹을 생성하는 단계와, 루프 그룹 각각에 대하여, 해당 루프 그룹에 포함되는 스테이트먼트 별로 상이한 작업 그룹의 작업 항목을 직렬적으로 실행할 수 있도록, 각 스테이트먼트 내의 변수를 확장하거나 이름을 바꾸는 단계와, 루프 그룹 각각에 대하여 작업 항목 합체 루프로 감싸는 단계를 포함할 수 있다.
여기서, 멀티스레드 프로그램 코드는 OpenCL 커널 코드 또는 CUDA 커널 코드일 수 있다.
여기서, 동기화 지점은 멀티스레드 프로그램 코드의 시작 지점, 배리어 함수, 제어 구조(control structure)의 시작 지점 중 적어도 하나를 포함할 수 있다.
또한, 멀티스레드 프로그램 코드의 변환 방법은, 멀티스레드 프로그램 코드가 이용하는 메모리의 크기를 기반으로 하나의 루프 그룹 내에서 교차 실행 가능한 작업 그룹의 개수를 산출하는 단계를 더 포함하되, 루프 그룹을 생성하는 단계는, 각 루프 그룹에 인스트럭션이 균등하게 포함되고, 각 루프 그룹 내에 포함되는 스테이트먼트의 개수가 산출된 작업 그룹의 개수를 초과하지 않도록, 적어도 하나 이상의 인접 스테이트먼트를 결합하여 적어도 하나 이상의 루프 그룹을 생성할 수 있다.
또한, 멀티스레드 프로그램 코드의 변환 방법은, 변환된 코드를 미리 설정된 방법을 이용하여 최적화하는 단계를 더 포함할 수 있다.
또한, 멀티스레드 프로그램 코드의 변환 방법은, 각 스테이트먼트에서 사용되는 변수들이 실행 대상이 되는 작업 그룹의 메모리 위치를 나타내기 위한 변수 로테이션 코드를 삽입하는 단계를 더 포함할 수 있다.
또한, 멀티스레드 프로그램 코드의 변환 방법은, 각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 해당 스테이트먼트의 코드를 변경하는 단계를 더 포함할 수 있다.
여기서, 스테이트먼트의 코드를 변경하는 단계는, 조건문 또는 프레디케이션(predication)을 이용하여 스테이트먼트의 코드를 변경할 수 있다.
또한, 멀티스레드 프로그램 코드의 변환 방법은, 스테이트먼트 각각에 대하여 모든 작업 그룹이 실행될 수 있도록, 작업 항목 합체 루프 및 변수 로테이션 코드를 작업 그룹 인터리빙 루프로 감싸는 단계를 더 포함할 수 있다.
다른 양상에 따른 멀티스레드 프로그램 코드 변환 장치는 멀티스레드 프로그램 코드를 동기화 지점에 따라 적어도 2이상의 스테이트먼트로 분할하는 코드 분할부와, 분할된 스테이트먼트 내의 인스트럭션 개수를 기반으로, 적어도 하나 이상의 인접 스테이트먼트를 결합하여 적어도 하나 이상의 루프 그룹을 생성하는 루프 그룹 생성부와, 루프 그룹 각각에 대하여, 해당 루프 그룹에 포함되는 스테이트먼트 별로 상이한 작업 그룹의 작업 항목을 직렬적으로 실행할 수 있도록, 각 스테이트먼트 내의 변수를 확장하거나 이름을 변경하는 변수확장/이름변경부와, 작업 항목 합체 루프를 생성하여 루프 그룹 각각에 대하여 감싸는 작업 항목 합체 루프 추가부를 포함할 수 있다.
OpenCL 또는 CUDA 프로그램 코드 등을 복수의 작업 그룹이 교차실행 가능하도록 직렬화함으로써, 상대적으로 적은 개수의 프로세싱 엘리먼트를 가진 장치에서 효율적으로 이용할 수 있다.
또한, 직렬화 과정에서 생성되는 반복문의 수가 감소함에 따라, 반복문으로 인한 오버헤드가 감소시킬 수 있다.
또한, 하나의 반복문에 포함되는 명령어의 수가 증가하고, 커널 코드의 각 부분이 서로 다른 데이터를 이용하여 연산을 수행할 수 있어, 동시에 실행할 수 있는 명령어를 찾을 수 있는 경우의 수가 증가하여, 성능을 향상시킬 수 있다.
도 1은 멀티스레드 프로그램의 실행 모델을 도시한 도면이다.
도 2a는 배리어 함수를 포함하는 커널 코드의 예를 나타낸 모식도이다.
도 2b는 도 2a의 커널 코드를 작업 그룹 단위의 작업 항목 직렬화를 적용하여 변환한 결과 코드를 나타낸 모식도이다.
도 2c는 도 2b의 결과 코드가 각 작업 항목에 대해 실행되는 순서를 도시한 도면이다.
도 3은 일 실시 예에 따른 코드 변환 장치의 구성도이다.
도 4a는 도 2a의 커널 코드를 일 실시 예에 따라 변환한 결과 코드를 나타낸 모식도이다.
도 4b는 도 4a의 결과 코드가 각 작업 항목에 대해 실행되는 순서를 도시한 도면이다.
도 4c는 도 4a의 결과 코드를 표현한 의사 코드를 나타낸 도면이다.
도 5는 처리할 작업 그룹이 동적으로 주어지는 경우, 일 실시 예에 따른 변환 결과의 예를 의사 코드로 나타낸 도면이다.
도 6는 일 실시 예에 따른 메모리 공간의 레이아웃의 예를 도시한 도면이다.
도 7은 일 실시 예에 따른 커널 코드의 변환 방법을 도시한 흐름도이다.
이하, 첨부된 도면을 참조하여 본 발명의 일 실시 예를 상세하게 설명한다. 본 발명을 설명함에 있어 관련된 공지 기능 또는 구성에 대한 구체적인 설명이 본 발명의 요지를 불필요하게 흐릴 수 있다고 판단되는 경우에는 그 상세한 설명을 생략할 것이다. 또한, 후술되는 용어들은 본 발명에서의 기능을 고려하여 정의된 용어들로서 이는 사용자, 운용자의 의도 또는 관례 등에 따라 달라질 수 있다. 그러므로 그 정의는 본 명세서 전반에 걸친 내용을 토대로 내려져야 할 것이다.
도 1은 멀티스레드 프로그램의 실행 모델을 도시한 도면이다.
멀티스레드 프로그램는 OpenCL, CUDA 등과 같이 프로그램 코드를 공유하는 작은 단위(fine-grained)의 멀티스레드 프로그래밍 언어로 작성된 프로그램(예를 들어, Fine-grained Single Program Multiple Data-threaded program)등을 말하며, 멀티스레드 프로그램 코드는 OpenCL, CUDA 등으로 작성된 커널 코드를 포함하며, 이때, 커널 코드는 커널, 커널 함수 등으로 호칭될 수 있으며, 이하에서는 커널 코드를 기준으로 설명한다.
한편, 커널 코드는 하나 이상의 스테이트먼트(statement)로 구성될 수 있으며, 스테이트먼트는 프로그램을 구성하는 개개의 일반화한 명령 또는 의미 있는 표현으로써, 명령어 순열을 포함할 수 있다.
멀티스레드 프로그램의 실행 모델은, 전체 실행 영역(execution domain)을 여러 개의 작업 항목(work item)(111 내지 113)으로 나누어, 각 작업 항목(111 내지 113)에 대해 커널 코드를 각각 수행한다. 이때, 각 작업 항목(111 내지 113)은 독립적인 별도의 스레드에서 병렬적으로 수행될 수 있다.
작업 항목 간에 데이터의 공유 등으로 인해 동기화가 필요할 경우가 있는데, 이 경우, 동기화가 필요한 작업 항목들(예를 들어, 111, 112)을 동일한 작업 그룹(work group)(110)으로 묶을 수 있다. 즉, 작업 그룹은 동기화가 필요한 작업 항목들의 집합으로써, 각 작업 그룹은 하나 이상의 작업 항목을 포함할 수 있다. 이 때, 같은 작업 그룹 내의 작업 항목들(예를 들어, 111, 112) 간에는 동기화가 가능하지만, 각기 다른 작업 그룹에 포함되는 작업 항목들(예를 들어, 112, 113) 간에는 동기화가 불가능하다. 도 1에 도시된 예는 전체 실행 영역을 15*15의 작업 항목, 5*5의 작업 그룹으로 분할한 멀티스레드 프로그램의 실행 모델을 도시한다.
한편, 커널 코드는 배리어 함수(barrier function 또는 barrier instruction)를 포함할 수 있다. 배리어 함수는 커널 코드를 실행하는 단일 작업 그룹 내에서 작업 항목들을 동기화 한다. 이때, 배리어 함수는 동기화 배리어 함수, 동기화 함수 또는 배리어 등으로 호칭될 수 있다. 배리어 함수를 포함하는 경우, 작업 그룹에서 모든 작업 항목들은 동기화를 실행해야 하고, 그 작업 그룹내의 모든 다른 작업 항목들이 배리어에 도달할 때까지 배리어 함수 너머에 있는 스테이트먼트로 진행할 수 없다.
이하에서, 병렬 프로세싱을 위해 커널 코드를 변환하는 방법을 상세히 설명한다. 이때, 수행되어야 하는 복수 개의 작업 항목들이 하나의 프로세싱 엘리먼트에서 동작하는 것을 가정한다.
도 2a는 배리어 함수를 포함하는 커널 코드의 예를 나타낸 모식도이고, 도 2b는 도 2a의 커널 코드를 작업 그룹 단위의 작업 항목 직렬화를 적용하여 변환한 결과 코드를 나타낸 모식도이고, 도 2c는 도 2b의 결과 코드가 각 작업 항목에 대해 실행되는 순서를 도시한 도면이다.
멀티스레드 프로그램의 실행 모델에서, 실행 영역이 총 N개의 작업 그룹으로 나뉘고, 각 작업 그룹은 총 M개의 작업 항목으로 구성된다고 가정하면, 작업 항목은 T(i, j)로 나타낼 수 있다. 이때, i는 작업 그룹의 번호로서,
Figure pat00001
이며, j는 해당 작업 그룹 내의 작업 항목 번호로서,
Figure pat00002
이다.
이러한, 총 N*M 개의 작업 항목을 CPU, DSP 등과 같이 병렬도가 낮은(또는 적은 수의 프로세싱 엘리먼트를 가지는) 프로세서에서 실행하기 위해서는 하나의 프로세싱 엘리먼트에서 여러 작업 항목을 수행해야만 한다. 이를 위해 여러 작업 항목을 직렬화하는 것이 필요하며, 이를, 작업 항목 직렬화, structured microthreading 또는 work-item coalescing 등 이라 한다.
이때, 작업 항목의 직렬화는 기본적으로 커널 코드를 반복문으로 감싸서 직렬화하고자 하는 작업 항목의 수만큼 반복 수행하도록 코드를 변환하는 방식으로 이루어지며, 이때 생겨난 반복문을 작업 항목 합체 루프(work-item coalescing loop, WCL) 또는 스레드 루프(thread loop) 등으로 호칭할 수 있으며, 이하에서는 작업 항목 합체 루프라 한다.
도 2a와 같이, 배리어 함수(230)를 기준으로 두 개의 스테이트먼트 S1(220) 및 S2(240)로 분할되는 커널 코드(210)가 주어지는 경우, 작업 그룹 단위의 작업 항목 직렬화는, 도 2b와 같이, 배리어 함수(230)를 기준으로 구분되는 스테이트먼트 S1(220), 스테이트먼트 S2(240)를 이와 동일한 결과를 내는 스테이트먼트 S1'(261), 스테이트먼트 S2'(271)로 변환하고, 스테이트먼트 S1'(261) 및 S2'(271)을 반복 실행하는 두 개의 작업 항목 합체 루프(260, 270)를 생성하여 S1'(261) 및 S2'(271)를 각각 감싼다.
작업 그룹 단위의 작업 항목의 직렬화에 의해 변환된 코드(250)는 각 작업 그룹 별로 해당 작업 그룹의 작업 항목을 수행한다. 따라서, 도 2b의 스테이트먼트 S1'(261) 및 S2'(271)은 각 작업 항목에 대해 도 2c와 같은 순서로 실행된다. 즉, 작업 그룹 i의 모든 작업 항목(T(i, 0) 내지 T(i, M-1))에 대하여, 순차적으로 스테이트먼트 S1'(261)의 실행을 완료하고, 다시 작업 그룹 i의 모든 작업 항목(T(i, 0) 내지 T(i, M-1))에 대하여, 순차적으로 스테이트먼트 S2'(271)의 실행을 완료한다. 그 후, 다음 작업 그룹 i+1의 모든 작업 항목 (T(i+1, 0) 내지 T(i+1, M-1))에 대해 스테이트먼트 S1'(261)및 S2'(271)을 순차적으로 실행한다. 이와 같은 실행 순서를 가지는 작업 그룹 단위의 작업 항목 직렬화를 적용한 결과 코드는 한 작업 그룹의 모든 작업 항목이 종료되어야 다음 작업 그룹의 작업 항목이 실행되는 특징을 가진다.
즉, 작업 그룹 단위의 작업 항목 직렬화를 적용하여 커널 코드를 변환하면, 배리어 함수를 포함하고 있는 커널 코드는 여러 개의 반복문으로 변환되게 되는데, 그 과정에서 크기가 작은(즉, 명령어를 적게 포함하는) 반복문이 많이 생겨날 수 있다. 반복문 내의 명령어의 수가 줄어들면 컴파일러의 명령어 스케줄러(instruction scheduler) 또는 CPU의 out-of-order 스케줄러가 동시에 수행될 수 있는 명령어를 찾을 수 있는 경우의 수가 줄어들고, 또한 의미 있는 명령어에 대하여 반복을 위한 오버헤드(예들 들어, 명령어 변수 비교 및 증가, 분기문 등)가 증가하기 때문에, 명령어 수준 병렬성(instruction-level parallelism, ILP)이 저하될 수 있다.
도 3은 일 실시 예에 따른 코드 변환 장치의 구성도이다.
도 3을 참조하면, 일 실시 예에 따른 코드 변환 장치(300)는 코드 분할부(310), 루프 그룹 생성부(320), 변수확장/이름변경부(330) 및 루프 결합부(340)를 포함할 수 있다.
코드 분할부(310)는 입력된 커널 코드를 동기화 지점에 따라 하나 이상의 스테이트먼트로 분할할 수 있다. 여기서, 동기화 지점은 커널 코드의 시작 지점(entry point), 배리어 함수 및 제어 구조(control structure)의 시작 지점(entry point) 등을 포함할 수 있다.
예를 들면, 커널 코드가 배리어 함수를 포함하지 않는 경우, 커널 코드를 하나의 스테이트먼트로 판단할 수 있다. 이 경우, 후술하는 바와 같이, 커널 코드 전체가 하나의 스테이트먼트가 된다.
다른 예를 들면, 커널 코드가 배리어 함수를 포함하는 경우, 배리어 함수를 기준으로 배리어 함수 이전의 스테이트먼트 및 배리어 함수 이후의 스테이트먼트로 분할할 수 있다.
또 다른 예를 들면, 조건문 안에 배리어 함수가 포함되는 경우, 조건문 외부에 대하여, 조건문 시작 이전의 스테이트먼트 및 조건문 종료 이후의 스테이트먼트로 분할할 수 있다. 또한, 조건문 내부에 대하여, 배리어 함수를 기준으로 배리어 함수 이전의 스테이트먼트 및 배리어 함수 이후의 스테이트먼트로 분할할 수 있다.
또 다른 예를 들면, 루프문 안에 배리어 함수가 포함되는 경우, 루프문 외부의 코드는 작업 항목별로 한번씩 실행되지만, 루프문 내부의 코드는 각 작업 항목이 루프가 반복되는 횟수만큼 반복하여 실행되기 때문에 양 코드는 분리될 수 있다. 즉, 루프문 외부에 대하여 루프문 시작 이전의 스테이트먼트 및 루프문 종료 이후의 스테이트먼트로 분할할 수 있다. 또한, 루프문 내부에 대하여, 루프의 조건을 나타내는 스테이트먼트, 배리어 함수 이전의 스테이트먼트 및 배리어 함수 이후의 스테이트먼트로 분할할 수 있다.
루프 그룹 생성부(320)는 코드 분할부(610)에서 분할된 스테이트먼트의 인스트럭션(instruction)의 개수를 기반으로, 작업 항목 합체 루프로 감싸질, 하나 이상의 스테이트먼트를 포함하는 루프 그룹을 생성할 수 있다.
일 실시 예에 따르면, 분할된 스테이트먼트내의 인스트럭션 개수를 고려하여, 각 루프 그룹 내에 포함되는 인스트럭션의 개수가 균등해질 수 있도록 인접한 스테이트먼트를 합침으로써 루프 그룹을 생성할 수 있다.
예를 들어, 커널 코드가 5개의 스테이트먼트(S1, S2, S2, S4, S5)로 분할되고, 스테이트먼트 S1의 인스트럭션이 100개, 스테이트먼트 S2의 인스트럭션이 20개, 스테이트먼트 S3의 인스트럭션이 30개, 스테이트먼트 S4의 인스트럭션이 30개, 스테이트먼트 S5의 인스트럭션이 110개라고 가정하고, 하나의 루프 내에서 교차 실행 가능한 작업 그룹의 개수가 3개라고 가정한다. 루프 그룹 생성부(320)는 각 루프 그룹 내에 포함되는 인스트럭션의 개수가 균등해질 수 있도록, S1를 포함하는 제 1 루프 그룹(인스트럭션 개수=100), S2, S3, S4를 포함하는 제 2 루프 그룹(인스트럭션 개수=20+30+30=80), S5를 포함하는 제 3 그룹(인스트럭션 개수=110)을 생성할 수 있다.
변수확장/이름변경부(630)는 루프 그룹 생성부(620)에서 생성된 루프 그룹 각각에 대하여, 해당 루프 그룹에 포함되는 스테이트먼트 별로 상이한 작업 그룹의 작업 항목을 직렬적으로 실행할 수 있도록, 각 스테이트먼트 내의 변수를 확장하거나 이름을 변경할 수 있다.
일 실시 예에 따르면, 변수확장/이름변경부(630)는 루프 그룹 각각에 대하여, 해당 루프 그룹에 포함되는 스테이트먼트 별로 상이한 작업 그룹의 작업 항목을 직렬적으로 실행할 수 있도록, 각 스테이트먼트 내의 변수를 스칼라 확장하거나 이름을 바꿀 수 있다. 이때, 스칼라 확장 대상이 되는 변수는 각 작업 항목이 독자적으로 사용하는 프라이빗 변수이며, 이름 바꾸기의 대상이 되는 변수는 프라이빗 변수와 각 작업 그룹 내에서만 공유되는 로컬 변수일 수 있다.
스칼라 확장을 통해 각 작업 그룹에 속하는 작업 항목은 각기 별도의 위치에 변수를 가질 수 있으며, 이름 바꾸기를 통해 각 스테이트먼트 별로 연산을 수행할 대상 작업 그룹의 데이터 위치를 다르게 지정할 수 있게 된다.
한편, 커널 코드의 의미(semantics)를 지키기 위해서, 코드 변환 장치(300)에 의해 변환된 코드는, 첫째, 각 작업 그룹에 대해 전체 스테이트먼트를 커널 코드에 나타난 순서대로 수행하여야 하며, 둘째, 하나의 루프 그룹에서 여러 개의 스테이트먼트를 수행할 때는 각 스테이트먼트를 다른 작업 그룹에 대해 실행해야 한다. 따라서, 변환된 코드는 서로 다른 루프 그룹에 포함되는 인접한 스테이트먼트는 동일한 작업 그룹에 대하여 수행하고, 서로 동일한 루프 그룹에 포함되는 스테이트먼트는 서로 다른 작업 그룹에 대하여 수행하되 커널 코드에 나타난 순서가 빠른 스테이트먼트는 더 느린 번호의 작업 그룹에 대하여 수행하여야 한다. 예를 들어, S1은 제 1 루프 그룹에, S2, S3, S4는 제 2 루프 그룹에, S5는 제 3 루프 그룹에 포함되고, S2에 대하여 수행되는 작업 그룹이 i라고 가정하자. 이 경우, 제 2 루프 그룹의 S2, S3, S4 중 커널 코드에 나타난 순서가 S2가 빠르므로, S3는 작업 그룹 i-1, S4는 작업 그룹 i-2에 대하여 각각 수행된다. 또한, S1과 S2는 서로 다른 루프 그룹에 포함되는 인접 스테이트먼트이므로, S1은 S2와 동일한 작업 그룹 i에 대하여 수행하며, 이와 동일하게, S5는 S4와 동일한 작업 그룹 i-2에 대하여 수행된다.
일 실시 예에 따르면, 변수확장/이름변경부(630)는 각 스테이트먼트 내의 변수를 스칼라 확장하거나 이름을 바꿀 때, 상술한 각 스테이트먼트의 작업 그룹을 고려할 수 있다.
작업 항목 합체 루프 추가부(640)는 루프 그룹 생성부(620)에서 생성된 각 루프 그룹을 감싸는 작업 항목 합체 루프를 생성하여 추가할 수 있다.
추가적 실시 예에 따르면, 코드 변환 장치(300)는 하나의 작업 항목 합체 루프 내에서 교차 실행 가능한 작업 그룹의 개수를 산출하는 작업 그룹 개수 산출부(315)를 더 포함할 수 있다.
일 실시 예에 따르면, 작업 그룹 개수 산출부(315)는 코드 분할부(310)에서 분할된 스테이트먼트의 개수와 작업 그룹 당 확보해야 할 메모리 영역의 크기를 고려하여, 동시에 교차 실행 가능한 작업 그룹의 개수를 산출할 수 있다. 예를 들어, 가용 메모리 크기가 충분히 큰 경우는, 교차 실행 가능한 작업 그룹의 개수를 분할된 스테이트먼트의 개수와 동일한 수로 결정하는 것도 가능하고, 가용 메모리가 적을 경우는, 그에 맞춰 작업 그룹의 개수를 줄여 가용 메모리의 크기를 고려하여 적절히 산출하는 것도 가능하다.
이 경우, 루프 그룹 생성부(320)는 루프 그룹을 생성할 때, 하나의 루프 그룹 내에 포함되는 스테이트먼트의 개수가 작업 그룹 개수 산출부(315)에서 산출된 동시에 교차 실행 가능한 작업 그룹의 개수를 넘지 않도록, 산출된 작업 그룹의 개수를 고려할 수 있다.
추가적 실시 예에 따르면, 코드 변환 장치(300)는 각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 코드를 추가 또는 변경하는 코드 변경부(350)를 더 포함할 수 있다. 예를 들면, 스테이트먼트 S1은 작업 그룹 i를, 스테이트먼트 S2는 작업 그룹 i-1을 실행하고, 작업 그룹은
Figure pat00003
의 범위를 가진다고 가정한다. 이때, i=0일 때, 스테이트먼트 S2는 작업 그룹 -1을 수행하여야 하나, 작업 그룹 -1은 존재하지 않는다. 또한, i=N일 때, 스테이트먼트 S1은 작업 그룹 N을 수행하여야 하나, 작업 그룹 N은 존재하지 않는다. 따라서, i=0일 때, S2를 실행할 수 없으며, i=N일 때, S1을 실행할 수 없다. 따라서, 코드 변경부(350)는 각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 조건문을 추가하거나, 프레디케이션(predication)을 이용하기 위해서 해당 스테이트먼트의 코드를 변경할 수 있다.
추가적 실시 예에 따르면, 코드 변환 장치(300)는 변환된 코드를 최적화하는 코드 최적화부(350)를 더 포함할 수 있다.
일 실시 예에 따르면, 코드 최적화부(350)는 미리 설정된 다양한 루프 최적화(loop optimization) 기법 또는 스칼라 최적화(scalar optimization) 기법을 이용하여 코드를 최적화할 수 있다. 예를 들어, 각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 코드를 변경한 경우, 루프 언스위칭(loop unswitching)을 통해 변경된 코드를 최적화할 수 있으며, 스칼라 리플레이스먼트(scalar replacement)를 통해 일부 프라이빗 변수를 배열이 아닌 일반 변수로 바꿔줄 수 있다.
추가적 실시 예에 따르면, 코드 변환 장치(300)는 각 스테이트먼트에서 사용되는 변수들이 실제 실행 대상이 되는 작업 그룹의 메모리 위치를 가리키기 위한 변수 로테이션 코드를 삽입하는 변수 로테이션 코드 추가부(370)를 더 포함할 수 있다. 여기서, 변수 로테이션 코드는 각 스테이트먼트에서 사용되는 변수들이 실제 실행 대상이 되는 작업 그룹의 메모리 위치를 가리키도록 세팅하는 코드이다.
추가적 실시 예에 따르면, 코드 변환 장치(300)는 모든 작업 그룹에 대해서 스테이트먼트가 수행될 수 있도록, 모든 작업 항목 합체 루프 및 변수 로테이션 코드를 감싸는 작업 그룹 인터리빙 루프(work group interleaving loop)를 생성하여 추가하는 작업 그룹 인터리빙 루프 추가부(380)를 더 포함할 수 있다.
도 4a는 도 2a의 커널 코드를 일 실시 예에 따라 변환한 결과 코드를 나타낸 모식도이고, 도 4b는 도 4a의 결과 코드가 각 작업 항목에 대해 실행되는 순서를 도시한 도면이고, 도 4c는 도 4a의 결과 코드를 표현한 의사 코드를 나타낸 도면이다.
도 4a 내지 도 4c를 참조하면, 일 실시 예에 따라 변환한 결과 코드(410)는 도 2a의 커널 코드(210)의 스테이트먼트 S1(220) 및 S2(240)를 각각 다른 작업 그룹의 작업 항목에 대해 수행하도록 변수를 확장 또는 변수의 이름을 바꾼 스테이트먼트 S1"(441) 및 S2"(443)를 하나의 작업 항목 합체 루프(440)에서 실행하는 형태이다. 이때, 해당 작업 항목 합체 루프(440)은 동시에 두 개의 작업 그룹을 부분적으로 실행하게 된다.
다시 말하면, 도 4a의 결과 코드(410)는 도 4b에 도시된 바와 같이, 두 개의 작업 그룹이 교차 실행된다. 즉, 작업 그룹 i의 작업 항목 0(T(i, 0))에 대해 스테이트먼트 S1"(441)을 수행한 후, 바로 작업 그룹 i의 작업 항목 1(T(i, 1))에 대해 스테이트먼트 S1"(441)을 수행하는 것이 아니라 작업 그룹 i-1의 작업 항목0(T(i-1, 0))에 대해 스테이트먼트 S2"(443)을 수행한 다음에 작업 그룹 i의 작업 항목 1(T(i, 1))에 대해 스테이트먼트 S1"(441)을 수행한다. 즉, 나중에 실행되는 스테이트먼트는 직전에 실행된 스테이트먼트보다 번호가 1이 작은 작업 그룹의 작업 항목을 실행하게 된다. 이러한, 실행 순서는 하나의 반복문(작업 항목 합체 루프)으로 표현 가능하기 때문에 직렬화 과정에서 생성되는 반복문의 수를 줄일 수 있게 된다.
한편, 스테이트먼트 S1"(441) 및 S2"(443)은 코드 상에 순차적으로 배치되어 있으나 서로 완전히 독립적인 데이터를 이용하여 연산을 수행하므로 데이터 수준 병렬성(Data-level parallelism, DLP)을 가진다.
변수 로테이션 코드(430)는 각 스테이트먼트에서 사용되는 변수들이 실제 실행 대상이 되는 작업 그룹의 메모리 위치를 가리키도록 세팅하는 코드로서, 변수 로테이션 코드 추가부(370)에 의해 삽입된 코드이다.
일 실시 예에 따르면, 모든 작업 그룹이 메모리 상의 위치(offset)를 제외하고 동일한 형태의 변수 레이아웃을 가진다면, 변수 로테이션 코드(330)는 단순히 변수의 레퍼런스(reference)/포인터(pointer)의 위치(offset)을 조정하는 코드로 이루어 질 수 있다. 예를 들어, 코드에서 x, y 두 변수가 사용되는 경우, x, y와 동일한 타입의 x', y'을 필드로 가지는 구조체를 선언한 후, 코드에서 x, y가 사용되는 부분을 구조체의 필드 x', y'을 사용하도록 변경하여 이름 바꾸기(renaming)를 할 수 있다. 이 경우, 변수 로테이션 코드는 이름 바꾸기에 사용된 구조체의 레퍼런스(reference)/포인터(pointer)에 특정 위치의 주소값을 대입하는 코드가 될 수 있다.
한편, 작업 그룹 인터리빙 루프(320)는 모든 작업 그룹에 대하여 모든 스테이트먼트(341, 343)가 수행될 수 있도록 삽입되는 루프로서, 작업 그룹 인터리빙 루프(320)를 형성하는 반복문의 실행 시작과 끝에서는 스테이트먼트 S1"(441) 또는 S2"(443)가 실행되지 않아야 하는 경우가 생긴다. 예를 들면, 작업 그룹이
Figure pat00004
의 범위를 가진다면, 작업 그룹 i가 0일 때는 작업 그룹 -1이 존재하지 않으므로 S2"(441)를 실행할 수 없고, 작업 그룹 i가 N일 때는 작업 그룹 N이 존재하지 않으므로 S1"(443)을 실행할 수 없다. 따라서, 코드 변경부(350)는 각 스테이트먼트(441, 443)가 실행 조건을 만족하도록, 각 스테이트먼트(341, 343)의 코드를 변경할 수 있다. 이 경우, 도 4c에 도시된 의사 코드와 같이, 조건문 또는 프레디케이션(predication) 등을 이용할 수 있다.
한편, 코드 최적화부(360)는 조건문을 이용한 경우에는 loop unswitching 등을, 프레디케이션을 이용한 경우에는 predicate analysis 등을 이용하여 변환된 결과 코드를 최적화 할 수 있다.
도 5는 처리할 작업 그룹이 동적으로 주어지는 경우, 일 실시 예에 따른 변환 결과의 예를 의사 코드로 나타낸 도면이다. 도 4c는 처리해야 할 작업 그룹이 0번에서 N-1번으로 미리 정해져 있는 상황에서의 예를 나타내는데, 처리할 작업 그룹이 동적으로 주어지는 경우에도 비슷한 방식으로 처리할 수 있다. 도 5의 예는, 큐가 비어있는 경우에는 작업 그룹(WG)이 무효(invalid)로 세팅되며(세 번째 줄), 작업 그룹(WG)가 무효(invalid)이면, V1도 무효(invalid)로 세팅된다(다섯 번째 줄)고 가정하였다.
도 6는 일 실시 예에 따른 메모리 공간의 레이아웃의 예를 도시한 도면이다.
멀티스레드 프로그램을 실행할 때, 시스템 메모리 주소 공간은 글로벌 메모리 영역(global memory), 로컬 메모리 영역(local memory) 및 프라이빗 메모리 영역(private memory) 등으로 나눌 수 있다. 글로벌 메모리 영역은 실행 영역의 모든 작업 그룹/작업 항목이 공유하여 사용하는 데이터를 저장하는 영역이고, 로컬 메모리 영역은 동일한 작업 그룹에 속하는 작업 항목들 사이에서만 공유되는, 각 작업 그룹 별 데이터를 저장하는 영역이고, 프라이빗 메모리 영역은 각 작업 항목이 각자 배타적으로 사용하는 데이터를 저장하는 영역이다.
이때, 로컬 메모리 영역과 프라이빗 메모리 영역은 각 작업 그룹 당 하나씩 할당되나, 각 작업 그룹에 할당된 로컬 메모리 영역과 프라이빗 메모리 영역은 해당 작업 그룹의 실행 주기(lifetime) 동안에만 사용되므로 해당 작업 그룹의 실행 주기 이후에 다른 작업 그룹에 재할당함으로써 여러 작업 그룹이 재사용할 수 있다. 따라서, 도 6의 예와 같이 세 쌍의 로컬 메모리 영역/프라이빗 메모리 영역만을 확보한 후 각 작업 그룹에 순차적으로 할당하는 방식으로 전체 작업 그룹을 실행할 수 있다.
예를 들어, 로컬 메모리 영역 LM1 및 프라이빗 메모리 영역 PM1을 작업 그룹 0에, 로컬 메모리 영역 LM2 및 프라이빗 메모리 영역 PM2을 작업 그룹 1에, 로컬 메모리 영역 LM3 및 프라이빗 메모리 영역 PM3을 작업 그룹 2에 각각 할당하여 작업을 수행하다가, 작업 그룹 0이 종료되면 로컬 메모리 영역 LM1 및 프라이빗 메모리 영역 PM1을 다음 작업 그룹(작업 그룹 3)에 할당하여 사용할 수 있다.
도 7은 일 실시 예에 따른 커널 코드의 변환 방법을 도시한 흐름도이다.
도 7을 참조하면, 일 실시 예에 따른 커널 코드의 변환 방법은, 먼저, 커널 코드를 동기화 지점에 따라 하나 이상의 스테이트먼트로 분할한다(710). 여기서, 동기화 지점은 커널 코드의 시작 지점(entry point), 배리어 함수 및 제어 구조(control structure)의 시작 지점(entry point) 등을 포함할 수 있다.
예를 들면, 커널 코드가 배리어 함수를 포함하지 않는 경우, 커널 코드의 시작 지점(entry point)을 기준으로 커널 코드 전체가 하나의 스테이트먼트이 된다.
다른 예를 들면, 커널 코드가 배리어 함수를 포함하는 경우, 배리어 함수를 기준으로 배리어 함수 이전의 스테이트먼트 및 배리어 함수 이후의 스테이트먼트로 분할할 수 있다.
또 다른 예를 들면, 조건문 안에 배리어 함수가 포함되는 경우, 조건문 외부에 대하여, 조건문 시작 이전의 스테이트먼트 및 조건문 종료 이후의 스테이트먼트로 분할할 수 있다. 또한, 조건문 내부에 대하여, 배리어 함수를 기준으로 배리어 함수 이전의 스테이트먼트 및 배리어 함수 이후의 스테이트먼트로 분할할 수 있다.
또 다른 예를 들면, 루프문 안에 배리어 함수가 포함되는 경우, 루프문 외부의 코드는 작업 항목별로 한번씩 실행되지만, 루프문 내부의 코드는 각 작업 항목이 루프가 반복되는 횟수만큼 반복하여 실행되기 때문에 양 코드는 분리될 수 있다. 즉, 루프문 외부에 대하여 루프문 시작 이전의 스테이트먼트 및 루프문 종료 이후의 스테이트먼트로 분할할 수 있다. 또한, 루프문 내부에 대하여, 루프의 조건을 나타내는 스테이트먼트, 배리어 함수 이전의 스테이트먼트 및 배리어 함수 이후의 스테이트먼트로 분할할 수 있다.
그 후, 분할된 각 스테이트먼트 내의 인스트럭션 개수를 기반으로, 작업 항목 합체 루프로 감싸질, 하나 이상의 스테이트먼트를 포함하는 루프 그룹을 생성한다(720).
일 실시 예에 따르면, 각 루프 그룹 내에 포함되는 인스트럭션의 개수가 균등해질 수 있는 방향으로, 분할된 스테이트먼트내의 인스트럭션 개수를 고려하여 인접한 스테이트먼트를 합침으로써 루프 그룹을 생성할 수 있다.
예를 들어, 커널 코드가 5개의 스테이트먼트(S1, S2, S2, S4, S5)로 분할되고, 스테이트먼트 S1의 인스트럭션이 100개, 스테이트먼트 S2의 인스트럭션이 20개, 스테이트먼트 S3의 인스트럭션이 30개, 스테이트먼트 S4의 인스트럭션이 30개, 스테이트먼트 S5의 인스트럭션이 110개라고 가정하고, 하나의 루프내에서 교차 실행 가능한 작업 그룹의 개수가 3개라고 가정한다. 루프 그룹 내에 포함되는 인스트럭션의 개수가 균등해질 수 있기 위해서는, S1를 포함하는 제 1 루프 그룹(인스트럭션 개수=100), S2, S3, S4를 포함하는 제 2 루프 그룹(인스트럭션 개수=20+30+30=80), S5를 포함하는 제 3 그룹(인스트럭션 개수=110)을 생성할 수 있다.
그 후, 각 스테이트먼트에서 사용되는 변수를 스칼라 확장(scalar expansion)하거나 이름 바꾸기(renaming)를 수행한다(730).
일 실시 예에 따르면, 루프 그룹 각각에 대하여, 해당 루프 그룹에 포함되는 스테이트먼트 별로 상이한 작업 그룹의 작업 항목을 직렬적으로 실행할 수 있도록, 각 스테이트먼트 내의 변수를 스칼라 확장하거나 이름을 바꿀 수 있다. 이때, 스칼라 확장 대상이 되는 변수는 각 작업 항목이 독자적으로 사용하는 프라이빗 변수이며, 이름 바꾸기의 대상이 되는 변수는 프라이빗 변수와 각 작업 그룹 내에서만 공유되는 로컬 변수일 수 있다.
스칼라 확장을 통해 각 작업 그룹에 속하는 작업 항목은 각기 별도의 위치에 변수를 가질 수 있으며, 이름 바꾸기를 통해 각 스테이트먼트 별로 연산을 수행할 대상 작업 그룹의 데이터 위치를 다르게 지정할 수 있게 된다.
한편, 커널 코드의 의미(semantics)를 지키기 위해서, 변환된 코드는, 첫째, 각 작업 그룹에 대해 전체 스테이트먼트를 커널 코드에 나타난 순서대로 수행하여야 하며, 둘째, 하나의 루프 그룹에서 여러 개의 스테이트먼트를 수행할 때는 각 스테이트먼트를 다른 작업 그룹에 대해 실행해야 한다. 따라서, 변환된 코드는 서로 다른 루프 그룹에 포함되는 인접한 스테이트먼트는 동일한 작업 그룹에 대하여 수행하고, 서로 동일한 루프 그룹에 포함되는 스테이트먼트는 서로 다른 작업 그룹에 대하여 수행하되 커널 코드에 나타난 순서가 빠른 스테이트먼트는 더 느린 번호의 작업 그룹에 대하여 수행하여야 한다. 예를 들어, S1은 제 1 루프 그룹에, S2, S3, S4는 제 2 루프 그룹에, S5는 제 3 루프 그룹에 포함되고, S2에 대하여 수행되는 작업 그룹이 i라고 가정하자. 이 경우, 제 2 루프 그룹의 S2, S3, S4 중 커널 코드에 나타난 순서가 S2가 빠르므로, S3는 작업 그룹 i-1, S4는 작업 그룹 i-2에 대하여 각각 수행된다. 또한, S1과 S2는 서로 다른 루프 그룹에 포함되는 인접 스테이트먼트이므로, S1은 S2와 동일한 작업 그룹 i에 대하여 수행하며, 이와 동일하게, S5는 S4와 동일한 작업 그룹 i-2에 대하여 수행된다.
일 실시 예에 따르면, 각 스테이트먼트 내의 변수를 스칼라 확장하거나 이름을 바꿀 때, 상술한 각 스테이트먼트의 작업 그룹을 고려할 수 있다.
그 후, 생성된 각 루프 그룹을 작업 항목 합체 루프로 감싼다(740).
추가적 실시 예에 따르면, 코드 변환 방법은 하나의 작업 항목 합체 루프 내에서 교차 실행 가능한 작업 그룹의 개수를 산출하는 단계(715)를 더 포함할 수 있다. 일 실시 예에 따르면, 단계 610에서 분할된 스테이트먼트의 개수와 작업 그룹 당 확보해야 할 메모리 영역의 크기를 고려하여, 동시에 교차 실행 가능한 작업 그룹의 개수를 산출할 수 있다. 예를 들어, 가용 메모리 크기가 충분히 큰 경우는, 교차 실행 가능한 작업 그룹의 개수를 분할된 스테이트먼트의 개수와 동일한 수로 결정하는 것도 가능하고, 가용 메모리가 적을 경우는, 그에 맞춰 작업 그룹의 개수를 줄여 가용 메모리의 크기를 고려하여 적절히 산출하는 것도 가능하다.
이 경우, 루프 그룹을 생성하는 단계(320)는 루프 그룹을 생성할 때, 단계 315에서 산출된 작업 그룹 개수를 고려하여, 하나의 루프 그룹 내에 포함되는 스테이트먼트의 개수가 산출된 작업 그룹 개수를 초과 하지 않도록 한다.
추가적 실시 예에 따르면, 코드 변환 방법은 각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 코드를 추가 또는 변경하는 단계(750)를 더 포함할 수 있다. 예를 들면, 스테이트먼트 S1은 작업 그룹 i를, 스테이트먼트 S2는 작업 그룹 i-1을 실행하고, 작업 그룹은
Figure pat00005
의 범위를 가진다고 가정한다. 이때, i=0일 때, 스테이트먼트 S2는 작업 그룹 -1을 수행하여야 하나, 작업 그룹 -1은 유효하지 않다. 또한, i=N일 때, 스테이트먼트 S1은 작업 그룹 N을 수행하여야 하나, 작업 그룹 N은 유효하지 않다. 따라서, i=0일 때, S2를 실행할 수 없으며, i=N일 때, S1을 실행할 수 없다. 이 경우, 일 실시 예에 따르면, 조건문을 추가하거나, 프레디케이션 등을 이용하여 각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 할 수 있다.
추가적 실시 예에 따르면, 코드 변환 방법은 미리 설정된 방법을 이용하여 코드를 최적화하는 단계(760)를 더 포함할 수 있다. 일 실시 예에 따르면, 루프 최적화(loop optimization) 또는 스칼라 최적화(scalar optimization)가 수행될 수 있다. 예를 들어, 각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 코드를 변경한 경우, 루프 언스위칭(loop unswitching)을 통해 변경된 코드를 최적화할 수 있으며, 스칼라 리플레이스먼트(scalar replacement)를 통해 일부 프라이빗 변수를 배열이 아닌 일반 변수로 바꿔줄 수 있다.
추가적 실시 예에 따르면, 코드 변환 방법은 각 스테이트먼트에서 사용되는 변수들이 실제 실행 대상이 되는 작업 그룹의 메모리 위치를 가리키기 위한 변수 로테이션 코드를 삽입하는 단계(770)를 더 포함할 수 있다.
추가적 실시 예에 따르면, 코드 변환 방법은 모든 작업 그룹에 대해서 스테이트먼트가 수행될 수 있도록, 모든 작업 항목 합체 루프를 작업 그룹 인터리빙 루프로 감싸는 단계(780)를 더 포함할 수 있다. 이때, 변수 로테이션 코드가 삽입된 경우, 변수 로테이션 코드도 함께 작업 그룹 인터리빙 루프로 감쌀 수 있다.
본 발명의 일 양상은 컴퓨터로 읽을 수 있는 기록 매체에 컴퓨터가 읽을 수 있는 코드로서 구현될 수 있다. 상기의 프로그램을 구현하는 코드들 및 코드 세크먼트들은 당해 분야의 컴퓨터 프로그래머에 의하여 용이하게 추론될 수 있다. 컴퓨터가 읽을 수 있는 기록 매체는 컴퓨터 시스템에 의하여 읽혀질 수 있는 데이터가 저장되는 모든 종류의 기록 장치를 포함할 수 있다. 컴퓨터가 읽을 수 있는 기록 매체의 예로는 ROM, RAM, CD-ROM, 자기 테이프, 플로피 디스크, 광 디스크 등을 포함할 수 있다. 또한, 컴퓨터가 읽을 수 있는 기록 매체는 네트워크로 연결된 컴퓨터 시스템에 분산되어, 분산 방식으로 컴퓨터가 읽을 수 있는 코드로 작성되고 실행될 수 있다.
이제까지 본 발명에 대하여 그 바람직한 실시 예들을 중심으로 살펴보았다. 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자는 본 발명이 본 발명의 본질적인 특성에서 벗어나지 않는 범위에서 변형된 형태로 구현될 수 있음을 이해할 수 있을 것이다. 따라서, 본 발명의 범위는 전술한 실시 예에 한정되지 않고 특허 청구범위에 기재된 내용과 동등한 범위 내에 있는 다양한 실시 형태가 포함되도록 해석되어야 할 것이다.
300: 멀티스레드 프로그램 코드 변환 장치,
310: 코드 분할부, 315: 작업 그룹 개수 산출부,
320: 루프 그룹 생성부, 330: 변수확장/이름 변경부,
340: 작업 항목 합체 루프 추가부, 350: 코드 변경부,
360: 코드 최적화부, 370: 변수 로테이션 코드 추가부,
380: 작업 그룹 인터리빙 루프 추가부.

Claims (18)

  1. 멀티스레드 프로그램 코드를 동기화 지점에 따라 적어도 2이상의 스테이트먼트로 분할하는 단계;
    상기 분할된 스테이트먼트 내의 인스트럭션 개수를 기반으로, 적어도 하나 이상의 인접 스테이트먼트를 결합하여 적어도 하나 이상의 루프 그룹을 생성하는 단계;
    상기 루프 그룹 각각에 대하여, 해당 루프 그룹에 포함되는 스테이트먼트 별로 상이한 작업 그룹의 작업 항목을 직렬적으로 실행할 수 있도록, 각 스테이트먼트 내의 변수를 확장하거나 이름을 바꾸는 단계; 및
    상기 루프 그룹 각각에 대하여 작업 항목 합체 루프로 감싸는 단계; 를 포함하는 멀티스레드 프로그램 코드의 변환 방법.
  2. 제 1항에 있어서,
    상기 멀티스레드 프로그램 코드는 OpenCL 커널 코드 또는 CUDA 커널 코드인 멀티스레드 프로그램 코드의 변환 방법.
  3. 제 1항에 있어서,
    상기 동기화 지점은 멀티스레드 프로그램 코드의 시작 지점, 배리어 함수, 제어 구조(control structure)의 시작 지점 중 적어도 하나를 포함하는 멀티스레드 프로그램 코드의 변환 방법.
  4. 제 1항에 있어서,
    상기 멀티스레드 프로그램 코드가 이용하는 메모리의 크기를 기반으로 하나의 루프 그룹 내에서 교차 실행 가능한 작업 그룹의 개수를 산출하는 단계; 를 더 포함하되,
    상기 루프 그룹을 생성하는 단계는, 각 루프 그룹에 인스트럭션이 균등하게 포함되고, 각 루프 그룹 내에 포함되는 스테이트먼트의 개수가 상기 산출된 작업 그룹의 개수를 초과하지 않도록, 적어도 하나 이상의 인접 스테이트먼트를 결합하여 적어도 하나 이상의 루프 그룹을 생성하는 멀티스레드 프로그램 코드의 변환 방법.
  5. 제 1항에 있어서,
    변환된 코드를 미리 설정된 방법을 이용하여 최적화를 수행하는 단계; 를 더 포함하는 멀티스레드 프로그램 코드의 변환 방법.
  6. 제 1항에 있어서,
    각 스테이트먼트에서 사용되는 변수들이 실행 대상이 되는 작업 그룹의 메모리 위치를 나타내기 위한 변수 로테이션 코드를 삽입하는 단계; 를 더 포함하는 멀티스레드 프로그램 코드의 변환 방법.
  7. 제 1항에 있어서,
    각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 해당 스테이트먼트의 코드를 변경하는 단계; 를 더 포함하는 멀티스레드 프로그램 코드의 변환 방법.
  8. 제 7항에 있어서,
    상기 스테이트먼트의 코드를 변경하는 단계는, 조건문 또는 프레디케이션(predication)을 이용하여 해당 스테이트먼트의 코드를 변경하는 멀티스레드 프로그램 코드의 변환 방법.
  9. 제 6항에 있어서,
    스테이트먼트 각각에 대하여 모든 작업 그룹이 실행될 수 있도록, 상기 작업 항목 합체 루프 및 상기 변수 로테이션 코드를 작업 그룹 인터리빙 루프로 감싸는 단계; 를 더 포함하는 멀티스레드 프로그램 코드의 변환 방법.
  10. 멀티스레드 프로그램 코드를 동기화 지점에 따라 적어도 2이상의 스테이트먼트로 분할하는 코드 분할부;
    상기 분할된 스테이트먼트 내의 인스트럭션 개수를 기반으로, 적어도 하나 이상의 인접 스테이트먼트를 결합하여 적어도 하나 이상의 루프 그룹을 생성하는 루프 그룹 생성부;
    상기 루프 그룹 각각에 대하여, 해당 루프 그룹에 포함되는 스테이트먼트 별로 상이한 작업 그룹의 작업 항목을 직렬적으로 실행할 수 있도록, 각 스테이트먼트 내의 변수를 확장하거나 이름을 변경하는 변수확장/이름 변경부; 및
    작업 항목 합체 루프를 생성하여 상기 루프 그룹 각각에 대하여 감싸는 작업 항목 합체 루프 추가부; 를 포함하는 멀티스레드 프로그램 코드 변환 장치.
  11. 제 10항에 있어서,
    상기 멀티스레드 프로그램 코드는 OpenCL 커널 코드 또는 CUDA 커널 코드인 멀티스레드 프로그램 코드 변환 장치.
  12. 제 10항에 있어서,
    상기 동기화 지점은 멀티스레드 프로그램 코드의 시작 지점, 배리어 함수, 제어 구조(control structure)의 시작 지점 중 적어도 하나를 포함하는 멀티스레드 프로그램 코드 변환 장치.
  13. 제 10항에 있어서,
    상기 멀티스레드 프로그램 코드가 이용하는 메모리의 크기를 기반으로 하나의 루프 그룹 내에서 교차 실행 가능한 작업 그룹의 개수를 산출하는 작업 그룹 개수 산출부; 를 더 포함하되,
    상기 루프 그룹 생성부는, 각 루프 그룹에 인스트럭션이 균등하게 포함되고, 각 루프 그룹 내에 포함되는 스테이트먼트의 개수가 상기 산출된 작업 그룹의 개수를 초과하지 않도록, 적어도 하나 이상의 인접 스테이트먼트를 결합하여 적어도 하나 이상의 루프 그룹을 생성하는 멀티스레드 프로그램 코드 변환 장치.
  14. 제 10항에 있어서,
    변환된 코드를 미리 설정된 방법을 이용하여 최적화하는 코드 최적화부; 를 더 포함하는 멀티스레드 프로그램 코드 변환 장치.
  15. 제 10항에 있어서,
    각 스테이트먼트에서 사용되는 변수들이 실행 대상이 되는 작업 그룹의 메모리 위치를 나타내기 위한 변수 로테이션 코드를 추가하는 변수 로테이션 코드 추가부; 를 더 포함하는 멀티스레드 프로그램 코드 변환 장치.
  16. 제 10항에 있어서,
    각 스테이트먼트가 유효한 작업 그룹에 대해서만 실행되도록 해당 스테이트먼트의 코드를 변경하는 코드 변경부; 를 더 포함하는 멀티스레드 프로그램 코드 변환 장치.
  17. 제 16항에 있어서,
    상기 코드 변경부는, 조건문 또는 프레디케이션(predication)을 이용하여 스테이트먼트의 코드를 변경하는 멀티스레드 프로그램 코드 변환 장치.
  18. 제 15항에 있어서,
    스테이트먼트 각각에 대하여 모든 작업 그룹이 실행될 수 있도록, 작업 그룹 인터리빙 루프를 생성하여 상기 작업 항목 합체 루프 및 상기 변수 로테이션 코드를 감싸는 작업 그룹 인터리빙 루프 추가부; 를 더 포함하는 멀티스레드 프로그램 코드 변환 장치.











KR1020130050251A 2013-05-03 2013-05-03 멀티스레드 프로그램 코드의 변환 장치 및 방법 KR102062208B1 (ko)

Priority Applications (4)

Application Number Priority Date Filing Date Title
KR1020130050251A KR102062208B1 (ko) 2013-05-03 2013-05-03 멀티스레드 프로그램 코드의 변환 장치 및 방법
EP14166856.6A EP2799986B1 (en) 2013-05-03 2014-05-02 Apparatus and method for translating multithread program code
US14/268,383 US9665354B2 (en) 2013-05-03 2014-05-02 Apparatus and method for translating multithread program code
CN201410184147.0A CN104133668B (zh) 2013-05-03 2014-05-04 用于转换多线程程序代码的设备和方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020130050251A KR102062208B1 (ko) 2013-05-03 2013-05-03 멀티스레드 프로그램 코드의 변환 장치 및 방법

Publications (2)

Publication Number Publication Date
KR20140131200A true KR20140131200A (ko) 2014-11-12
KR102062208B1 KR102062208B1 (ko) 2020-02-11

Family

ID=50774626

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020130050251A KR102062208B1 (ko) 2013-05-03 2013-05-03 멀티스레드 프로그램 코드의 변환 장치 및 방법

Country Status (4)

Country Link
US (1) US9665354B2 (ko)
EP (1) EP2799986B1 (ko)
KR (1) KR102062208B1 (ko)
CN (1) CN104133668B (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20180076051A (ko) * 2016-12-27 2018-07-05 삼성전자주식회사 OpenCL 커널을 처리하는 방법과 이를 수행하는 컴퓨팅 장치

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9870204B2 (en) * 2014-11-14 2018-01-16 Cavium, Inc. Algorithm to achieve optimal layout of instruction tables for programmable network devices
WO2019157743A1 (zh) * 2018-02-14 2019-08-22 华为技术有限公司 线程处理方法和图形处理器
CN109901840B (zh) * 2019-02-14 2020-10-27 中国科学院计算技术研究所 一种线程间冗余删除的异构编译优化方法
CN112130898A (zh) * 2019-06-24 2020-12-25 华为技术有限公司 一种插入同步指令的方法及装置

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009259240A (ja) * 2008-04-09 2009-11-05 Nvidia Corp 汎用プロセッサによって実行するためのアプリケーションプログラムのリターゲティング
KR20110077720A (ko) * 2009-12-30 2011-07-07 삼성전자주식회사 프로그램 코드의 변환 방법
US20110314442A1 (en) * 2010-06-17 2011-12-22 International Business Machines Corporation Reducing parallelism of computer source code
JP2012073661A (ja) * 2010-09-27 2012-04-12 Toshiba Corp プログラム並列化装置およびプログラム
KR20120054027A (ko) * 2009-07-27 2012-05-29 어드밴스드 마이크로 디바이시즈, 인코포레이티드 프로세서들에 걸쳐 데이터-병렬 쓰레드들을 지닌 프로세싱 로직을 매핑하는 방법

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6820250B2 (en) 1999-06-07 2004-11-16 Intel Corporation Mechanism for software pipelining loop nests
GB2380825B (en) * 2001-10-12 2004-07-14 Siroyan Ltd Processors and compiling methods for processors
US7574690B2 (en) * 2003-08-07 2009-08-11 National Instruments Corporation Graphical program which executes a timed loop
US7386864B2 (en) * 2003-11-12 2008-06-10 Microsoft Corporation Automatic serialization for event driven multi-threaded programs in an object structured system
GB0524720D0 (en) * 2005-12-05 2006-01-11 Imec Inter Uni Micro Electr Ultra low power ASIP architecture II
CN101329638B (zh) * 2007-06-18 2011-11-09 国际商业机器公司 程序代码的并行性的分析方法和系统
KR101117430B1 (ko) 2008-04-09 2012-02-29 엔비디아 코포레이션 범용 프로세서에 의해 실행하기 위한 어플리케이션 프로그램의 리타게팅
US8776030B2 (en) 2008-04-09 2014-07-08 Nvidia Corporation Partitioning CUDA code for execution by a general purpose processor
US7979844B2 (en) * 2008-10-14 2011-07-12 Edss, Inc. TICC-paradigm to build formally verified parallel software for multi-core chips
EP2438545A2 (en) * 2009-06-02 2012-04-11 Vector Fabrics B.V. Improvements in embedded system development
US8561046B2 (en) * 2009-09-14 2013-10-15 Oracle America, Inc. Pipelined parallelization with localized self-helper threading
KR101756820B1 (ko) 2010-10-21 2017-07-12 삼성전자주식회사 중첩 루프를 처리하기 위한 재구성 가능 프로세서 및 방법
US8726251B2 (en) * 2011-03-29 2014-05-13 Oracle International Corporation Pipelined loop parallelization with pre-computations
US9367306B2 (en) * 2011-03-30 2016-06-14 Nvidia Corporation Method for transforming a multithreaded program for general execution
CN103020494B (zh) * 2012-12-03 2015-06-24 哈尔滨工业大学 一种利用程序代码编程模式著作权归属检测模型检测著作权归属的方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009259240A (ja) * 2008-04-09 2009-11-05 Nvidia Corp 汎用プロセッサによって実行するためのアプリケーションプログラムのリターゲティング
KR20120054027A (ko) * 2009-07-27 2012-05-29 어드밴스드 마이크로 디바이시즈, 인코포레이티드 프로세서들에 걸쳐 데이터-병렬 쓰레드들을 지닌 프로세싱 로직을 매핑하는 방법
KR20110077720A (ko) * 2009-12-30 2011-07-07 삼성전자주식회사 프로그램 코드의 변환 방법
US20110314442A1 (en) * 2010-06-17 2011-12-22 International Business Machines Corporation Reducing parallelism of computer source code
JP2012073661A (ja) * 2010-09-27 2012-04-12 Toshiba Corp プログラム並列化装置およびプログラム

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20180076051A (ko) * 2016-12-27 2018-07-05 삼성전자주식회사 OpenCL 커널을 처리하는 방법과 이를 수행하는 컴퓨팅 장치

Also Published As

Publication number Publication date
EP2799986B1 (en) 2020-01-22
US20140331216A1 (en) 2014-11-06
EP2799986A1 (en) 2014-11-05
US9665354B2 (en) 2017-05-30
KR102062208B1 (ko) 2020-02-11
CN104133668B (zh) 2019-05-03
CN104133668A (zh) 2014-11-05

Similar Documents

Publication Publication Date Title
JP5102758B2 (ja) 複数の発行ポートを有するプロセッサにおける命令グループを形成する方法、並びに、その装置及びコンピュータ・プログラム
Rawat et al. Domain-specific optimization and generation of high-performance GPU code for stencil computations
JP2921190B2 (ja) 並列実行方式
KR20180021812A (ko) 연속하는 블록을 병렬 실행하는 블록 기반의 아키텍쳐
JP2008535074A5 (ko)
US9195444B2 (en) Compiler method and compiler apparatus for optimizing a code by transforming a code to another code including a parallel processing instruction
JP2014010832A (ja) ステージド・ループ命令
KR102062208B1 (ko) 멀티스레드 프로그램 코드의 변환 장치 및 방법
Tan et al. Multithreaded pipeline synthesis for data-parallel kernels
WO2007085855A1 (en) A system and method for parallel execution of a program
Wozniak et al. Language features for scalable distributed-memory dataflow computing
Pager et al. A software scheme for multithreading on CGRAs
Moustafa et al. 3D cartesian transport sweep for massively parallel architectures with PARSEC
Carle et al. Predicate-aware, makespan-preserving software pipelining of scheduling tables
Jacob et al. ALPyNA: acceleration of loops in Python for novel architectures
Barua et al. Cost-driven thread coarsening for GPU kernels
Andon et al. Programming high-performance parallel computations: formal models and graphics processing units
KR20150040663A (ko) 소프트웨어 파이프라이닝을 이용한 명령어 스케줄링 방법 및 장치
Bajrovic et al. Automatic performance tuning of pipeline patterns for heterogeneous parallel architectures
JPH04293150A (ja) コンパイル方法
Fumero et al. Using compiler snippets to exploit parallelism on heterogeneous hardware: a Java reduction case study
JP6897213B2 (ja) コード生成装置、コード生成方法及びコード生成プログラム
Tomiyama et al. Automatic parameter optimization for edit distance algorithm on GPU
Shao et al. Map-reduce inspired loop parallelization on CGRA
US20090187895A1 (en) Device, method, program, and recording medium for converting program

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