JP2016212573A - 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム - Google Patents

計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム Download PDF

Info

Publication number
JP2016212573A
JP2016212573A JP2015094547A JP2015094547A JP2016212573A JP 2016212573 A JP2016212573 A JP 2016212573A JP 2015094547 A JP2015094547 A JP 2015094547A JP 2015094547 A JP2015094547 A JP 2015094547A JP 2016212573 A JP2016212573 A JP 2016212573A
Authority
JP
Japan
Prior art keywords
instruction
register
data
program
loop
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.)
Granted
Application number
JP2015094547A
Other languages
English (en)
Other versions
JP6492943B2 (ja
Inventor
俊 鎌塚
Shun Kamatsuka
俊 鎌塚
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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2015094547A priority Critical patent/JP6492943B2/ja
Priority to US15/132,815 priority patent/US9841957B2/en
Publication of JP2016212573A publication Critical patent/JP2016212573A/ja
Application granted granted Critical
Publication of JP6492943B2 publication Critical patent/JP6492943B2/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
    • 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/30032Movement instructions, e.g. MOVE, SHIFT, ROTATE, SHUFFLE
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4452Software pipelining
    • 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/30098Register arrangements
    • G06F9/30105Register structure
    • G06F9/30109Register structure having multiple operands in a single register
    • 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/30098Register arrangements
    • G06F9/30105Register structure
    • G06F9/30112Register structure comprising data of variable length
    • 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/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30138Extension of register space, e.g. register cache
    • 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/453Data distribution

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)
  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)

Abstract

【課題】ソフトウェアパイプライン適用時にレジスタ不足となることを抑止する。【解決手段】計算機の記憶部11は、複数の命令を繰り返すループ処理の記述を含むプログラム1を記憶する。演算部12は、ループ処理がソフトウェアパイプラインによりパイプライン化されるように、プログラム1における複数の命令の実行順を並べ替える。次に演算部12は、SIMD(Single Instruction Multiple Data)拡張命令用のレジスタを用いる命令を、プログラム1におけるループ処理の記述中に挿入する。【選択図】図1

Description

