JP7088276B1 - コンパイル装置、コンパイル方法、及びコンパイルプログラム - Google Patents

コンパイル装置、コンパイル方法、及びコンパイルプログラム Download PDF

Info

Publication number
JP7088276B1
JP7088276B1 JP2020206419A JP2020206419A JP7088276B1 JP 7088276 B1 JP7088276 B1 JP 7088276B1 JP 2020206419 A JP2020206419 A JP 2020206419A JP 2020206419 A JP2020206419 A JP 2020206419A JP 7088276 B1 JP7088276 B1 JP 7088276B1
Authority
JP
Japan
Prior art keywords
vector
loop
vector register
generation means
register
Prior art date
Legal status (The legal status 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 status listed.)
Active
Application number
JP2020206419A
Other languages
English (en)
Other versions
JP2022096010A (ja
Inventor
健人 岩川
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NEC Corp
Original Assignee
NEC Corp
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 NEC Corp filed Critical NEC Corp
Priority to JP2020206419A priority Critical patent/JP7088276B1/ja
Priority to PCT/JP2021/042164 priority patent/WO2022130883A1/ja
Priority to US18/265,300 priority patent/US20240053969A1/en
Application granted granted Critical
Publication of JP7088276B1 publication Critical patent/JP7088276B1/ja
Publication of JP2022096010A publication Critical patent/JP2022096010A/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • 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
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations

Abstract

【課題】プログラム中のループが隣接するデータへのアクセスを含んでいる場合にプログラムを高速化することができる、コンパイル装置、コンパイル方法及びコンパイルプログラムを提供する。【解決手段】コンパイラは、ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析部と、隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行部と、を含む。【選択図】図2A

Description

本発明は、コンパイル装置、コンパイル方法、及びコンパイルプログラムに関し、特にプログラムの高速化に関する。
計算機の演算装置からメインメモリへのアクセス時間は、演算装置の演算時間と比べると大きく、メインメモリと演算装置との間のデータ転送性能は不足している。この広がる性能差を埋めるために、一般にスカラ計算機では、演算装置とメインメモリ間に高速なキャッシュメモリを設けることにより、メインメモリへのアクセス時間を短縮している。一方、ベクトル計算機では、ベクトル命令により一度に多くのデータをまとめて転送することにより、メインメモリへのアクセス時間を短縮している。データ1個あたりのメモリアクセス時間は、同時に転送されたデータの個数分の1とみなすことができる。この個数の最大値はベクトル計算機のベクトル長で決まり、ベクトル長の値が256の場合は、メモリアクセス時間は256分の1と、小さい値になる。
またベクトル計算機では、メインメモリに配置されているデータをベクトルレジスタ上にロードしてそのベクトルレジスタを介して、高速な演算を実現している。このため、メインメモリ上のデータをいかに効率良くレジスタ上に持ってくるかということが、高速化のために重要である。
特許文献1は、ベクトル計算機に関するものであり、隣接するメモリアクセス命令が存在するときに重複したメモリアクセスを削減して実行性能を向上させることが提案されている。
特許文献2は、計算機で用いられるコンパイル方法に関するものであり、ソースプログラムにおける配列を抽出し、アクセス回数に応じてメインメモリ又は一時記憶装置に割り当てることが提案されている。
特開2000-048009号公報 特開2013-182293号公報
しかしながら、上述した背景技術のコンパイル方法には以下のような課題がある。背景技術のコンパイル方法では、図17の(a)に示すプログラムのように隣接するデータに対する演算をベクトル命令で処理する際には、図17の(b)のように各配列要素A(I)~A(I+4)に対してベクトルロード命令をそれぞれ発行するのが一般的である。
しかしながら、図17の(b)のように各配列要素に対してベクトルロード命令をそれぞれ発行すると、ベクトルロード命令実行数が増大する。また図17の(b)では、各ベクトルロード命令間において重複した要素をロードしている状態にある。ベクトルロード命令のようにメモリアクセスを伴う命令は、メモリアクセスを伴わない命令に比べて低速であり、重複した要素のロードはプログラムを低速にする。
特許文献1では、隣接するデータを要素シフトすることでベクトルロード命令を削減している。特許文献1では、要素シフトすることでベクトルレジスタの末尾のデータが不足するが、ベクトル長を変更して不足したデータについてはスカラ演算により処理を実行する、もしくはマスクにより演算を実行しないように取り扱うことが提案されている。このため、ベクトル長を変更して不足したデータについてはスカラ演算により処理を実行する、もしくはマスクにより演算を実行しない、といった取り扱いが必要であり、演算実行の効率性が低下するという課題がある。
本発明の目的は、プログラム中のループが隣接するデータへのアクセスを含んでいる場合にプログラムを高速化することができる、コンパイル装置、コンパイル方法、及びコンパイルプログラムを提供することにある。
前記目的を達成するため、本発明に係るコンパイル装置は、
ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析部と、
上記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行部と、を含む。
本発明に係るコンパイル方法は、
ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定し、
上記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むためのベクトルロード命令を生成し、
上記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令を生成し、
演算を実行するためのベクトル演算命令を生成し、
演算結果を上記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成する。
本発明に係るコンパイルプログラムは、
コンピュータを、
ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析手段と、
上記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行手段と、して機能させる。
本発明によれば、プログラム中のループが隣接するデータへのアクセスを含んでいる場合にプログラムを高速化することができる、コンパイル装置、コンパイル方法、及びコンパイルプログラムを提供することができる。
本発明の実施形態のコンパイル方法を説明するための概念図である。 本発明の第1実施形態によるコンパイラを説明するためのブロック図である。 本発明の実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムに関して、目的プログラムを実行する計算機の構成を説明するためのブロック図である。 本発明の第1実施形態によるコンパイル方法を説明するためのフローチャートである。 本発明の第1実施形態が対象とするソースプログラムの一例である。 本発明の第1実施形態によるコンパイル方法のうち、ベクトルロードにより演算に必要となる要素をメモリからロードする動作を説明するための概念図である。 本発明の第1実施形態によるコンパイル方法のうち、ベクトル要素シフトにより隣接データA(I+1)を生成する動作を説明するための概念図である。 本発明の第1実施形態によるコンパイル方法のうち、ベクトル要素シフトにより隣接データA(I+2)を生成する動作を説明するための概念図である。 本発明の第1実施形態によるコンパイル方法のうち、ベクトル要素シフトにより隣接データA(I+3)を生成する動作を説明するための概念図である。 本発明の第1実施形態によるコンパイル方法のうち、ベクトル要素シフトにより隣接データA(I+4)を生成する動作を説明するための概念図である。 本発明の第1実施形態によるコンパイル方法のうち、ベクトル演算の動作を説明するための概念図である。 本発明の第1実施形態によるコンパイル方法のうち、ベクトルストアによる演算結果をメモリへストアする動作を説明するための概念図である。 (a)は背景技術により生成される命令列であり、(b)は本発明の実施形態により生成される命令列である。 本発明の第2実施形態が対象とするソースプログラムの一例である。 本発明の第2実施形態によるコンパイル方法を説明するための概念図である。 本発明の第3実施形態が対象とするソースプログラムの一例である。 本発明の第3実施形態によるコンパイル方法を説明するための概念図である。 (a)は隣接アクセスを伴う演算のソースプログラムであり、(b)は背景技術のコンパイル方法で生成される命令列である。
本発明の具体的な実施形態について説明する前に、実施形態の概要について説明する。
本発明の実施形態では、隣接するデータをロードするベクトルロード命令がソースプログラムに含まれる場合、この隣接するデータをロードするベクトルロード命令を、メモリアクセスを伴わない図1に示すベクトル要素シフト命令に置き換えることでプログラムを高速化する。
図5のように、演算に必要となるデータをベクトルロード命令により、ベクトルレジスタにロードをする。そして、データをロードしたベクトルレジスタの要素をベクトル要素シフト命令により図6のようにシフトすることで、隣接するデータ要素を生成する。
ベクトル要素シフト命令により隣接するデータ要素を生成することで、重複するデータのロードを無くすことできるためベクトルロード命令実行数を削減できプログラムを高速化できる。
本発明の実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムは、目的プログラム(オブジェクトプログラム)を実行する計算機に用いられる。このような計算機は、図2Bに示される計算機150であり、演算装置151、メインメモリ152、及び一時記憶装置153を含んで構成される。計算機150はコンピュータであり、ベクトル演算が可能なベクトル計算機である。このような構成の計算機は、特許文献2で提案されている。
図2Bの演算装置151は、プログラムに基づいて計算機150が演算を実行するための装置である。演算装置151は、具体的には計算機のCPU(Central Processing Unit)、GPU(Graphics Processing Unit)といったプロセッサ内の演算装置であり、例えばCPUにおけるALU(Arithmetic Logic Unit)により構成される。演算装置151は、メインメモリ152又は一時記憶装置153からデータを取得し、それに応じて演算を実行する。
図2Bのメインメモリ152は、計算機150において演算装置151がアクセス可能な主記憶装置である。メインメモリ152は、演算装置151が演算を実行するために必要なデータ及び演算を実行した結果のデータを保持することができる。
図2Bの一時記憶装置153は、演算装置151がメインメモリ152よりも高速にアクセス可能な記憶装置であり、例えばレジスタが該当する。例えば、演算装置151及び一時記憶装置153がCPUを構成する場合には、演算装置151はCPU内のALU、一時記憶装置153はCPU内のレジスタである。
本発明の実施形態のコンパイル装置は、上記計算機150が実行する目的プログラムを、原始プログラム(ソースプログラム)に基づいて生成するコンパイラである。コンパイラは、ソースプログラムをコンパイルすることにより、オブジェクトコードを生成し、目的プログラム(オブジェクトプログラム)を生成する。以下、本発明の具体的な実施形態について、図面を参照しながら詳細に説明する。
〔第1実施形態〕
初めに、本発明の第1実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、説明する。
(実施形態の構成)
図2Aは、本実施形態によるコンパイル装置を説明するためのブロック図である。図2Aのコンパイル装置は、ソースプログラムをコンパイルしてオブジェクトコードを生成するコンパイラ100である。図2Aのコンパイラ100は、プログラムとしてのソースプログラムを解析してプログラム中のループが隣接するデータへのアクセスを含んでおりベクトル化可能であるかを解析するループ解析部10、及び解析結果に基づきループをベクトル化するベクトル化実行部20を含む。本実施形態によるコンパイル装置は、上述した計算機に用いられ、コンパイラに組み込まれる一機能である。
ループ解析部10は、ループ中に隣接するデータへのアクセスが含まれているか認識する隣接データ認識手段11、及び隣接するデータへのアクセスを含むループがベクトル化可能であるかを判断するベクトル化判定手段12を含む。
ベクトル化実行部20は、演算に必要となる要素をメモリからベクトルレジスタへ読込むためのベクトルロード命令生成手段21を含む。さらにベクトル化実行部20は、ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを計算する命令(ベクトル要素シフト命令)を生成するためのベクトル要素シフト命令生成手段22、演算を実行するためのベクトル演算命令生成手段23を含む。さらにベクトル化実行部20は、演算結果をベクトルレジスタからメモリへ書込むためのベクトルストア命令生成手段24を含む。
本発明の実施形態において、コンパイラが用いられる計算機はベクトル演算が可能なベクトル計算機であり、ベクトル要素シフト命令を備えているものとする。ベクトル要素シフトは、図1の1.に示すようにVyで指定されたベクトルレジスタの要素を1要素左へシフトしてVxで指定されたベクトルレジスタに格納し、図1の2.に示すようにVzで指定されたベクトルレジスタの先頭要素をVxで指定されたベクトルレジスタの最後尾の要素に格納する。こうしてコンパイラ100は、ベクトル要素シフト命令生成手段22においてベクトル要素シフトを生成する。
(実施形態の動作)
次に、図3~11を用いて動作について説明する。図3は、本発明の第1実施形態によるコンパイル方法を説明するためのフローチャートである。図4は、本発明の第1実施形態が対象とするソースプログラムの一例である。図5は、本発明の第1実施形態によるコンパイル方法のうち、ベクトルロードにより演算に必要となる要素をメモリからロードする動作を説明するための概念図である。図6は、本発明の第1実施形態によるコンパイル方法のうち、ベクトル要素シフトにより隣接データA(I+1)を生成する動作を説明するための概念図である。図7は、本発明の第1実施形態によるコンパイル方法のうち、ベクトル要素シフトにより隣接データA(I+2)を生成する動作を説明するための概念図である。図8は、本発明の第1実施形態によるコンパイル方法のうち、ベクトル要素シフトにより隣接データA(I+3)を生成する動作を説明するための概念図である。図9は、本発明の第1実施形態によるコンパイル方法のうち、ベクトル要素シフトにより隣接データA(I+4)を生成する動作を説明するための概念図である。図10は、本発明の第1実施形態によるコンパイル方法のうち、ベクトル演算の動作を説明するための概念図である。図11は、本発明の第1実施形態によるコンパイル方法のうち、ベクトルストアによる演算結果をメモリへストアする動作を説明するための概念図である。
本説明においては、1つのベクトルレジスタの要素数は256とする。図4は、隣接するデータに対する演算を有するFortranプログラムとなっている。図4のプログラムは、配列要素A(I)~A(I+4)を用いた演算であり、隣接する配列要素の添字式の値の差が1のプログラムである。なお後述するように、本発明が適用できるプログラムは隣接する配列要素の添字式の値の差が1のプログラムに限られない。
対象のソースプログラムを解析する(ステップS1)。隣接データ認識手段11は、ソースプログラムに図4のようなループが隣接するデータアクセスを含むかを認識する。言い換えると、隣接データ認識手段11は、ソースプログラム中のループが隣接するデータへのアクセスを含んでいるか否かを判断する(ステップS2)。ソースプログラム中のループが隣接するデータへのアクセスを含んでいないとき(ステップS2のNO)は、ステップS8に進む。
ソースプログラム中のループが隣接するデータへのアクセスを含んでいるとき(ステップS2のYES)はステップS3に進み、ベクトル化判定手段12が隣接するデータアクセスを含むループにおいてベクトル化が可能か否かを判定する(ステップS3)。ベクトル化できる条件としては、配列や変数の定義・参照関係にベクトル化を阻害する依存関係がないことが挙げられる。ベクトル化が可能でないとき(ステップS3のNO)は、ステップS8に進む。
ベクトル化が可能なとき(ステップS3のYES)はステップS4に進み、隣接するデータアクセスを含みかつベクトル化可能であるループをベクトル化実行部20でベクトル化する。ベクトル化実行部20では、図5~11の手順により図4のソースプログラムから命令列を生成する。
ベクトル化実行部20では、演算に必要となるデータをベクトルレジスタへメモリからロードするためにベクトルロード命令生成手段21によりベクトルロード命令を生成する。図4のソースプログラムでは配列の添字式の最大はI+4となる。そのため、1回のベクトル演算において使用するデータの要素数はベクトル長+4個となる。図4のループのベクトル長は256となるため、図5のようにvreg1に配列Aの1~256番目の要素、vreg2に配列Aの257~260番目の要素をロードすることになる。vreg1がA(I)に該当する要素を持つベクトルレジスタとなる。
ベクトルレジスタへデータをロードしたのち、ベクトル要素シフト命令生成手段22が隣接するデータ要素を持つベクトルレジスタを生成する。隣接するデータ要素を持つベクトルレジスタは、図1のベクトル要素シフト命令により生成する。
本実施形態ではA(I+1)に該当する要素を持つベクトルレジスタは、vreg1とvreg2をベクトル要素シフト命令の入力とすることで、図6の(1)及び(2)に示すよう生成することができる。vreg3が、A(I+1)に該当する要素を持つベクトルレジスタとなる。
A(I+2)に該当する要素を持つベクトルレジスタを生成するには、図7の(1)のようにベクトル要素シフト命令によりvreg2から先頭要素が258となるvreg4を先に生成する。そして、先に生成したvreg3とvreg4をベクトル要素シフト命令の入力とすることで図7の(2)、図7の(3)のようにA(I+2)に該当する要素を持つベクトルレジスタを生成できる。vreg5が、A(I+2)に該当する要素を持つベクトルレジスタとなる。A(I+3)、A(I+4)に該当する要素を持つベクトルレジスタについても、A(I+2)と同様の手順によりそれぞれベクトル要素シフト命令を2命令実行することで図8の(1)~(3)、図9の(1)~(3)のように生成することができる。
隣接する要素を持つベクトルレジスタを生成できたら、生成したベクトルレジスタを入力として演算を実行する。ベクトル演算命令生成手段23により、図10のような演算命令を生成する(ステップS6)。
最後に、ベクトルストアにより演算結果をメモリへストアする。ベクトルストア命令生成手段24により図11のようなベクトルストア命令を生成する(ステップS7)。ステップS2での判定結果、ステップS3での判定結果、及びステップS4からステップS7で生成された命令を総合して、目的プログラムを生成する(ステップS8)。
(実施形態の効果)
本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、隣接するデータをロードするベクトルロード命令がソースプログラムに含まれる場合にはこのベクトルロード命令を、メモリアクセスを伴わないベクトル要素シフト命令に置き換える。メモリアクセスを伴わない命令は、ベクトルロード命令のようにメモリアクセスを伴う命令に比べて高速である。このベクトルロード命令の、メモリアクセスを伴わないベクトル要素シフト命令への置き換えによって、ベクトルロード命令の実行数を削減することができる。これにより、プログラムを高速化することができる。
図12の(a)は、背景技術により生成される命令列であり、図12の(b)は、本発明の実施形態により生成される命令列である。背景技術のコンパイル方法では、隣接するデータに対するベクトル演算の際には、各配列要素A(I)~A(I+4)に対してベクトルロード命令をそれぞれ発行し、演算で使用するすべてのデータを図12の(a)のようにベクトルロード命令によりベクトルレジスタへ読み込んでいた。これに対して、本発明の実施形態のコンパイル方法では、隣接するデータに対するベクトル演算の際にベクトルロード命令を、メモリアクセスを伴わないベクトル要素シフト命令に置き換える。これにより、図12の(b)のようにベクトル要素シフト命令を生成することで、ベクトルロード命令の実行数を減らすことができる。ベクトルロード命令実行数を減らすことでメモリへのアクセスを減らすことができ、プログラムを高速化できる。
さらに本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、ベクトル要素シフト命令により隣接するデータ要素を生成して、ベクトル長を変更することなく演算を実行することができる。これにより、ベクトル長を削減することなく効率的に演算を実行することができる。
〔第2実施形態〕
次に、本発明の第2実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、説明する。本実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、上述した第1実施形態と同様な内容についてはその詳細な説明を省略して、相違点について説明する。上述した第1実施形態では、隣接する配列要素の添字式の値の差が1のプログラムを例に説明したが、本発明はこれに限られない。例えば、各添字式の値の差が1より大きいプログラムにおいても適用できる。
図13は、本発明の第2実施形態が対象とするソースプログラムの一例である。図14は、本発明の第2実施形態によるコンパイル方法を説明するための概念図である。図13のプログラムは、配列要素A(I)、A(I+3)、A(I+4)、A(I+7)、A(I+10)を用いた演算であり、隣接する配列要素の添字式の値の差が2以上である配列要素を用いたプログラムである。本実施形態では、図14の1.に示すようにVyで指定されたベクトルレジスタの要素をSxで指定されたレジスタの値だけ左へシフトしてVxで指定されたベクトルレジスタに格納し、図14の2.に示すようにVzで指定されたベクトルレジスタの先頭要素Sx個をVxで指定されたベクトルレジスタの最後尾の要素に格納する。
図14では、Sx=2の場合を示している。図14では、Vyで指定されたベクトルレジスタをSxで指定されたレジスタの値(Sx=2)だけ左シフトしてVxに代入している。さらにVxの最後尾の要素にVzで指定されたベクトルレジスタの先頭要素Sx個(Sx=2)を結合している。
例えば配列要素A(I)から配列要素A(I+3)を生成するときには、Vyで指定されたベクトルレジスタをSxで指定されたレジスタの値(Sx=3)だけ左シフトしてVxに代入する。さらにVxの最後尾の要素にVzで指定されたベクトルレジスタの先頭要素Sx個(Sx=3)を結合する。以下同様に、添字式の値の差に対応する、Sxで指定されたレジスタの値だけ左シフトしてVxに代入し、Vxの最後尾の要素にVzで指定されたベクトルレジスタの先頭要素Sx個を結合する。このように、添字式の値の差に対応する、Sxで指定されたレジスタの値だけ左シフトしてVxに代入し、Vxの最後尾の要素にVzで指定されたベクトルレジスタの先頭要素Sx個を結合することで、A(I+4)、A(I+7)やA(I+10)についても同様にデータをロードすることができる。
本実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムは、図14に示すような複数要素シフト可能であるベクトル要素シフト命令を、ベクトル演算が可能なベクトル計算機が有していれば適用できる。また、ベクトル計算機がそのような命令を有していなくても、複数ベクトル要素シフト命令を生成することでも適用できる。
(実施形態の効果)
本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、第1実施形態と同様に、隣接するデータをロードするベクトルロード命令がソースプログラムに含まれる場合にはこのベクトルロード命令を、メモリアクセスを伴わないベクトル要素シフト命令に置き換える。メモリアクセスを伴わない命令は、ベクトルロード命令のようにメモリアクセスを伴う命令に比べて高速である。このベクトルロード命令の、メモリアクセスを伴わないベクトル要素シフト命令への置き換えによって、ベクトルロード命令の実行数を削減することができる。これにより、第1実施形態と同様に、プログラムを高速化することができる。
さらに本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、ベクトル要素シフト命令により隣接するデータ要素を生成して、ベクトル長を変更することなく演算を実行することができる。これにより、ベクトル長を削減することなく効率的に演算を実行することができる。
さらに本実施形態によれば、隣接する配列要素の添字式の値の差が2以上のプログラムにおいても、隣接するデータをロードするベクトルロード命令がソースプログラムに含まれる場合にはこのベクトルロード命令を、メモリアクセスを伴わないベクトル要素シフト命令に置き換えることができる。これにより、高速化が可能な対象プログラムの範囲を拡げることができる。
〔第3実施形態〕
次に、本発明の第3実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、説明する。本実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、上述した第1実施形態と同様な内容についてはその詳細な説明を省略して、相違点について説明する。上述した第1実施形態では、隣接する配列要素の添字式の値の差が1で値が増加するプログラムを例に説明したが、本発明はこれに限られない。例えば、添字式の値が減少するような場合においても適用できる。
図15は、本発明の第3実施形態が対象とするソースプログラムの一例である。図16は、本発明の第3実施形態によるコンパイル方法を説明するための概念図である。図15のプログラムは、配列要素A(I)、A(I-1)、A(I-2)、A(I-3)、A(I-4)を用いた演算であり、隣接する配列要素の添字式の値が減少するような配列要素を用いたプログラムである。本実施形態では、図16の1.に示すようにVyで指定されたベクトルレジスタの要素を1要素右へシフトしてVxで指定されたベクトルレジスタに格納し、図16の2.に示すようにVxの先頭要素にVzで指定されたベクトルレジスタの先頭要素を結合する。
例えば配列要素A(I)から配列要素A(I-1)を生成するときには、Vyで指定されたベクトルレジスタを1要素右シフトしてVxに代入する。さらにVxの先頭要素にVzで指定されたベクトルレジスタの先頭要素を結合する。以下同様に、右シフトしてVxに代入し、Vxの先頭要素にVzで指定されたベクトルレジスタの先頭要素を結合することで、A(I-2)、A(I-3)、A(I-4)についても同様にデータをロードすることができる。
本実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムは、図1とはシフト方向が逆となる図16のようなベクトル要素シフト命令を、ベクトル演算が可能なベクトル計算機が有していれば適用できる。またベクトル演算が可能なベクトル計算機がそのような命令を有していなくても、配列要素A(I)ではなく配列要素A(I-4)を基点としてデータをロードすることでも適用できる。
(実施形態の効果)
本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、第1実施形態と同様に、隣接するデータをロードするベクトルロード命令がソースプログラムに含まれる場合にはこのベクトルロード命令を、メモリアクセスを伴わないベクトル要素シフト命令に置き換える。メモリアクセスを伴わない命令は、ベクトルロード命令のようにメモリアクセスを伴う命令に比べて高速である。このベクトルロード命令の、メモリアクセスを伴わないベクトル要素シフト命令への置き換えによって、ベクトルロード命令の実行数を削減することができる。これにより、第1実施形態と同様に、プログラムを高速化することができる。
さらに本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、ベクトル要素シフト命令により隣接するデータ要素を生成して、ベクトル長を変更することなく演算を実行することができる。これにより、ベクトル長を削減することなく効率的に演算を実行することができる。
さらに本実施形態によれば、隣接する配列要素の添字式の値が減少するような配列要素を用いたプログラムにおいても、隣接するデータをロードするベクトルロード命令がソースプログラムに含まれる場合にはこのベクトルロード命令を、メモリアクセスを伴わないベクトル要素シフト命令に置き換えることができる。これにより、高速化が可能な対象プログラムの範囲を拡げることができる。
以上、本発明の好ましい実施形態を説明したが、本発明はこれに限定されるものではない。例えば、第3実施形態のような隣接する配列要素の添字式の値が減少するような配列要素を用いたプログラムだけでなく、さらに第2実施形態のような隣接する配列要素の添字式の値の差が2以上である配列要素を用いたプログラムにも、本発明は適用可能である。特許請求の範囲に記載した発明の範囲内で、種々の変形が可能であり、それらも本発明の範囲に含まれることはいうまでもない。
上記の実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
(付記1)
ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析部と、
前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行部と、を含む、
コンパイル装置。
(付記2)
前記ベクトル化実行部は、
演算に必要となる要素をメモリから前記ベクトルレジスタへ読み込むための命令を生成するベクトルロード命令生成手段と、
前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令生成手段と、
演算を実行するための演算命令を生成するベクトル演算命令生成手段と、
演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成するベクトルストア命令生成手段と、を含む、
付記1に記載のコンパイル装置。
(付記3)
前記ベクトル要素シフト命令生成手段は、隣接する配列要素の添字式の値が増加する場合、指定された第1のベクトルレジスタのデータを値の増加数だけ左シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記増加数と同数だけ最後尾に結合する、
付記2に記載のコンパイル装置。
(付記4)
前記ベクトル要素シフト命令生成手段は、隣接する配列要素の添字式の値が減少する場合、指定された第1のベクトルレジスタのデータを値の減少数だけ右シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記減少数と同数だけ先頭要素に結合する、
付記2に記載のコンパイル装置。
(付記5)
前記ループ解析部は、
ループ中に隣接するデータへのアクセスが含まれているか認識する隣接データ認識手段と、
隣接するデータへのアクセスを含むループがベクトル化可能であるかを判定するベクトル化判定手段と、を含む、
付記1乃至付記4のいずれか一つに記載のコンパイル装置。
(付記6)
ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定し、
前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むためのベクトルロード命令を生成し、
前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令を生成し、
演算を実行するためのベクトル演算命令を生成し、
演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成する、
コンパイル方法。
(付記7)
前記ベクトル要素シフト命令は、隣接する配列要素の添字式の値が増加する場合、指定された第1のベクトルレジスタのデータを値の増加数だけ左シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記増加数と同数だけ最後尾に結合する、
付記6に記載のコンパイル方法。
(付記8)
前記ベクトル要素シフト命令は、隣接する配列要素の添字式の値が減少する場合、指定された第1のベクトルレジスタのデータを値の減少数だけ右シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記減少数と同数だけ先頭要素に結合する、
付記6に記載のコンパイル方法。
(付記9)
コンピュータを、
ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析手段と、
前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行手段と、して機能させる、
コンパイルプログラム。
(付記10)
前記ベクトル化実行手段は、
演算に必要となる要素をメモリから前記ベクトルレジスタへ読み込むための命令を生成するベクトルロード命令生成手段と、
前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令生成手段と、
演算を実行するための演算命令を生成するベクトル演算命令生成手段と、
演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成するベクトルストア命令生成手段と、を含む、
付記9に記載のコンパイルプログラム。
(付記11)
前記ベクトル要素シフト命令生成手段は、隣接する配列要素の添字式の値が増加する場合、指定された第1のベクトルレジスタのデータを値の増加数だけ左シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記増加数と同数だけ最後尾に結合する、
付記10に記載のコンパイルプログラム。
(付記12)
前記ベクトル要素シフト命令生成手段は、隣接する配列要素の添字式の値が減少する場合、指定された第1のベクトルレジスタのデータを値の減少数だけ右シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記減少数と同数だけ先頭要素に結合する、
付記10に記載のコンパイルプログラム。
(付記13)
前記ループ解析手段は、
ループ中に隣接するデータへのアクセスが含まれているか認識する隣接データ認識手段と、
隣接するデータへのアクセスを含むループがベクトル化可能であるかを判定するベクトル化判定手段と、を含む、
付記9乃至付記12のいずれか一つに記載のコンパイルプログラム。
10 ループ解析部
11 隣接データ認識手段
12 ベクトル化判定手段
20 ベクトル化実行部
21 ベクトルロード命令生成手段
22 ベクトル要素シフト命令生成手段
23 ベクトル演算命令生成手段
24 ベクトルストア命令生成手段
100 コンパイラ

Claims (7)

  1. ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析部と、
    前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行部と、を含み、
    前記ベクトル化実行部は、
    演算に必要となる要素をメモリから前記ベクトルレジスタへ読み込むための命令を生成するベクトルロード命令生成手段と、
    前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令生成手段と、
    演算を実行するための演算命令を生成するベクトル演算命令生成手段と、
    演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成するベクトルストア命令生成手段と、を含み、
    前記ベクトル要素シフト命令生成手段は、隣接する配列要素の添字式の値が増加する場合、指定された第1のベクトルレジスタのデータを値の増加数だけ左シフトして第2のベクトルレジスタに代入し、さらにベクトル次のレジスタの先頭要素から前記増加数と同数だけ最後尾に結合する
    コンパイル装置。
  2. ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析部と、
    前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行部と、を含み、
    前記ベクトル化実行部は、
    演算に必要となる要素をメモリから前記ベクトルレジスタへ読み込むための命令を生成するベクトルロード命令生成手段と、
    前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令生成手段と、
    演算を実行するための演算命令を生成するベクトル演算命令生成手段と、
    演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成するベクトルストア命令生成手段と、を含
    前記ベクトル要素シフト命令生成手段は、隣接する配列要素の添字式の値が減少する場合、指定された第1のベクトルレジスタのデータを値の減少数だけ右シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記減少数と同数だけ先頭要素に結合する、
    コンパイル装置。
  3. 前記ループ解析部は、
    ループ中に隣接するデータへのアクセスが含まれているか認識する隣接データ認識手段と、
    隣接するデータへのアクセスを含むループがベクトル化可能であるかを判定するベクトル化判定手段と、を含む、
    請求項1又は請求項に記載のコンパイル装置。
  4. ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定し、
    前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むためのベクトルロード命令を生成し、
    前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令を生成し、
    演算を実行するためのベクトル演算命令を生成し、
    演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成する、コンパイル方法であり、
    前記ベクトル要素シフト命令は、隣接する配列要素の添字式の値が増加する場合、指定された第1のベクトルレジスタのデータを値の増加数だけ左シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記増加数と同数だけ最後尾に結合する、
    コンパイル方法。
  5. ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定し、
    前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むためのベクトルロード命令を生成し、
    前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令を生成し、
    演算を実行するためのベクトル演算命令を生成し、
    演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成する、コンパイル方法であり、
    前記ベクトル要素シフト命令は、隣接する配列要素の添字式の値が減少する場合、指定された第1のベクトルレジスタのデータを値の減少数だけ右シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記減少数と同数だけ先頭要素に結合する
    コンパイル方法。
  6. コンピュータを、
    ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析手段と、
    前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行手段と、して機能させる、コンパイルプログラムであり、
    前記ベクトル化実行手段は、
    演算に必要となる要素をメモリから前記ベクトルレジスタへ読み込むための命令を生成するベクトルロード命令生成手段と、
    前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令生成手段と、
    演算を実行するための演算命令を生成するベクトル演算命令生成手段と、
    演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成するベクトルストア命令生成手段と、を含み、
    前記ベクトル要素シフト命令生成手段は、隣接する配列要素の添字式の値が増加する場合、指定された第1のベクトルレジスタのデータを値の増加数だけ左シフトして第2のベクトルレジスタに代入し、さらにベクトル次のレジスタの先頭要素から前記増加数と同数だけ最後尾に結合する、
    コンパイルプログラム。
  7. コンピュータを、
    ソースプログラムのループ中に隣接するデータへのアクセスが含まれる場合に、そのループがベクトル化可能であるかを判定するループ解析手段と、
    前記隣接するデータへのアクセスが含まれ、かつ、そのループがベクトル化可能である場合に、演算に必要となる要素をメモリからベクトルレジスタへ読み込むための命令を生成するベクトル化実行手段と、して機能させる、コンパイルプログラムであり、
    前記ベクトル化実行手段は、
    演算に必要となる要素をメモリから前記ベクトルレジスタへ読み込むための命令を生成するベクトルロード命令生成手段と、
    前記ベクトルレジスタへ読み込んだ要素を要素シフトしたベクトルデータを生成するベクトル要素シフト命令生成手段と、
    演算を実行するための演算命令を生成するベクトル演算命令生成手段と、
    演算結果を前記ベクトルレジスタからメモリへ書き込むためのベクトルストア命令を生成するベクトルストア命令生成手段と、を含
    前記ベクトル要素シフト命令生成手段は、隣接する配列要素の添字式の値が減少する場合、指定された第1のベクトルレジスタのデータを値の減少数だけ右シフトして第2のベクトルレジスタに代入し、さらに次のベクトルレジスタの先頭要素から前記減少数と同数だけ先頭要素に結合する、
    コンパイルプログラム。
JP2020206419A 2020-12-14 2020-12-14 コンパイル装置、コンパイル方法、及びコンパイルプログラム Active JP7088276B1 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2020206419A JP7088276B1 (ja) 2020-12-14 2020-12-14 コンパイル装置、コンパイル方法、及びコンパイルプログラム
PCT/JP2021/042164 WO2022130883A1 (ja) 2020-12-14 2021-11-17 コンパイル装置、コンパイル方法、及びコンパイルプログラム記録媒体
US18/265,300 US20240053969A1 (en) 2020-12-14 2021-11-17 Compiling device, compiling method, and compiling program recording medium

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2020206419A JP7088276B1 (ja) 2020-12-14 2020-12-14 コンパイル装置、コンパイル方法、及びコンパイルプログラム

Publications (2)

Publication Number Publication Date
JP7088276B1 true JP7088276B1 (ja) 2022-06-21
JP2022096010A JP2022096010A (ja) 2022-06-29

Family

ID=82059761

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2020206419A Active JP7088276B1 (ja) 2020-12-14 2020-12-14 コンパイル装置、コンパイル方法、及びコンパイルプログラム

Country Status (3)

Country Link
US (1) US20240053969A1 (ja)
JP (1) JP7088276B1 (ja)
WO (1) WO2022130883A1 (ja)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0962654A (ja) * 1995-08-22 1997-03-07 Kofu Nippon Denki Kk リストベクトル処理装置
JPH1166046A (ja) * 1997-08-12 1999-03-09 Fujitsu Ltd ベクトル処理装置
JP2000048009A (ja) * 1998-07-28 2000-02-18 Fujitsu Ltd メモリアクセス処理装置および記録媒体
JP2009104494A (ja) * 2007-10-25 2009-05-14 Nec Computertechno Ltd ベクトル処理装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0962654A (ja) * 1995-08-22 1997-03-07 Kofu Nippon Denki Kk リストベクトル処理装置
JPH1166046A (ja) * 1997-08-12 1999-03-09 Fujitsu Ltd ベクトル処理装置
JP2000048009A (ja) * 1998-07-28 2000-02-18 Fujitsu Ltd メモリアクセス処理装置および記録媒体
JP2009104494A (ja) * 2007-10-25 2009-05-14 Nec Computertechno Ltd ベクトル処理装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
北脇 重宗 ほか,SX-3シリーズの言語プロセッサと開発支援ツール,NEC技報,株式会社日本電気文化センター,1992年02月28日,第45巻, 第2号,第59-70頁
北脇 重宗 ほか: "SX−3シリーズの言語プロセッサと開発支援ツール", NEC技報, vol. 第45巻, 第2号, JPN6022006158, 28 February 1992 (1992-02-28), pages 59 - 70, ISSN: 0004711320 *

Also Published As

Publication number Publication date
US20240053969A1 (en) 2024-02-15
WO2022130883A1 (ja) 2022-06-23
JP2022096010A (ja) 2022-06-29

Similar Documents

Publication Publication Date Title
JP4339907B2 (ja) マルチプロセッサ向け最適コード生成方法及びコンパイル装置
US8683468B2 (en) Automatic kernel migration for heterogeneous cores
US6113650A (en) Compiler for optimization in generating instruction sequence and compiling method
JP4042604B2 (ja) プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
US5247696A (en) Method for compiling loops having recursive equations by detecting and correcting recurring data points before storing the result to memory
JPH05143332A (ja) 命令スケジユーラを備えたコンピユータ・システム及び入力命令シーケンスを再スケジユールする方法
JP2001522502A (ja) 複数命令コンピュータプログラムを構成する方法
KR101787653B1 (ko) 병렬 파이프라인에서의 분기에 대한 하드웨어 및 소프트웨어 해법
Jiang et al. Boyi: A systematic framework for automatically deciding the right execution model of OpenCL applications on FPGAs
Moren et al. Automatic mapping for OpenCL-programs on CPU/GPU heterogeneous platforms
CN107038019A (zh) 单指令多数据计算系统中处理指令的方法及计算系统
US20170269931A1 (en) Method and Computing System for Handling Instruction Execution Using Affine Register File on Graphic Processing Unit
US11915056B2 (en) Combination of multiple data processing and machine learning frameworks for a target hardware
JP7088276B1 (ja) コンパイル装置、コンパイル方法、及びコンパイルプログラム
WO2022267638A1 (en) Method and apparatus for functional unit balancing at program compile time
Ghiglio et al. Improving performance of SYCL applications on CPU architectures using LLVM-directed compilation flow
Foley et al. Efficient partitioning of fragment shaders for multiple-output hardware
US7676799B1 (en) Address simplification by binary transformation
JP2022098645A (ja) コンパイル装置、コンパイル方法、及びコンパイルプログラム
JP7115563B2 (ja) コンパイル装置、コンパイル方法、及び制御プログラム
JP3730675B2 (ja) 処理装置
US20230259338A1 (en) Computer-implemented method and a computer-readable medium
JP2018049461A (ja) コンパイル装置、コンパイル方法、および、コンパイルプログラム
Bernstein et al. Usable assembly language for GPUs: a success story
Agathos et al. Compiler-assisted, adaptive runtime system for the support of OpenMP in embedded multicores

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20201214

RD01 Notification of change of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7421

Effective date: 20211020

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20220222

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20220421

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20220510

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20220523

R151 Written notification of patent or utility model registration

Ref document number: 7088276

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R151