本発明は、計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラムに関する。
コンピュータに実行させるプログラムを生成する際に、ソフトウェアパイプライン(ソフトウェアパイプライニング、モジュロスケジューリングとも呼ぶ)により、ループ処理の最適化が行われることがある。ソフトウェアパイプラインは、ループ処理を対象とした命令スケジューリングを行い、ループ内の命令レベル並列性を高めるコンパイラの最適化手法である。大規模なプログラムにおける実行性能のボトルネックとなるのは、主としてループ処理である。そのため、ループ処理に対してソフトウェアパイプラインによる最適化を適用することは非常に重要である。
ソフトウェアパイプラインでは、ループの回転(イテレーション)をまたがって、命令スケジューリングが行われる。このスケジューリングに伴って、複数のループ分の処理が並列で実行され、各ループで使用するレジスタのライブレンジ(生存区間)が重なる。そのため、並列で実行されるループ間で同じレジスタを使用しないように、コンパイラによりレジスタリネーミングが行われる。
なお、プロセッサに実行させる命令は、命令セットアーキテクチャ(ISA:Instruction Set Architecture)で規定される。ISAには、SIMD(Single Instruction Multiple Data)拡張命令が含まれることがある。SIMD拡張命令は、1つの命令を複数のデータに適用できるようにしたものである。このように、ISAの強化により、プロセッサの処理能力を向上させることができる。
プロセッサの処理能力向上に関する技術としては、例えばベクトル化処理命令に対する命令セットアーキテクチャを強化する技術も考えられている。またレジスタファイルのアクセス回数を低減することで処理時間を短縮する技術も考えられている。
プロセッサに実行させる処理の効率化に関する技術として、例えば条件付きループのベクトル化に関する技術がある。またアライメント命令の実行により、宛て先に格納される2つの連結されたソースのデータ要素の選択的な格納を行う技術がある。
特開2001−147804号公報 特開2012−128790号公報 特開2012−128790号公報 特表2014−510352号公報
上記のように、ソフトウェアパイプラインの適用によりループ処理をパイプラインで処理することで、処理の効率化が図れる。しかし、ソフトウェアパイプラインを用いた最適化によりレジスタリネーミングが行われると、使用するレジスタ数が増加する。そのため、ソフトウェアパイプラインの適用により使用するレジスタ数が増加し、レジスタ割り付けを行う際にレジスタが不足しやすくなる。レジスタが不足した場合、レジスタ内容の退避・復元命令(ロード、ストア命令)が、ループ内に追加される可能性がある。このような退避・復元命令の追加は、実行性能に悪影響を与え、ソフトウェアパイプラインによる実効性能の改善効果が相殺されてしまう。
1つの側面では、本発明は、ソフトウェアパイプライン適用時の使用レジスタ数を抑制することを目的とする。
1つの案では、以下のような記憶部と演算部とを有する計算機が提供される。記憶部は、複数の命令を繰り返すループ処理の記述を含むプログラムを記憶する。演算部は、ループ処理がソフトウェアパイプラインによりパイプライン化されるように、プログラムにおける複数の命令の実行順を並べ替える。次に演算部は、SIMD拡張命令用のレジスタを用いる命令を、プログラムにおけるループ処理の記述中に挿入する。
1態様によれば、ソフトウェアパイプライン適用時の使用レジスタ数を抑制できる。
第1の実施の形態に係る計算機の構成例を示す図である。 第2の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。 ソフトウェアパイプラインの一例を示す図である。 疑似レジスタの使用例を示す図である。 レジスタリネーミングの発生状況の一例を示す図である。 ループのイテレーションごとの疑似レジスタの割り当て例を示す図である。 結合シフト命令によるデータシフトの一例を示す図である。 結合シフト命令を用いた疑似レジスタ割り当ての例を示す図である。 コンパイラの機能を示すブロック図である。 ソフトウェアパイプライン化の処理手順の一例を示すフローチャートである。 第2のソフトウェアパイプライン化の処理手順の一例を示すフローチャートである。 命令配置処理の手順の一例を示すフローチャートである。 結合シフト命令挿入処理の手順の一例を示すフローチャートである。 ソフトウェアパイプライン化対象のループ処理の例を示す図である。 第1のソフトウェアパイプライン化後の命令列を示す図である。 第2のソフトウェアパイプライン化後の命令列を示す図である。 MVE数=4となる場合の例を示す図である。 MVE数=4の場合の第2のソフトウェアパイプライン化後の命令列を示す図である。
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第1の実施の形態〕
従来のソフトウェアパイプラインの方法ではレジスタが増加しすぎて、最適化を適用できない場合があった。そこで第1の実施の形態では、例えばSIMD拡張命令用のレジスタ(以下、SIMD拡張レジスタと呼ぶ)を活用したレジスタリネーミングにより、ソフトウェアパイプライン最適化による使用レジスタ数を抑止する。使用するレジスタ数が抑止されることで、ソフトウェアパイプラインを適用できる可能性が向上する。
図1は、第1の実施の形態に係る計算機の構成例を示す図である。計算機10は、記憶部11と演算部12とを有する。
記憶部11は、複数の命令を繰り返すループ処理の記述を含むプログラム1を記憶する。
演算部12は、命令スケジューリングにより、ループ処理がソフトウェアパイプラインによりパイプライン化されるように、プログラム1における複数の命令の実行順を並べ替える(ステップS11)。次に演算部12は、複数の命令内のロード命令におけるデータのロード先として第1のレジスタ2を設定する(ステップS12)。さらに演算部12は、データ複数個分の記憶領域を有する第2のレジスタ3の右に第1のレジスタ2を結合させて得られる記憶領域内のデータ列を左にシフトさせるシフト命令を、プログラム1におけるループ処理の記述中に挿入する(ステップS13)。そして、演算部12は、ソフトウェアパイプライン化したプログラムを出力する。
なお第2のレジスタ3は、例えばSIMD拡張レジスタである。また演算部12は、例えば、シフト命令のシフト量を、例えばロード命令によるデータのロードから、参照を伴う命令(例えばadd命令)による該データの参照までの期間に同時に保持するデータ数N(Nは、2以上の整数)に基づいて設定する。例えば演算部12は、第1のレジスタ2にロードしたデータが、N回のシフトで第2のレジスタ3の先頭に移動するように、シフト命令の1回当たりのシフト量を設定する。図1の例では、第2のレジスタ3は、ロード対象のデータ4〜7のデータ長の4倍の記憶領域を有している。また図1の例では、同時に保持するデータ数Nは「4」である。そこで、図1の例では、第1のレジスタ2にロードしたデータ4〜7が、それぞれ4回の左シフトで第2のレジスタ3の先頭に移動するように、データ4〜7のデータ長分のシフト量が設定される。
演算部12でソフトウェアパイプライン化したプログラムを計算機10が実行すると、パイプライン化されたループ処理の繰り返し(イテレーション)ごとに、以下の処理が実行される。
まず1ループ分の処理を示す複数の命令内のロード命令に基づき、データが第1のレジスタ2へロードされる。次に、シフト命令に基づき、第2のレジスタ3の右に第1のレジスタ2を結合させて得られる記憶領域内のデータ列が左にシフトされる。イテレーションがパイプラインで並列に実行されることで、1つのイテレーションの実行期間中に、左シフトが繰り返し行われることとなる。そして参照を伴う命令(例えばadd命令)に基づき、左シフトの繰り返しにより第2のレジスタ3の先頭に移動したデータが参照される。
図1の例では、第1のイテレーション(I=1)のロード命令により第1のレジスタ2にデータ4がロードされる。ロードされたデータ4は、第1のイテレーション(I=1)のシフト命令(ecsl)で、所定量(例えばデータ4のデータ長)だけ左にシフトされる。これにより、データ4は、第2のレジスタ3の最後部(図中の右端)の領域に移動する。
その後、第2のイテレーション(I=2)のロード命令により第1のレジスタ2にデータ5がロードされる。これまでにロードされている2つのデータ4,5は、第2のイテレーション(I=2)のシフト命令(ecsl)で、所定量だけ左にシフトされる。次に、第3のイテレーション(I=3)のロード命令により第1のレジスタ2にデータ6がロードされる。これまでにロードされている3つのデータ4〜6は、第3のイテレーション(I=3)のシフト命令(ecsl)で、所定量だけ左にシフトされる。さらに、第4のイテレーション(I=4)のロード命令により第1のレジスタ2にデータ7がロードされる。これまでにロードされている4つのデータ4〜7は、第4のイテレーション(I=4)のシフト命令(ecsl)で、所定量だけ左にシフトされる。
第4のイテレーション(I=4)のシフト命令(ecsl)が実行された結果、データ4が、第2のレジスタ3の先頭に移動する。その後、第1のイテレーション(I=1)のadd命令により、第2のレジスタ3の先頭にあるデータ4が参照される。
このようにして、2つのレジスタを使用して、ソフトウェアパイプライン化が実現できる。これにより、同時に保持するデータ数分のレジスタを、レジスタリネーミングで割り当てる場合に比べ、使用するレジスタ数が削減される。
図1の例であれば、ループ処理における4つのイテレーションが並列で処理されるようにパイプライン化が行われている。この場合、第1のイテレーション(I=1)内のロード命令でロードしたデータを、add命令で参照するまでに、第2〜第4のイテレーション(I=2,3,4)それぞれのロード命令が実行される。そのため、シフト命令を用いずにレジスタリネーミングで対応しようとすると、4つのレジスタを使用することとなる。それに対して、第1の実施の形態では、2つのレジスタだけで、ソフトウェアパイプラインを適用することができる。
このような第1の実施の形態におけるレジスタ数の削減効果は、SIMD拡張レジスタのような大きなデータを格納できるレジスタを有効利用することで実現されている。すなわち、SIMD拡張レジスタは、SIMD拡張命令を格納できるだけの記憶領域を有している。SIMD拡張命令は、処理対象のデータを複数含むため、通常の命令よりもデータ量が多い。そのためSIMD拡張レジスタは、例えばロード命令でロードするデータのデータ長の数倍(図1の例では4倍)の記憶領域を有する。ただし多くのプロセッサでは、SIMD拡張レジスタの先頭以外の記憶領域のみを指定したデータのロードや参照はできない。そこで、第1の実施の形態では、例えばSIMD拡張レジスタのような大きな記憶領域を有する第2のレジスタ3の右に第1のレジスタ2を結合し、シフト命令によって、第1のレジスタ2内のデータを、第2のレジスタ3内の所定の場所に保持させる。これにより、SIMD拡張レジスタのような大きな記憶容量のレジスタが有効に利用され、ソフトウェアパイプライン適用時に使用するレジスタ数が削減される。その結果、レジスタ不足となることが抑制され、ソフトウェアパイプラインにより効率的な処理を実行できる可能性が高くなる。
しかも、第1の実施の形態では、store(退避)とload(復元)との2つの命令に相当する処理が、1つのシフト命令(ecsl)で実現されている。これは、以下の2つの特徴を活用したものである。
第1の特徴は、シフト命令(ecsl)は、データを、上位要素(右側の記憶領域)から順次下位要素(左側の記憶領域)にシフトする命令である、という点である。第2の特徴は、ソフトウェアパイプラインがループの繰り返しである、という点である。これらの特徴により、退避(最上位要素に入れる)と復元(最下位要素に入れる)とを同時に行うことが可能となる。また、SIMDレジスタ内の要素を示す要素番号を指定せずに済むため、命令そのものがループごとに変化することもなく、アンロールなどの命令複製をせずに済む。第1の実施の形態におけるこれらの利点は、レジスタの上位要素に空きがあった場合に、その上位要素を指定して退避・復元を実施したのでは得ることができない。
なお、図1に示したパイプライン化は、他のパイプライン化においてレジスタ不足となる場合にのみ適用することもできる。例えば演算部12は、ソフトウェアパイプラインをレジスタリネーミングで実現したときに、同時に保持するデータ数分のレジスタが確保できるか否かを判断する。そして演算部12は、レジスタが不足する場合に、図1に示したように、ロード命令におけるデータのロード先としての第1のレジスタの設定とシフト命令の挿入とを行い、ソフトウェアパイプライン化を実現する。これにより、他に処理効率が高いパイプライン化が可能な場合には、効率的な方のパイプライン化を適用することができる。
また第1の実施の形態に示すパイプライン化の処理は、例えばプログラム1のコンパイル時に実行することができる。コンパイル時のパイプライン化で生成される実行形式のファイルは、例えばSIMD拡張レジスタを有するプロセッサが搭載された計算機で実行できる。
なお、演算部12は、例えば計算機10が有するプロセッサにより実現することができる。また、記憶部11は、例えば計算機10が有するメモリにより実現することができる。
〔第2の実施の形態〕
次に第2の実施の形態について説明する。第2の実施の形態では、ソースファイルのコンパイル時に、ソフトウェアパイプラインによる最適化を実施する。また第2の実施の形態では、2つのSIMD拡張レジスタを結合して得られる記憶領域内のデータをシフトさせるSIMD拡張レジスタ結合シフト命令(以下、結合シフト命令と呼ぶ)を用いて、ソフトウェアパイプラインによる最適化を実現する。
図2は、第2の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。コンピュータ100は、プロセッサ101によって装置全体が制御されている。プロセッサ101には、バス109を介してメモリ102と複数の周辺機器が接続されている。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU(Central Processing Unit)、MPU(Micro Processing Unit)、またはDSP(Digital Signal Processor)である。プロセッサ101がプログラムを実行することで実現する機能の少なくとも一部を、ASIC(Application Specific Integrated Circuit)、PLD(Programmable Logic Device)などの電子回路で実現してもよい。
プロセッサ101は、SIMD拡張命令を有するISAをサポートしている。なおプロセッサ101は、命令パイプラインを有していてもよい。命令がプロセッサ上でパイプライン化されていると、ループボディの命令列を命令スケジューリングによってパイプライン化した結果として得られる解の範囲が広がる。その結果、命令レベル並列性が高い解を得ることができ、最適化の効果が非常に大きくなる。またプロセッサ101は、SIMD拡張レジスタ群101aを有している。SIMD拡張レジスタ群101aは、SIMD拡張命令を格納できるだけのデータ幅を有するレジスタの集合である。
メモリ102は、コンピュータ100の主記憶装置として使用される。メモリ102には、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ102には、プロセッサ101による処理に利用する各種データが格納される。メモリ102としては、例えばRAM(Random Access Memory)などの揮発性の半導体記憶装置が使用される。
バス109に接続されている周辺機器としては、HDD(Hard Disk Drive)103、グラフィック処理装置104、入力インタフェース105、光学ドライブ装置106、機器接続インタフェース107およびネットワークインタフェース108がある。
HDD103は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD103は、コンピュータ100の補助記憶装置として使用される。HDD103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、補助記憶装置としては、フラッシュメモリなどの不揮発性の半導体記憶装置(SSD:Solid State Drive)を使用することもできる。
グラフィック処理装置104には、モニタ21が接続されている。グラフィック処理装置104は、プロセッサ101からの命令に従って、画像をモニタ21の画面に表示させる。モニタ21としては、CRT(Cathode Ray Tube)を用いた表示装置や液晶表示装置などがある。
入力インタフェース105には、キーボード22とマウス23とが接続されている。入力インタフェース105は、キーボード22やマウス23から送られてくる信号をプロセッサ101に送信する。なお、マウス23は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ装置106は、レーザ光などを利用して、光ディスク24に記録されたデータの読み取りを行う。光ディスク24は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク24には、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。
機器接続インタフェース107は、コンピュータ100に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース107には、メモリ装置25やメモリリーダライタ26を接続することができる。メモリ装置25は、機器接続インタフェース107との通信機能を搭載した記録媒体である。メモリリーダライタ26は、メモリカード27へのデータの書き込み、またはメモリカード27からのデータの読み出しを行う装置である。メモリカード27は、カード型の記録媒体である。
ネットワークインタフェース108は、ネットワーク20に接続されている。ネットワークインタフェース108は、ネットワーク20を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
以上のようなハードウェア構成によって、第2の実施の形態の処理機能を実現することができる。なお、第1の実施の形態に示した計算機10も、図2に示したコンピュータ100と同様のハードウェアにより実現することができる。
コンピュータ100は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第2の実施の形態の処理機能を実現する。コンピュータ100に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、コンピュータ100に実行させるプログラムをHDD103に格納しておくことができる。プロセッサ101は、HDD103内のプログラムの少なくとも一部をメモリ102にロードし、プログラムを実行する。またコンピュータ100に実行させるプログラムを、光ディスク24、メモリ装置25、メモリカード27などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ101からの制御により、HDD103にインストールされた後、実行可能となる。またプロセッサ101が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
第2の実施の形態では、コンピュータ100がコンパイラを有し、コンパイラにより、プログラムのソースファイルをコンパイルする。その際、ループ処理については、ソフトウェアパイプラインを適用することができる。
図3は、ソフトウェアパイプラインの一例を示す図である。ソフトウェアパイプラインを行う前の入力ループ31では、イテレーションごとに、カーネル31a,31b,31cが順番に実行される。カーネル31a,31b,31cは、繰り返し実行される命令列である。入力ループ31は、レジスタ割り付けを行う前であり、各命令のオペランドには、割り付け前の疑似的なレジスタ(以下、疑似レジスタ)が設定される。
コンパイルの際には、ソフトウェアパイプラインによる命令スケジューリングが行われる。命令スケジューリングでは、演算器資源の競合を無くしパイプラインストールが生じないように、命令が並べ替えられる。このとき、各カーネル31a,31b,31cは、ステージと呼ばれるいくつかの命令列のまとまりへ分割される。
命令スケジューリングによる変形後の出力ループ32は、全ステージS1,S2,S3を重ね合わせた命令列が、ループカーネル32a,32b,32cとなる。各ステージS1,S2,S3はサイクル数が等しく、かつすべてのサイクルにおいて、各サイクルの時点におけるステージ間で資源の競合がない。例えばプロセッサ101に備わっているALU(Arithmetic and Logic Unit )が2つであるとき、ALUを要求する命令が、同じサイクルに3つ以上存在しない。
命令スケジューリングを行う際には、疑似レジスタの使用状況やライブレンジ、および演算器資源の競合を考慮して命令が配置される。
図4は、疑似レジスタの使用例を示す図である。SIMD拡張レジスタ群101aには、複数のレジスタR1,R2,R3,・・・が含まれる。レジスタR1,R2,R3,・・・は、浮動小数点レジスタであり、4−wideのSIMD拡張レジスタである。すなわちSIMD拡張レジスタは、プロセッサ101が取り扱う単位データのデータ幅の4倍の記憶領域を有している。
各レジスタR1,R2,R3,・・・は、記憶領域が4つの要素で構成される。各要素には、1〜4の要素番号が付与されている。SIMD拡張命令を記憶する場合、レジスタR1,R2,R3,・・・の4つの要素がすべて使用される。
第2の実施の形態におけるプロセッサのISAにおいて、スカラ命令では、要素番号「1」の要素のみが使用でき、拡張部分である要素番号「2」、「3」、「4」の要素を使用できない。すなわち、レジスタ割り付けとして扱えるのは、各レジスタの先頭の要素(要素番号「1」)のみであり、拡張部分の要素(要素番号「2」、「3」、「4」)への割り付けは行えない。そのため、各レジスタR1,R2,R3,・・・は、先頭の要素のみが使用され、それ以外の要素は使用されない場合がある。
図4では、レジスタR1,R2,R3,・・・内の使用されている要素を網掛けで示している。例えばレジスタR2は、要素番号「1」の要素は使用されているが、他の要素は使用されていない。すなわち、要素番号「2」、「3」、「4」の要素は空き領域である。
レジスタ割り当てで割り当て可能なすべての要素が割り当て済みとなれば、それ以上レジスタを割り当てることはできない。すなわち、SIMD拡張レジスタ群内に、空きの要素があっても割り付けられるレジスタが不足する場合がある。なお、スカラ命令で要素番号「2」の要素を使用できるISAもあるが、一般には、SIMD拡張レジスタのすべての要素を使用することはできない。
また、ソフトウェアパイプラインを適用すると、リネーミング対象となる疑似レジスタが生じる。
図5は、レジスタリネーミングの発生状況の一例を示す図である。例えば、スカラload命令で定義した疑似レジスタをスカラadd命令で参照するものとする。仮想的なマイクロアーキテクチャを想定し、図5のように命令がスケジューリングされたとする。3つのステージS1,S2,S3にスケジューリングできた場合、出力ループでは、ステージを重ねて新しいカーネルが生成される。このとき、最初のイテレーション(I=1)と次のイテレーション(I=2)とが同じ疑似レジスタを用いると、2回目のイテレーションのload命令が疑似レジスタを上書きしてしまう。そのため、偽の依存関係(Write After Read)ができてしまう。
Write After Readを解消しステージを重ね合わせるためには、レジスタリネーミングが行われる。一般には、ステージの数はいくらでもよく、何回転先の命令と重なるかもスケジューリングの結果次第である。レジスタリネーミングにより使用するレジスタの数は、MVE(Modulo Variable Expansion)数と呼ばれる。図5の例では、2個のレジスタを使用するため、MVE数=2である。最適化適用後のループは、レジスタリネーミングを実施しMVE数だけアンロール(ループを展開する処理)が行われる。
図6は、ループのイテレーションごとの疑似レジスタの割り当て例を示す図である。I=1のイテレーションのロード命令(load)では、SIMD拡張レジスタ41の最初の要素が、疑似レジスタ41aとして割り当てられている。I=2のイテレーションのロード命令では、SIMD拡張レジスタ42の最初の要素が、疑似レジスタ42aとして割り当てられている。I=1の回転で定義された疑似レジスタ41aとI=2のイテレーションのロード命令で定義された疑似レジスタ42aのライブレンジは、2サイクル重なっている。
このように、イテレーションごとに、個別のSIMD拡張レジスタ41,42の先頭の要素を疑似レジスタ41a,42aとして割り当てると、MVE数の分だけSIMD拡張レジスタが使用される。すなわち、図6に示すような疑似レジスタの割り当ては、MVE数分の空きSIMD拡張レジスタが存在する場合にのみ可能となる。
一方、SIMD拡張レジスタ41,42における要素番号「2」〜「4」の要素は、使用されていない。そこで、第2の実施の形態では、空きSIMD拡張レジスタが不足する場合、SIMD拡張レジスタ41,42における要素番号「2」〜「4」の要素を有効に利用して、ソフトウェアパイプラインの適用時に利用するSIMD拡張レジスタ数を削減する。
SIMD拡張レジスタの要素番号「2」〜「4」の要素を有効利用するために、結合シフト命令を用いることができる。なお、結合シフト命令の配置においても、他の命令をスケジュールする場合と同様に、演算器資源の競合、疑似レジスタのライブレンジ、およびレイテンシなどが考慮される。そして、各ステージの疑似的なレジスタがリネーミングされ、重ね合わせた新しいカーネルが生成される。
図7は、結合シフト命令によるデータシフトの一例を示す図である。結合シフト命令では、2つのSIMD拡張レジスタ43,44が、結合した1つのレジスタとして扱われる。そして結合シフト命令により、結合されたレジスタ内の要素ごとのデータが、左へシフトされる。シフト量は、即値(オペランドとして書き込まれた数値)で指定される。図7には、シフト量「2」の場合の例が示されている。
このような結合シフト命令を用いて、SIMD拡張レジスタ内の使われていない要素へ、データの格納および読み出しが可能となる。
図8は、結合シフト命令を用いた疑似レジスタ割り当ての例を示す図である。なお、図8の「ecsl」は、結合シフト命令を示す。
I=1のイテレーションでは、SIMD拡張レジスタ44の要素番号「1」の要素にデータ51がロードされる。そしてシフト量「2」の結合シフト命令により、ロードされたデータ51は、SIMD拡張レジスタ43の要素番号「3」の要素に転送される。
次に、I=2のイテレーションにおいて、SIMD拡張レジスタ44の要素番号「1」の要素にデータ52がロードされる。この時点では、I=1のイテレーションでロードされたデータ51は既に転送されており、そのデータ51が上書きされることはない。そしてシフト量「2」の結合シフト命令により、データ51がSIMD拡張レジスタ43の要素番号「1」の要素に転送され、データ52がSIMD拡張レジスタ43の要素番号「3」の要素に転送される。I=1のイテレーションでは、SIMD拡張レジスタ43の要素番号「1」の要素内のデータ51が、add命令により参照される。
これにより、SIMD拡張レジスタ43,44の要素番号「3」の要素が利用可能となり、レジスタプレッシャが減少する。
なお、結合シフト命令におけるシフト量は、命令挿入前における疑似レジスタのライブレンジの重なり(MVE数に相当)に依存する。例えばMVE数が2であり、SIMD拡張レジスタの幅が疑似レジスタの4倍であれば、図8に示すようにシフト量が「2」となる。MVE数が4であり、SIMD拡張レジスタの幅が疑似レジスタの4倍であれば、シフト量を「1」とすればよい。また図6に示すようなソフトウェアパイプラインにおけるMVE数分のアンロール処理は結合シフト命令によるシフトで実現でき、結合シフト命令を挿入した場合、別でアンロールをしなくてもよい。
次に、第2の実施の形態におけるソフトウェアパイプラインを用いたコンパイル処理について詳細に説明する。
図9は、コンパイラの機能を示すブロック図である。コンピュータ100に実行されるコンパイラ110は、例えばソースファイル61に高級言語で記述されたプログラムを、コンピュータ100が実行可能なコードに変換し、オブジェクトファイル62を生成する。
コンパイラ110は、プログラムの変換過程でループ処理の命令列をソフトウェアパイプラインにより最適化するパイプライン化部111を有する。パイプライン化部111は、ループ検出部111a、第1の最適化部111b、および第2の最適化部111cを有する。ループ検出部111aは、ソースファイル61に記述されたプログラム内のループ処理を示す命令列を検出する。第1の最適化部111bは、ループ処理を、例えば図6に示すように、結合シフト命令を使用せずに、ソフトウェアパイプラインで最適化する。
第2の最適化部111cは、ループ処理を、例えば図8に示すように、結合シフト命令を使用して、ソフトウェアパイプラインで最適化する。第2の最適化部111cは、例えば、第1の最適化部111bが生成した中間表現に対して、ISAやマイクロアーキテクチャの情報に基づいて、疑似レジスタのライブレンジの重なり、演算器資源の重なりを解析する。マイクロアーキテクチャは、プロセッサに実行させる機械語に関する実装レベルのアーキテクチャである。第2の最適化部111cは、解析結果に基づいて、SIMD拡張レジスタへの転送命令を挿入する。
なお、図9に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。また、図9に示した各要素の機能は、例えば、その要素に対応するプログラムモジュールをコンピュータに実行させることで実現することができる。
次に、ソフトウェアパイプライン化の処理手順について説明する。
図10は、ソフトウェアパイプライン化の処理手順の一例を示すフローチャートである。
[ステップS101]ループ検出部111aは、ソースファイル61をコンパイラが中間表現へと変換したプログラムから、ループ処理の命令列(入力ループ)を取得する。例えばfor文に対応する命令列などが取得される。
[ステップS102]第1の最適化部111bは、結合シフト命令を使用しないソフトウェアパイプライン化(第1のソフトウェアパイプライン化)により、ループ処理を最適化する。
[ステップS103]第2の最適化部111cは、最適化が成功し、かつレジスタが足りているか否かを判断する。例えば第2の最適化部111cは、使用する疑似レジスタの数に応じた、使用可能なSIMD拡張レジスタがある場合、レジスタが足りていると判断する。最適化が成功し、かつレジスタが足りている場合、処理がステップS104に進められる。また、最適化に失敗したか、または成功してもレジスタが不足している場合、処理がステップS105に進められる。
[ステップS104]第2の最適化部111cは、第1のソフトウェアパイプライン化適用後の命令列を出力し、処理を終了する。
[ステップS105]第2の最適化部111cは、入力ループにおけるループ処理で使用するSIMD拡張レジスタに、空き領域(使用されていない要素)があるか否かを判断する。空き領域があれば、処理がステップS106に進められる。空き領域がなければ、処理がステップS110に進められる。
[ステップS106]第2の最適化部111cは、入力ループの実行時に1つ以上の空きレジスタがあるか否かを判断する。1つ以上の空きレジスタがあれば、処理がステップS107に進められる。空きレジスタがなければ、処理がステップS110に進められる。
[ステップS107]第2の最適化部111cは、結合シフト命令を用いた第2のソフトウェアパイプライン化処理を行う。この処理の詳細は後述する(図11参照)。
[ステップS108]第2の最適化部111cは、第2のソフトウェアパイプライン化による最適化が成功し、かつレジスタが足りるか否かを判断する。最適化が成功し、かつレジスタが足りる場合、処理がステップS109に進められる。最適化に失敗したか、あるいはレジスタが不足する場合、処理がステップS110に進められる。
[ステップS109]第2の最適化部111cは、第2のソフトウェアパイプライン化適用後の命令列を出力し、処理を終了する。
[ステップS110]第2の最適化部111cは、ソフトウェアパイプライン化を断念し、入力ループをそのまま出力し、処理を終了する。
このように第1のソフトウェアパイプライン化を適用できない場合に、結合シフト命令を用いた第2のソフトウェアパイプライン化が実施される。
次に、第2のソフトウェアパイプライン化処理について詳細に説明する。
図11は、第2のソフトウェアパイプライン化の処理手順の一例を示すフローチャートである。
[ステップS121]第2の最適化部111cは、ステージ幅(サイクル数)に関する、ステップS122〜S128のループ(第1のループ)を実行する。第1のループでは、ステージ幅を、1サイクルから徐々に大きくする。ステージ幅が所定の上限に達するまで、ループが繰り返される。ステージ幅の上限は、翻訳時間の長さを考慮して、例えば100サイクル程度とする。
[ステップS122]第2の最適化部111cは、MVE数に関する、ステップS123〜S127のループ(第2のループ)を実行する。第2の最適化部111cは、第2のループにおいて、MVE数を1からSIMD幅(SIMD拡張レジスタの要素数)まで、徐々に大きくする。MVE数としては、SIMD幅を割り切れる数(約数)のみ取り得るものとする。SIMD幅が4であれば、MVE数として、1,2,4を取ることができる。これによりMVE数を、結合シフト命令のシフト量とすることができる。
[ステップS123]第2の最適化部111cは、命令選択に関する、ステップS124〜ステップS126のループ(第3のループ)を実行する。第2の最適化部111cは、第3のループにおいて、入力ループの命令を1つずつ選択する。
[ステップS124]第2の最適化部111cは、選択した命令の配置処理を行う。命令配置処理の詳細は後述する(図12参照)。命令の配置とは、図8に示すように、イテレーションごとに、各サイクルで実行する命令を並べる処理である。
[ステップS125]第2の最適化部111cは、選択した命令の配置が成功したか否かを判断する。配置が成功した場合、処理がステップS126に進められる。配置に失敗した場合、処理がステップS128に進められる。
[ステップS126]第2の最適化部111cは、入力ループ内のすべての命令を配置したか否かを判断する。すべての命令の配置が完了した場合、処理がステップS131に進められる。配置されていない命令がある場合、処理がステップS127に進められる。
[ステップS127]第2の最適化部111cは、現在処理中のステージ幅およびMVE数において、すべての命令が選択済みとなったら、処理をステップS128に進める。第2の最適化部111cは、未選択の命令がある場合は、未選択の命令の1つを選択して、ステップS124〜S126の処理を行う。
[ステップS128]第2の最適化部111cは、現在処理中のステージ幅およびMVE数において、入力ループ内のいずれかの命令の配置に失敗した場合、MVE数を増加させ、ステップS123〜S127の処理を行う。MVE数が取り得るすべての値について処理が完了している場合、処理がステップS129に進められる。
[ステップS129]第2の最適化部111cは、現在処理中のステージ幅において、入力ループ内のすべての命令を配置可能なMVE数が存在しない場合、ステージ幅を拡大し、ステップS122〜S128の処理を行う。すでにステージ幅の上限に達している場合、処理がステップS130に進められる。
[ステップS130]第2の最適化部111cは、ステージ幅を上限まで広げても、すべての命令の配置ができない場合、スケジューリング(最適化)に失敗したとの戻り値を設定して、第2のソフトウェアパイプライン化処理を終了する。
[ステップS131]第2の最適化部111cは、すべての命令を配置できた場合、レジスタリネーミング対象の命令があるか否かを判断する。レジスタリネーミング対象の命令がある場合、処理がステップS132に進められる。レジスタリネーミング対象の命令がなければ、処理がステップS133に進められる。
[ステップS132]第2の最適化部111cは、レジスタリネーミング対象の命令に対してレジスタリネーミングを実施すると共に、アンロールを実施する。
[ステップS133]第2の最適化部111cは、スケジューリング(最適化)が成功したとの戻り値を設定して、スケジューリングした命令列を出力する。その後、第2のソフトウェアパイプライン化処理が終了する。
次に、命令配置処理について詳細に説明する。
図12は、命令配置処理の手順の一例を示すフローチャートである。
[ステップS141]第2の最適化部111cは、選択した命令を配置可能な発行サイクルを走査する。例えば第2の最適化部111cは、選択した命令と、入力ループ内の他の命令との先後関係などに基づいて、選択した命令を配置可能な、該命令の発効サイクルを特定する。
[ステップS142]第2の最適化部111cは、配置可能な発行サイクル内での命令の配置場所に関する、ステップS143〜S149のループを実行する。命令配置場所に関するループでは、配置可能な場所のうち、他の命令が配置されていない場所が、順番に選択される。
[ステップS143]第2の最適化部111cは、他の命令と演算器の競合がないかを判断する。演算器は、加算器や乗算器などのALU、SIMD演算ユニット、メモリアクセス用ユニットなどがある。選択した命令を実行する演算器が、選択した場所と同じサイクルに配置された他の命令の実行に使用される場合、競合があると判断される。競合がある場合、処理がステップS150に進められる。競合がない場合、処理がステップS144に進められる。
[ステップS144]第2の最適化部111cは、データ依存関係が入力ループと同じか否かを判断する。例えば、第1の命令の実行の結果得られたデータを、第2の命令で参照する場合、第2の命令は、第1の命令に依存している。入力ループでこのような依存関係にある場合、スケジューリング後の命令配置において、第1の命令の実行完了後に第2の命令が実行される配置となっていれば、データ依存関係が同じと判断される。データ依存関係が同じ場合、処理がステップS145に進められる。データ依存関係が異なる場合、処理がステップS150に進められる。
[ステップS145]第2の最適化部111cは、選択した命令で定義されている疑似レジスタ(定義レジスタ)がリネーミング対象か否かを判断する。例えば選択した命令が、図5に示すように、他のイテレーションで使用している疑似レジスタに対してデータをロードする場合、ロード先として定義されている定義レジスタがリネーミング対象となる。リネーミング対象であれば、処理がステップS146に進められる。リネーミング対象でなければ、処理がステップS153に進められる。
[ステップS146]第2の最適化部111cは、選択した命令がスカラを定義する命令か否かを判断する。例えばSIMD拡張命令のように複数のデータに対して処理を行う命令ではなく、1つのデータに対して処理を行う命令の場合、スカラを定義する命令と判断される。スカラを定義する命令の場合、処理がステップS148に進められる。スカラを定義する命令ではない場合、処理がステップS147に進められる。
[ステップS147]第2の最適化部111cは、リネーミング用にMVE数−1個の空きレジスタがあるか否かを判断する。十分な空きレジスタがある場合、処理がステップS152に進められる。空きレジスタが不足している場合、処理がステップS150に進められる。
[ステップS148]第2の最適化部111cは、結合シフト用に1個の空きレジスタがあるか否かを判断する。結合シフト用の空きレジスタがあれば、処理がステップS149に進められる。空きレジスタがなければ、処理がステップS150に進められる。
[ステップS149]第2の最適化部111cは、命令のMVE数が、ステップS122に示す第2のループで選択したMVE数と同じか否かを判断する。MVE数が一致すれば、処理がステップS154に進められる。MVE数が一致しなければ、処理がステップS150に進められる。
[ステップS150]第2の最適化部111cは、配置可能なサイクル内のすべての場所についてステップS143〜S149の処理を実行しても、命令が配置できなければ、処理をステップS151に進める。未処理の場所があれば、未選択の場所のうちの1つを選択して、ステップS143〜S149の処理を実行する。
[ステップS151]第2の最適化部111cは、配置可能なサイクル内に、選択した命令を配置できる場所がないと判断し、命令配置に失敗したことを示す戻り値を設定して配置処理を終了する。
[ステップS152]第2の最適化部111cは、選択中の命令をリネーミング対象とする。
[ステップS153]第2の最適化部111cは、選択中の命令を、選択中の場所に配置する。その後、処理がステップS156に進められる。
[ステップS154]第2の最適化部111cは、結合シフト命令の挿入処理を行う。この処理の詳細は後述する(図13参照)。
[ステップS155]第2の最適化部111cは、選択した命令と結合シフト命令との配置に成功したか否かを判断する。配置に成功した場合、処理がステップS156に進められる。配置に失敗した場合、処理がステップS151に進められる。
[ステップS156]第2の最適化部111cは、命令の配置に成功したことを示す戻り値を設定して、配置処理を終了する。
次に、結合シフト命令挿入処理について詳細に説明する。
図13は、結合シフト命令挿入処理の手順の一例を示すフローチャートである。
[ステップS161]第2の最適化部111cは、配置対象の命令に定義されている定義レジスタを、一時レジスタへの定義に変更して配置する。一時レジスタは、ロードデータを一時的に格納する疑似レジスタである。
[ステップS162]第2の最適化部111cは、一時レジスタの最初の要素を、元の定義レジスタの最後の要素に移す結合シフト命令を生成する。
[ステップS163]第2の最適化部111cは、結合シフト命令の配置に関する、ステップS164〜S165のループを実行する。このループでは、結合シフト命令を配置可能な場所が順番に選択される。
[ステップS164]第2の最適化部111cは、選択した場所に結合シフト命令を配置した場合に、他の命令との演算器の競合がないか判断する。競合がない場合、処理がステップS165に進められる。競合が発生する場合、処理がステップS166に進められる。
[ステップS165]第2の最適化部111cは、データ依存関係が入力ループと同じとなるか否かを判断する。データ依存関係が同じとなれば、処理がステップS168に進められる。データ依存関係が異なる場合、処理がステップS166に進められる。
[ステップS166]第2の最適化部111cは、すべての場所についてステップS164〜S165の処理を実行しても、結合シフト命令が配置できなければ、処理をステップS167に進める。未処理の場所があれば、未選択の場所のうちの1つを選択して、ステップS164〜S165の処理を実行する。
[ステップS167]第2の最適化部111cは、結合シフト命令の挿入に失敗したとの戻り値を設定して、結合シフト命令挿入処理を終了する。
[ステップS168]第2の最適化部111cは、選択した場所に結合シフト命令を配置する。
[ステップS169]第2の最適化部111cは、結合シフト命令の挿入に成功したとの戻り値を設定して、結合シフト命令挿入処理を終了する。
このようにして、ソフトウェアパイプラインによる最適化が行われる。以下、具体的な最適化の例について説明する。
図14は、ソフトウェアパイプライン化対象のループ処理の例を示す図である。図14には、ソースファイルから抽出された入力ループ71を、ISAに従った命令列72に変換した例である。図14では、命令が疑似命令によって記述されている。なお、ソフトウェアパイプラインは、CPUのマイクロアーキテクチャに依存する。そのため、パイプライン化部111は、CPUの内部的なパイプライン構造、演算器資源情報を予め保持している。
変換後の命令列72の1行目「move r0, #0」は、sumに相当する、総和演算結果を保持する変数を格納するレジスタ「r0」を、0で初期化する命令である。2行目「addr r2, a」は、配列aの先頭アドレスを取得し、レジスタ「r2」に格納する命令である。3行目「add r3, a, 400」は、indexの終値を表す配列のアドレスを計算し、レジスタ「r3」に格納する命令である。
ループ内の1行目「load r4, [r2]」は、レジスタ「r2」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値をレジスタ「r4」に格納する命令である。2行目「add r0, r4」は、レジスタ「r4」の値とレジスタ「r0」の値との和を、レジスタ「r0」に格納する命令である。3行目「add r2, 4」は、レジスタ「r2」に設定されている配列のアドレスを「4」だけ進める命令である。4行目「brne LOOP, r2, r3」は、レジスタ「r2」の値とレジスタ「r3」の値とが一致するまでループを繰り返すことを示す命令である。
このようなループ処理に対して、まず、結合シフト命令を用いずにソフトウェアパイプライン化を行った場合について説明する。
図15は、第1のソフトウェアパイプライン化後の命令列を示す図である。結合シフト命令を用いないソフトウェアパイプラインにより最適化を行うと、図15に示すような命令列73が出力される。
1行目から2行目は、図14の命令列72と同じである。3行目「add r3', a, 396」は、indexの終値を表す配列のアドレスを計算し、レジスタ「r3’」に格納する命令である。なお、ループを変形するため、indexの終値が、図14に示した命令列72の4行目の命令と異なっている。
最適化の前処理の命令「load r4', [r2]」は、レジスタ「r4」からレジスタ「r4’」へのレジスタリネーミングにより生成された命令である。この命令では、レジスタ「r2」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値がレジスタ「r4’」に格納される。
ループ内の1行目「add r2, 4」は、レジスタ「r2」に設定されている配列のアドレスを「4」だけ進める命令である。2行目「load r4, [r2]」は、レジスタ「r2」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値をレジスタ「r4」に格納する命令である。3行目「add r0, r4'」は、レジスタ「r4’」の値とレジスタ「r0」の値との和を、レジスタ「r0」に格納する命令である。4行目「add r2, 4」は、レジスタ「r2」に設定されている配列のアドレスを「4」だけ進める命令である。5行目「load r4', [r2]」は、レジスタ「r2」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値をレジスタ「r4’」に格納する命令である。6行目「add r0, r4」は、レジスタ「r4」の値とレジスタ「r0」の値との和を、レジスタ「r0」に格納する命令である。7行目「brne LOOP, r2, r3'」は、レジスタ「r2」の値とレジスタ「r3’」の値とが一致するまでループを繰り返すことを示す命令である。
最適化の後処理の3行の命令は、それぞれループ処理の1行目から3行目までの処理と同じである。
このような命令列73により、ループ処理内では、MVEと呼ばれるアンロールが行われる。そのため、入力ループ2回転分が、最適化後の1ループとなっている。ループ内の2行目の命令において、レジスタ「r4」とレジスタ「r4’」とが併存することとなっている。つまり、リネーミングなしでは、レジスタ「r4’」の値を保持できない。
このような第1のソフトウェアパイプライン化のための命令スケジューリングにより、前のイテレーションの最中に、次のイテレーションのデータのロードを実行することが可能となっている。
次に、結合シフト命令を用いてソフトウェアパイプライン化の具体例について説明する。
図16は、第2のソフトウェアパイプライン化後の命令列を示す図である。結合シフト命令を用いたソフトウェアパイプラインにより最適化を行うと、図16に示すような命令列74が出力される。
1行目から2行目は、図14の命令列72と同じである。3行目「add r3', a, 400」は、indexの終値を表す配列のアドレスを計算し、レジスタ「r3’」に格納する命令である。
最適化の前処理の1行目「load rtmp, [r2]」は、レジスタ「r2」に示されるアドレスに対応する領域からデータをロードし、ロードしたデータの値をレジスタ「rtmp」の先頭の要素に格納する命令である。2行目「ecsl r4, rtmp, 2」は、レジスタ「r4」の後ろにレジスタ「rtmp」を結合し、2要素分左にシフトする結合シフト命令である。3行目の命令「add r2, 4」は、レジスタ「r2」に設定されている配列のアドレスを「4」だけ進める命令である。レジスタ「r4」の先頭の要素には、まだデータがないため、次の結合シフト命令前に「add r0, r4」のような命令は行われず、4行目と5行目において、1行目および2行目と同じ命令が実行される。4行目の命令により、レジスタ「rtmp」の先頭の要素に、次のデータが格納される。5行目の命令により、1行目の命令で読み込まれたデータは、レジスタ「r4」の先頭の要素に移動する。
ループ内の1行目は、「add r0, r4」は、レジスタ「r4」の値とレジスタ「r0」の値との和を、レジスタ「r0」に格納する命令である。2行目の命令「add r2, 4」は、レジスタ「r2」に設定されている配列のアドレスを「4」だけ進める命令である。3行目と4行目の命令は、最適化の前処理の1行目と2行目の命令と同じである。5行目の命令「brne LOOP, r2, r3'」は、レジスタ「r2」の値とレジスタ「r3’」の値とが一致するまでループを繰り返すことを示す命令である。
最適化の後処理の1行目と2行目の命令は、ループ内の1行目と2行目の命令と同じである。ここで、最終のイテレーションでロードした値は、レジスタ「r4」の要素番号「3」の要素にある。そのため、ループ内の3行目に示したようなロード命令は行わずに、3行目の結合シフト命令が実行される。3行目「ecsl r4, r4, 2」は、レジスタ「r4」の後ろにレジスタ「r4」を結合し、2要素分左にシフトする結合シフト命令である。4行目「add r0, r4」は、レジスタ「r4」の値とレジスタ「r0」の値との和を、レジスタ「r0」に格納する命令である。
このような最適化により、リネーミングやMVEによるアンロールを行わずにすむようになる。そして、レジスタプレッシャを低減することができる。オブジェクトサイズが縮小される可能性もある。
なお図14〜図16に示したのは、MVE数=2の例である。第2のソフトウェアパイプライン化では、レジスタリネーミングを行わない代わりに、一時レジスタ「rtmp」を使用するため、MVE数=2の場合には使用するレジスタ数に変わりはない。MVE数=4の場合には、使用するレジスタ数が減少する。
図17は、MVE数=4となる場合の例を示す図である。図17に示すように、第1ステージ(S1)でロードした値を、第4ステージ(S4)のaddで利用する場合、MVE数=4となる。
MVE数=4の場合、入力ループで定義されたレジスタ「r4」のリネーミングとして、レジスタのライブレンジが4回転分重なる。そのため、第1のソフトウェアパイプライン化ではレジスタ「r4’」、「r4’’」、「r4’’’」が用いられる。それに対して、第2のソフトウェアパイプライン化では、一時レジスタ「rtmp」を用いるだけで、パイプラインによる最適化を実現できる。したがって、使用するレジスタは、一時レジスタ用に一つ増えるが、リネーミング用の3つのレジスタを削減できる。
図18は、MVE数=4の場合の第2のソフトウェアパイプライン化後の命令列を示す図である。MVE数=4の場合に結合シフト命令を用いたソフトウェアパイプラインにより最適化を行うと、図18に示すような命令列75が出力される。1行目から3行目は、図16に示した命令列74の1行目から3行目と同じである。また最適化の前処理の1行目も、図16に示す命令列74の最適化の前処理の1行目と同じである。
最適化の前処理の2行目「ecsl r4, rtmp, 1」は、レジスタ「r4」の後ろにレジスタ「rtmp」を結合し、1要素分左にシフトする結合シフト命令である。このように、MVE数=4の場合、シフト量が「1」となる。これにより、レジスタ「rtmp」にロードされた値は、4回の結合シフト命令によって、レジスタ「r4」の先頭の要素に移動する。3行目の命令「add r2, 4」は、レジスタ「r2」に設定されている配列のアドレスを「4」だけ進める命令である。4行目と5行目は、最適化の前処理の1行目および2行目と同じである。その後、3行目から5行目と同じ命令が、2回繰り返される。
最適化の前処理が終了した時点で、レジスタ「r4」の要素番号「1」〜「4」の各要素には、4回のロード命令それぞれで読み出されたデータが格納されている。
ループ内の命令は、結合シフト命令のシフト量が「1」であることを除き、図16に示す命令列のループ内の命令と同じである。
最適化の後処理の1行目と2行目は、図16に示す命令列74の最適化後の後処理の1行目および2行目と同じである。3行目「ecsl r4, rtmp, 1」は、レジスタ「r4」の後ろにレジスタ「rtmp」を結合し、1要素分左にシフトする結合シフト命令である。4行目「add r0, r4」は、レジスタ「r4」の値とレジスタ「r0」の値との和を、レジスタ「r0」に格納する命令である。その後、2行目から4行目と同じ命令が、2回繰り返される。
このようにMVE数=4の場合でも、入力ループで定義されているレジスタに加え、1つの一時レジスタ「rtmp」を使用すれば、ソフトウェアパイプライン化が可能となる。その結果、ソフトウェアパイプラインの適用による最適化で使用するレジスタ数を抑制することができる。
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の2以上の構成(特徴)を組み合わせたものであってもよい。
1 プログラム
2 第1のレジスタ
3 第2のレジスタ
4〜7 データ
10 計算機
11 記憶部
12 演算部

Claims (7)

  1. 複数の命令を繰り返すループ処理の記述を含むプログラムを記憶する記憶部と、
    前記ループ処理がソフトウェアパイプラインによりパイプライン化されるように、前記プログラムにおける前記複数の命令の実行順を並べ替え、SIMD(Single Instruction Multiple Data)拡張命令用のレジスタを用いる命令を、前記プログラムにおける前記ループ処理の記述中に挿入する演算部と、
    を有する計算機。
  2. 前記演算部は、
    さらに、前記複数の命令内のロード命令におけるデータのロード先として第1のレジスタを設定し、
    前記命令の挿入では、SIMD拡張用の第2のレジスタの右に前記第1のレジスタを結合させて得られる記憶領域内のデータ列を左にシフトさせるシフト命令を挿入する、
    ことを特徴とする請求項1記載の計算機。
  3. 前記演算部は、パイプライン化により同時に保持するデータ数がN(Nは、2以上の整数)の場合、前記第1のレジスタにロードしたデータがN回のシフトで前記第2のレジスタの先頭に移動するように、前記シフト命令の1回当たりのシフト量を設定する、
    ことを特徴とする請求項2記載の計算機。
  4. 前記演算部は、前記ソフトウェアパイプラインをレジスタリネーミングで実現したときに、同時に保持するデータ数分のレジスタが確保できるか否かを判断し、レジスタが不足する場合に、前記ロード命令におけるデータのロード先としての前記第1のレジスタの設定と前記シフト命令の挿入とを行う、
    ことを特徴とする請求項2または3記載の計算機。
  5. コンピュータが、
    複数の命令を繰り返すループ処理の記述を含むプログラムに示される前記ループ処理が、ソフトウェアパイプラインによりパイプライン化されるように、前記プログラムにおける前記複数の命令の実行順を並べ替え、
    SIMD拡張命令用のレジスタを用いる命令を、前記プログラムにおける前記ループ処理の記述中に挿入する、
    コンパイル方法。
  6. コンピュータに、
    複数の命令を繰り返すループ処理の記述を含むプログラムに示される前記ループ処理が、ソフトウェアパイプラインによりパイプライン化されるように、前記プログラムにおける前記複数の命令の実行順を並べ替え、
    SIMD拡張命令用のレジスタを用いる命令を、前記プログラムにおける前記ループ処理の記述中に挿入する、
    処理を実行させるコンパイルプログラム。
  7. 複数の命令を繰り返すループ処理を、コンピュータに、ソフトウェアパイプラインによりパイプライン化して実行させるパイプライン処理プログラムであって、
    前記コンピュータに、
    パイプライン化された前記ループ処理の繰り返しごとに、SIMD拡張命令用のレジスタを用いて、ロードしたデータを参照する、
    処理を実行させるパイプライン処理プログラム。
JP2015094547A 2015-05-07 2015-05-07 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム Active JP6492943B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2015094547A JP6492943B2 (ja) 2015-05-07 2015-05-07 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム
US15/132,815 US9841957B2 (en) 2015-05-07 2016-04-19 Apparatus and method for handling registers in pipeline processing

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015094547A JP6492943B2 (ja) 2015-05-07 2015-05-07 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム

Publications (2)

Publication Number Publication Date
JP2016212573A true JP2016212573A (ja) 2016-12-15
JP6492943B2 JP6492943B2 (ja) 2019-04-03

Family

ID=57240748

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015094547A Active JP6492943B2 (ja) 2015-05-07 2015-05-07 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム

Country Status (2)

Country Link
US (1) US9841957B2 (ja)
JP (1) JP6492943B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11693638B2 (en) 2020-06-09 2023-07-04 Fujitsu Limited Compiler program, compiling method, information processing device

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105183433B (zh) * 2015-08-24 2018-02-06 上海兆芯集成电路有限公司 指令合并方法以及具有多数据通道的装置
US10915320B2 (en) * 2018-12-21 2021-02-09 Intel Corporation Shift-folding for efficient load coalescing in a binary translation based processor
US11366646B2 (en) * 2020-01-23 2022-06-21 Huawei Technologies Co., Ltd. Method and apparatus for predicting and scheduling copy instruction for software pipelined loops
EP4050481A1 (en) * 2021-02-25 2022-08-31 Imagination Technologies Limited Allocation of resources to tasks

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003241960A (ja) * 2002-02-15 2003-08-29 Hitachi Ltd プロセッサ、該プロセッサにおける演算命令処理方法及び演算制御方法
US20070174825A1 (en) * 2006-01-25 2007-07-26 Eichenberger Alexandre E Apparatus and method for optimizing scalar code executed on a SIMD engine by alignment of SIMD slots
JP2008009957A (ja) * 2006-06-28 2008-01-17 Toshiba Corp コンパイル装置
US20090113168A1 (en) * 2007-10-24 2009-04-30 Ayal Zaks Software Pipelining Using One or More Vector Registers

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6629115B1 (en) 1999-10-01 2003-09-30 Hitachi, Ltd. Method and apparatus for manipulating vectored data
JP3857614B2 (ja) * 2002-06-03 2006-12-13 松下電器産業株式会社 プロセッサ
JP4487479B2 (ja) * 2002-11-12 2010-06-23 日本電気株式会社 Simd命令シーケンス生成方法および装置ならびにsimd命令シーケンス生成用プログラム
US7395531B2 (en) * 2004-06-07 2008-07-01 International Business Machines Corporation Framework for efficient code generation using loop peeling for SIMD loop code with multiple misaligned statements
US20060048123A1 (en) * 2004-08-30 2006-03-02 International Business Machines Corporation Modification of swing modulo scheduling to reduce register usage
US20080016320A1 (en) * 2006-06-27 2008-01-17 Amitabh Menon Vector Predicates for Sub-Word Parallel Operations
JP5659772B2 (ja) 2010-12-17 2015-01-28 富士通株式会社 演算処理装置
US20120254589A1 (en) 2011-04-01 2012-10-04 Jesus Corbal San Adrian System, apparatus, and method for aligning registers
CN104011649B (zh) * 2011-12-23 2018-10-09 英特尔公司 用于在simd/向量执行中传播有条件估算值的装置和方法
US8893104B2 (en) * 2012-01-26 2014-11-18 Qualcomm Incorporated Method and apparatus for register spill minimization
US8880829B2 (en) * 2012-11-19 2014-11-04 Qualcomm Innovation Center, Inc. Method and apparatus for efficient, low-latency, streaming memory copies
US9501276B2 (en) 2012-12-31 2016-11-22 Intel Corporation Instructions and logic to vectorize conditional loops
JP6201788B2 (ja) * 2014-01-29 2017-09-27 富士通株式会社 ループ分割検出プログラム及びループ分割検出方法
JP6245031B2 (ja) * 2014-03-27 2017-12-13 富士通株式会社 コンパイルプログラム、コンパイル方法およびコンパイル装置
JP6331865B2 (ja) * 2014-08-13 2018-05-30 富士通株式会社 プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003241960A (ja) * 2002-02-15 2003-08-29 Hitachi Ltd プロセッサ、該プロセッサにおける演算命令処理方法及び演算制御方法
US20070174825A1 (en) * 2006-01-25 2007-07-26 Eichenberger Alexandre E Apparatus and method for optimizing scalar code executed on a SIMD engine by alignment of SIMD slots
JP2008009957A (ja) * 2006-06-28 2008-01-17 Toshiba Corp コンパイル装置
US20090113168A1 (en) * 2007-10-24 2009-04-30 Ayal Zaks Software Pipelining Using One or More Vector Registers

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
村井 均、住元真司、瀧 康太郎、山中栄次: "特集 スーパーコンピュータ「京」 5.プログラミング環境−超大規模並列計算機の性能を活かすプログラミン", 情報処理, vol. 第53巻,第8号(通巻569号), JPN6018045946, 15 July 2012 (2012-07-15), JP, pages p.781 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11693638B2 (en) 2020-06-09 2023-07-04 Fujitsu Limited Compiler program, compiling method, information processing device

Also Published As

Publication number Publication date
US9841957B2 (en) 2017-12-12
US20160328236A1 (en) 2016-11-10
JP6492943B2 (ja) 2019-04-03

Similar Documents

Publication Publication Date Title
JP6492943B2 (ja) 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム
JP4339907B2 (ja) マルチプロセッサ向け最適コード生成方法及びコンパイル装置
JP5681473B2 (ja) プログラムの最適化装置、最適化方法および最適化プログラム
EP2951681B1 (en) Solution to divergent branches in a simd core using hardware pointers
US8776030B2 (en) Partitioning CUDA code for execution by a general purpose processor
US7631305B2 (en) Methods and products for processing loop nests
Kim et al. Efficient SIMD code generation for irregular kernels
Membarth et al. Generating device-specific GPU code for local operators in medical imaging
US20080109795A1 (en) C/c++ language extensions for general-purpose graphics processing unit
TWI806550B (zh) 處理器操作方法、相關電腦系統、及非暫時性電腦可存取儲存媒體
EP2951682B1 (en) Hardware and software solutions to divergent branches in a parallel pipeline
JP6245031B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
JP2017004281A (ja) コンパイルプログラム、およびコンパイル方法
KR101293701B1 (ko) 코어스 그레인드 재구성 어레이에서의 중첩 루프문 수행 장치 및 그 방법
EP2799986B1 (en) Apparatus and method for translating multithread program code
KR20150040662A (ko) 모듈로 스케줄링 방법, 모듈로 스케줄링 장치, 모듈로 스케줄링에 따라서 동작하는 재구성 가능한 프로세서 및 재구성 가능한 프로세서의 동작 방법
KR102161055B1 (ko) 소프트웨어 파이프라이닝을 이용한 명령어 스케줄링 방법 및 장치
Sakdhnagool et al. RegDem: Increasing GPU performance via shared memory register spilling
JP2018124877A (ja) コード生成装置、コード生成方法、およびコード生成プログラム
JP2022140995A (ja) 情報処理装置、コンパイルプログラムおよびコンパイル方法
Stratton et al. Optimizing Halide for Digital Signal Processors
JP4084374B2 (ja) ループ並列化方法及びコンパイル装置
US11762641B2 (en) Allocating variables to computer memory
Prajapati Scheduling and tiling reductions on realistic machines

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180206

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20181019

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20181127

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190123

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190218

R150 Certificate of patent or registration of utility model

Ref document number: 6492943

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150