JP7006097B2 - コード生成装置、コード生成方法及びコード生成プログラム - Google Patents

コード生成装置、コード生成方法及びコード生成プログラム Download PDF

Info

Publication number
JP7006097B2
JP7006097B2 JP2017191599A JP2017191599A JP7006097B2 JP 7006097 B2 JP7006097 B2 JP 7006097B2 JP 2017191599 A JP2017191599 A JP 2017191599A JP 2017191599 A JP2017191599 A JP 2017191599A JP 7006097 B2 JP7006097 B2 JP 7006097B2
Authority
JP
Japan
Prior art keywords
simd
instruction
loop
operands
stack
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
JP2017191599A
Other languages
English (en)
Other versions
JP2019067117A (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.)
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 JP2017191599A priority Critical patent/JP7006097B2/ja
Publication of JP2019067117A publication Critical patent/JP2019067117A/ja
Application granted granted Critical
Publication of JP7006097B2 publication Critical patent/JP7006097B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Description

本発明は、コード生成装置、コード生成方法及びコード生成プログラムに関する。
コンパイラが行う最適化の一つにループのSIMD(Single Instruction Multiple Data)化がある。ここで、SIMD化とは、1つの命令で複数のデータを並列に演算するSIMD命令を用いて複数の命令を当該複数の命令に対応する1つのSIMD命令に変換することにより、プログラムを高速化することである。
ソースコードに含まれるループに条件分岐がない場合には、ループのSIMD化はSIMD命令を用いて行うことができる。一方、ループに条件分岐がある場合には、SIMD化のためにマスク付きSIMD命令が用いられる。ここで、マスク付きSIMD命令とは、本来は実行する必要のない演算の実行結果を演算後にメモリ又はレジスタに書き戻さないことで条件分岐をなくすことができるSIMD命令である。
なお、SIMD化を用いて有効なプログラム最適化を行う方法がある。この方法は、最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し、プロファイル情報に基づいて演算待ち時間を算出する。そして、この方法は、演算待ち時間が第1の閾値より長い場合、オリジナルプログラムのループ内のSIMD命令率が第2の閾値より低い場合に、ループ内のIF文の命令をSIMD化するSIMD化制御行をオリジナルプログラムのループに挿入する。
また、条件付きループをベクトル化する命令を有するプロセッサがある。この命令は、n個の連続したベクトルエレメントを保持するために、ソースベクトルを特定するパラメータ、条件付きマスクレジスタを特定するパラメータ、及び、デスティネーションレジスタを特定するためのデスティネーションパラメータを有する。複数のn個の連続したベクトルエレメントのそれぞれは、mバイトの同じ可変パーティションサイズを有している。プロセッサ命令に呼応して、データがソースベクトルの連続したベクトルエレメントからコピーされ、特定されたデスティネーションベクトルのマスキングされていないベクトルエレメントにコピーされ、nは、実行されるプロセッサ命令に呼応して変化する。
特開2016-40691号公報 特開2014-130580号公報
マスク付きSIMD命令がないCPU(Central Processing Unit)については、条件分岐を含むループのSIMD化ができないという問題がある。また、マスク付きSIMD命令がある場合にも、whileループ等回転数が実行するまで不明であるループをSIMD化することはできない。また、マスク付きSIMD化命令の実行効率はよくない。
本発明は、1つの側面では、マスク付きSIMD命令がないCPUについても条件分岐を含むループをSIMD化することを目的とする。
1つの態様では、コード生成装置は、ソースコードの構文解析に基づいてループを特定する構文解析部と、第1命令変更部とを有する。第1命令変更部は、構文解析部が特定したループに含まれる条件分岐文内で実行される演算のオペランドを該演算に対応する命令のアドレス毎に用意したスタックに積む命令列を生成する第1push命令生成部を有する。また、第1命令変更部は、演算を行うSIMD命令が1度に演算する個数のオペランドがスタックに積まれているか否かをチェックする命令列を生成する第1チェック命令生成部を有する。また、第1命令変更部は、スタックから該個数のオペランドを取り出す命令列を生成する第1pop命令生成部と、スタックから取り出された該個数のオペランドに対して演算を実行するSIMD命令を生成する第1SIMD命令生成部とを有する。
1つの側面では、本発明は、マスク付きSIMD命令がないCPUについても条件分岐を含むループをSIMD化することができる。
図1は、実施例に係るコード生成装置の機能構成を示す図である。 図2は、ループSIMD化部の機能構成を示す図である。 図3は、SIMD化可否判定部の機能構成を示す図である。 図4は、条件分岐SIMD化部の機能構成を示す図である。 図5は、不明ループSIMD化部の機能構成を示す図である。 図6は、ループSIMD化部による処理のフローを示すフローチャートである。 図7は、ループ中の条件分岐の内外で依存がある例を示す図である。 図8は、SIMD化可否判定部による処理のフローを示すフローチャートである。 図9は、条件分岐SIMD化部による処理のフローを示すフローチャートである。 図10は、余りループ生成部による処理のフローを示すフローチャートである。 図11は、不明ループSIMD化部による処理のフローを示すフローチャートである。 図12は、条件分岐を含むループ(2-SIMDの場合)の最適化例を示す図である。 図13は、条件分岐を含むループ(2-SIMDの場合)に関して実施例に係る最適化による効果を説明するための図である。 図14は、whileループ(2-SIMDの場合)に関して実施例に係る最適化による効果を説明するための図である。 図15は、条件分岐を含むループ(4-SIMDの場合)の最適化例を示す図である。 図16は、ベクトル長が異なる演算が混在している場合の最適化例を示す図である。 図17は、ストライドアクセスのループ(4-SIMDの場合)の最適化例を示す図である。 図18は、whileループ(4-SIMDの場合)の最適化例を示す図である。 図19は、飛び出しのあるループ(飛び出しの判定に演算で用いる変数が使われない場合)の最適化例を示す図である。 図20は、実施例に係るコード生成プログラムを実行するコンピュータのハードウェア構成を示す図である。
以下に、本願の開示するコード生成装置、コード生成方法及びコード生成プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
まず、実施例に係るコード生成装置の機能構成について説明する。図1は、実施例に係るコード生成装置の機能構成を示す図である。図1に示すように、コード生成装置1は、構文解析部11と、最適化部12と、コード生成部13とを有する。
構文解析部11は、ソースコード2をファイルから入力してソースコード2の構文解析を行う。構文解析部11は、構文解析を行うことでソースコード2に含まれるループを特定する。また、構文解析部11は、実行速度を向上するためのコードの最適化を指定する最適化オプション等のオプションを受け付ける。オプションは、例えば、コンパイル指示とともにキーボード又はマウスを用いてユーザにより入力される。
最適化部12は、最適化オプションが指定された場合に、コードの最適化を行う。コード生成部13は、最適化オプションが指定された場合には、最適化が行われたコードからオブジェクトコード3を生成し、ファイルに出力する。
最適化部12は、汎用最適化部20と、ループSIMD化部30と、固有最適化部40とを有する。汎用最適化部20は、コンパイル対象のCPUのアーキテクチャに関係しない汎用的な最適化を行う。ループSIMD化部30は、ソースコード2に含まれるループのSIMD化を行う。固有最適化部40は、コンパイル対象のCPUのアーキテクチャに依存する最適化を行う。
図2は、ループSIMD化部30の機能構成を示す図である。図2に示すように、ループSIMD化部30は、SIMD化可否判定部31とSIMD化ループ変換部32とを有する。
SIMD化可否判定部31は、SIMD化が可能か否かを判定する。SIMD化ループ変換部32は、コードをSIMD命令を用いるコードに変換する。SIMD化ループ変換部32は、条件分岐SIMD化部50と、不明ループSIMD化部60と、連続SIMD化部70と、余りループ生成部80とを有する。
条件分岐SIMD化部50は、条件分岐を含むループのSIMD化を行う。不明ループSIMD化部60は、whileループや飛び出しのあるループのようにループの終了が実行するまで不明なループのSIMD化を行う。連続SIMD化部70は、演算のオペランドが連続した領域であるループのSIMD化を行う。
余りループ生成部80は、ループの終了時にSIMD化するために必要な数に達していない余りのオペランドを処理するコードを生成する。余りループ生成部80は、方式選択部81と、スカラループ生成部82と、NULLオペランド生成部83と、SIMD命令生成部84とを有する。
方式選択部81は、余りのオペランドを処理する方式を選択するコードを生成する。余りのオペランドを処理する方式には、スカラループにより処理する方式とSIMD化に必要なオペランド数になるようにNULLオペランドを生成しSIMD化する方式がある。方式選択部81は、余りのオペランドの数に基づいて、いずれの方式の実行性能が高いかを判定し、実行性能が高い方の方式を選択する。
スカラループ生成部82は、余りのオペランドをスカラループにより処理するコードを生成する。NULLオペランド生成部83は、SIMD化に必要なオペランド数になるようにNULLオペランドを生成するコードを生成する。SIMD命令生成部84は、NULLオペランドを含むSIMD命令を生成する。
図3は、SIMD化可否判定部31の機能構成を示す図である。図3に示すように、SIMD化可否判定部31は、依存解析チェック部36と、連続性チェック部37と、命令有無チェック部38とを有する。
依存解析チェック部36は、演算を並列実行すると引用すべきデータを引用する前に新たな値で上書きしてしまうか否かをを判定し、誤って上書きしてしまう可能性がある場合には、SIMD化が可能でないと判定し、正しく引用できる場合には、SIMD化が可能であると判定する。
連続性チェック部37は、ループ内にある演算のオペランドの領域へのアクセスが、一定方向であるか否かを判定し、一定方向でない場合には、SIMD化が可能でないと判定し、一定方向である場合には、SIMD化が可能であると判定する。連続性チェック部37は、飛び込みチェック部39を有する。飛び込みチェック部39は、ループ外からループ内への飛び込みの有無をチェックし、ループ外からループ内への飛び込みがある場合には、ループ内の演算のオペランドの領域へのアクセスが一定方向でないと判定する。
命令有無チェック部38は、ループ内の演算を行うSIMD命令があるか否かを判定し、ない場合には、SIMD化が可能でないと判定し、ある場合には、SIMD化が可能であると判定する。
図4は、条件分岐SIMD化部50の機能構成を示す図である。図4に示すように、条件分岐SIMD化部50は、push命令生成部51と、チェック命令生成部52と、pop命令生成部53と、SIMD命令生成部54とを有する。
push命令生成部51は、条件分岐文内で実行される演算のオペランドを演算命令のアドレス毎に用意したオペランドスタックに積む命令列を生成する。ここで、条件分岐文内とは、条件分岐文の中である。例えば、条件分岐文の1つであるIF文において、IF 条件 THEN A ELSE B;の場合、A及びBが条件分岐文内で実行される演算である。なお、命令列には、命令が1つの場合も含まれる。チェック命令生成部52は、SIMD命令が処理する数のオペランドがオペランドスタックに積まれているかをチェックする命令列を生成する。
pop命令生成部53は、SIMD命令が処理するオペランドをオペランドスタックから取り出す命令列を生成する。SIMD命令生成部54は、オペランドスタックから取り出されたオペランドを用いて演算を行うSIMD命令を生成する。
図5は、不明ループSIMD化部60の機能構成を示す図である。図5に示すように、不明ループSIMD化部60は、push命令生成部61と、チェック命令生成部62と、pop命令生成部63と、SIMD命令生成部64とを有する。
push命令生成部61は、ループ内で実行される演算のオペランドを演算命令のアドレス毎に用意したオペランドスタックに積む命令列を生成する。push命令生成部51が条件分岐文内で実行される演算のオペランドをオペランドスタックに積む命令列を生成するのとは異なり、push命令生成部61はループ内で実行される演算のオペランドをオペランドスタックに積む命令列を生成する。
チェック命令生成部62は、SIMD命令が処理する数のオペランドがオペランドスタックに積まれているかをチェックする命令列を生成する。pop命令生成部63は、SIMD命令が処理するオペランドをオペランドスタックから取り出す命令列を生成する。SIMD命令生成部64は、オペランドスタックから取り出されたオペランドを用いて演算を行うSIMD命令を生成する。
次に、ループSIMD化部30による処理のフローについて図6~図11を用いて説明する。図6は、ループSIMD化部30による処理のフローを示すフローチャートである。図6に示すように、ループSIMD化部30は、Curr_loopをソースコード2の任意のループとし(ステップS1)、Curr_loopをまだチェックしていないループに変更しながら、ステップS2~ステップS9の処理を繰り返し行う。
すなわち、ループSIMD化部30は、Curr_loopのSIMD化が可能か否かを判定し(ステップS2)、SIMD化が可能である場合には、ループ中に条件分岐があるか否かを判定する(ステップS3)。
そして、ループSIMD化部30は、ループ中に条件分岐がない場合には、ループ中の回転数をループより前に計算できるか否かを判定し(ステップS4)、計算できる場合には、連続領域にアクセスするループをSIMD化する(ステップS5)。一方、ループ中の回転数をループより前に計算できない場合には、ループSIMD化部30は、ループの終了が実行するまで不明なループをSIMD化する(ステップS6)。そして、ループSIMD化部30は、次のループを処理する。
また、ステップS3において、ループ中に条件分岐がある場合には、ループSIMD化部30は、ループ中の条件分岐文の内外で依存があるか否かを判定する(ステップS7)。図7は、ループ中の条件分岐文の内外で依存がある例を示す図である。図7に示すように、ループ中で定義されたaa[i]をif文の条件式に用いる場合は、ループのイテレーション毎に演算結果が必要となり、ループ中の条件分岐文の内外で依存がある。図7では、「(aa[i]==0.0) break;」が条件分岐文の内であり、「aa[i]=sqrt(bb[i]);」、「i=i+1;」等が条件分岐文の外である。
ループSIMD化部30は、ループ中の条件分岐文の内外で依存がない場合には、条件分岐を含むループをSIMD化し(ステップS8)、ループ中の条件分岐文の内外で依存がある場合には、ループをSIMD化しない(ステップS9)。そして、ループSIMD化部30は、次のループを処理する。また、ステップS2において、SIMD化可否判定部31がSIMD化が可能でないと判定した場合には、ループSIMD化部30は、ステップS9へ移動する。
このように、ループSIMD化部30は、条件分岐を含むループ及びループの終了が実行するまで不明なループをSIMD化するので、従来より多くのループをSIMD化することができる。
図8は、SIMD化可否判定部31による処理のフローを示すフローチャートである。図8に示すように、SIMD化可否判定部31は、ループの処理を並列実行した場合に引用すべきデータを引用する前に新たな値で上書きしてしまう否かを判定し(ステップS11)、変わらない場合には、ループへの飛び込みがあるか否かを判定する(ステップS12)。
そして、ループへの飛び込みがない場合には、SIMD化可否判定部31は、回転数は少ないか否か又は回転数は少ないと推測できるか否かを判定する(ステップS13)。ここで、回転数が少ないとは、例えば回転数が所定の閾値以下である場合である。また、回転数が少ないと推測できるとは、例えば、過去の実行結果において回転数が所定の閾値以下である率が80%以上である場合である。
そして、回転数は少なくない場合又は回転数は少ないと推測できない場合には、SIMD化可否判定部31は、対応するSIMD命令があるか否かを判定する(ステップS14)。そして、SIMD化可否判定部31は、対応するSIMD命令がない場合には、SIMD化不可と判定し(ステップS15)、対応するSIMD命令がある場合には、SIMD化可能と判定する(ステップS16)。
また、ステップS13において回転数は少ない場合又は回転数は少ないと推測できる場合、又は、ステップS12においてループへの飛び込みがある場合には、SIMD化可否判定部31は、SIMD化不可と判定する(ステップS15)。あるいは、ステップS11においてループの処理が回転数に依存する場合には、SIMD化可否判定部31は、SIMD化不可と判定する(ステップS15)。
このように、SIMD化可否判定部31がSIMD化が可能か否かを判定することによって、ループSIMD化部30は、SIMD化の対象であるループを特定することができる。
図9は、条件分岐SIMD化部50による処理のフローを示すフローチャートである。図9に示すように、条件分岐SIMD化部50は、条件分岐時に実行される演算のオペランドを演算のアドレス毎に用意したオペランドスタックに積む命令列を生成する(ステップS21)。
そして、条件分岐SIMD化部50は、SIMD命令が1度に扱える分のオペランドがオペランドスタックに溜まったかをチェックする命令列を生成する(ステップS22)。そして、条件分岐SIMD化部50は、SIMD命令が1度に扱える分のオペランドがオペランドスタックに溜まった場合にオペランドをオペランドスタックから取り出す命令列を生成する(ステップS23)。
そして、条件分岐SIMD化部50は、オペランドがオペランドスタックから取り出された場合にSIMD命令を実行する命令列を生成する(ステップS24)。そして、条件分岐SIMD化部50は、ループ終了後にオペランドスタックにオペランドが残るか否かを判定する(ステップS25)。
そして、条件分岐SIMD化部50は、ループ終了後にオペランドスタックにオペランドが残る場合に、余りループ生成部80にオペランドスタックのオペランドを処理する命令列を生成させる余り処理を行う(ステップS26)。
このように、条件分岐SIMD化部50が条件分岐を含むループをオペランドスタックを用いてSIMD化するので、ループSIMD化部30は、マスク付きSIMD命令がない場合にも条件分岐を含むループをSIMD化することができる。
図10は、余りループ生成部80による処理のフローを示すフローチャートである。図10に示すように、余りループ生成部80は、SIMD化対象の演算の中にオペランドをNULLにすると例外を上げるものがあるか否かを判定する(ステップS31)。
そして、例外を上げるものがない場合には、余りループ生成部80は、SIMD化しきれなかったオペランドを演算するために、次のいずれかのループを実行するように1つの条件分岐の命令列と、2種類のループの命令列を生成する(ステップS32)。
条件分岐の命令列としては、余りループ生成部80は、まず、オペランドスタックに残っているオペランドの数と演算種別から、NULLオペランドを補ってSIMD化したほうが実行性能面で得するか否かを判断する命令列を生成する。そして、余りループ生成部80は、SIMD化したほうが得する場合には、“余りループA”を実行する命令列を生成し、SIMD化しても得しない場合には、“余りループB”を実行する命令列を生成する。
そして、余りループ生成部80は、“余りループA”の命令列として、SIMD演算ユニットを全て満たすように、NULLオペランドを追加したSIMD命令を生成する。そして、余りループ生成部80は、“余りループB”の命令列として、SIMD化しきれなかったオペランドを演算するためのスカラループの命令列を生成する。
一方、SIMD化対象の演算の中にオペランドをNULLにすると例外を上げるものがある場合には、SIMD化しきれなかったオペランドを演算するためのスカラループの命令列を生成する(ステップS33)。
このように、余りループ生成部80がオペランドスタックに残っているオペランドを演算する命令列を生成するので、ループSIMD化部30は、条件分岐中又はループ中で演算が実行される数によらずループをSIMD化することができる。
図11は、不明ループSIMD化部60による処理のフローを示すフローチャートである。図11に示すように、不明ループSIMD化部60は、ループで実行される演算のオペランドを演算のアドレス毎に用意したオペランドスタックに積む命令列を生成する(ステップS41)。
そして、不明ループSIMD化部60は、SIMD命令が1度に扱える分のオペランドがオペランドスタックに溜まったかをチェックする命令列を生成する(ステップS42)。そして、不明ループSIMD化部60は、SIMD命令が1度に扱える分のオペランドがオペランドスタックに溜まった場合にオペランドをオペランドスタックから取り出す命令列を生成する(ステップS43)。
そして、不明ループSIMD化部60は、オペランドがオペランドスタックから取り出された場合にSIMD命令を実行する命令列を生成する(ステップS44)。そして、不明ループSIMD化部60は、余りループ生成部80にオペランドスタックのオペランドを処理する命令列を生成させる余り処理を行う(ステップS45)。
このように、不明ループSIMD化部60がループの終了が実行するまで不明なループをオペランドスタックを用いてSIMD化する。したがって、ループSIMD化部30は、ループの終了が実行するまで不明なループをSIMD化することができる。
次に、ループSIMD化部30による最適化例及び効果について図12~図19を用いて説明する。図12は、条件分岐を含むループ(2-SIMDの場合)の最適化例を示す図である。図12に示すように、最適化前のコードには、forループの中にif文が含まれる。
ループSIMD化部30は、if文の条件が成立した場合に、オペランドと演算結果の格納先のアドレスとをオペランドスタックに積む命令列(a)を生成する。simdizeはオペランドスタックのポインタである。s_op1、s_op2、s_dstはオペランドスタックである。
そして、ループSIMD化部30は、2つのオペランドがオペランドスタックに積まれたか否かを判定して2つのオペランドが積まれた場合に2つのオペランドをオペランドスタックから取り出してSIMD命令simd_addを実行する命令列(b)を生成する。
そして、ループSIMD化部30は、余りのオペランドを処理するために、NULLオペランドをオペランドスタックに積む命令列(c)、2つのオペランドをオペランドスタックから取り出してSIMD命令simd_addを実行する命令列(d)を生成する。
なお、図12は、例を簡単にするために、余りのオペランドを処理するためにループSIMD化部30がSIMD命令を用いる場合を示す。
図13は、条件分岐を含むループ(2-SIMDの場合)に関して実施例に係る最適化による効果を説明するための図である。図13(a)は従来手法の命令数を示し、図13(b)は実施例の命令数を示す。また、「T」はcond[i](i=0~9)がTrueであることを示し、「F」はcond[i]がFalseであることを示す。また、nは10である。
図13(a)に示すように、従来手法では、回転数が10であり2-SIMDであるので、2つのオペランドをロードするためのLOAD(SIMD)の数は2×5=10であり、SIMD演算の数は5である。また、cond[2]、cond[3]の値が共に「F」であるので、aa[2:3]へのストアはなく、STOREの数は4である。
一方、図13(b)に示すように、実施例の場合には、「T」の数が4であるので、2つのオペランドをロードするためのLOADの数は2×4=8であり、SIMD演算の数は2である。したがって、実施例の場合には、LOAD及びSIMD演算の数が少なく実行効率がよい。
図14は、whileループ(2-SIMDの場合)に関して実施例に係る最適化による効果を説明するための図である。図14(a)に示すように、従来手法では、whileループのSIMD化は行われないので、N次元の配列の加算において、LOADの数は2Nであり、スカラ演算の数はNであり、STOREの数はNである。
一方、図14(b)に示すように、実施例の場合には、Nを奇数とし余りのオペランドにスカラ命令を用いると、LOADの数は2Nであり、SIMD演算及びSIMD-STOREの数は(N-1)/2であり、スカラ演算及びSTOREの数は1である。スカラ演算及びSTOREは余りのオペランドに用いられる。したがって、実施例の場合には、演算数及びストア数をほぼ1/2にすることができ実行効率がよい。
図15は、条件分岐を含むループ(4-SIMDの場合)の最適化例を示す図である。図15では、図13と比較して、2つのオペランドの加算の代わりに1つのオペランドの平方根演算であるので、オペランドスタックにオペランドを積む命令が1つ減る。また、2個の代わりに4個のデータがSIMD命令で処理されるので、オペランドスタックに積まれるオペランドの数が4になるとSIMD命令simd_sqrtを実行する命令列が生成される。
図16は、ベクトル長が異なる演算が混在している場合の最適化例を示す図である。ここで、ベクトル長とは、SIMD命令で演算するオペランドの数である。図16に示すように、単精度(float)の配列a[N]及びx[N]のベクトル長を4とすると、倍精度(double)の配列y[N]のベクトル長は、倍精度のデータサイズは単精度のデータサイズの2倍であるので、2である。このため、ベクトル長が長い単精度に合わせてSIMD命令が生成される。すなわち、1つの単精度SIMD命令simd_sqrtfに対して2つの倍精度SIMD命令simd_sqrtが生成される(a)。
図17は、ストライドアクセスのループ(4-SIMDの場合)の最適化例を示す図である。ここで、ストライドアクセスのループとは、アクセスするデータが連続でなく飛び飛びであるループである。図17では、外ループのjが2以上になると、内ループにおけるiが連続した値でなく飛び飛びの値となる。
図17に示すように、実施例では、オペランドスタックにオペランドが積まれ、オペランドスタックのオペランドに対してSIMD化演算が行われるため、ストライドアクセスのループのSIMD化が可能となる。すなわち、ループSIMD化部30は、ストライドアクセスのループをSIMD化することができる。
図18は、whileループ(4-SIMDの場合)の最適化例を示す図である。図18では、オペランドスタックs_op1及びs_op2にオペランドが積まれ、オペランドスタックs_dstに演算結果の格納先のアドレスが積まれる。
そして、4つのオペランドがオペランドスタックに積まれたか否かが判定され、4つのオペランドが積まれた場合に4つのオペランドがオペランドスタックから取り出されてSIMD命令simd_addが実行される。
そして、余りのオペランドの処理用に、NULLオペランドがオペランドスタックに積まれ、NULLオペランドを含む4つのオペランドがオペランドスタックから取り出されてSIMD命令simd_addが実行される。
図19は、飛び出しのあるループ(飛び出しの判定に演算で用いる変数が使われない場合)の最適化例を示す図である。図19では、2つのbreak文によりループからの飛び出しが行われる。図19に示すように、ループSIMD化部30は、飛び出しのあるループについても、オペランドスタックを用いてSIMD化を行うことができる。
上述してきたように、実施例では、構文解析部11が、ソースコード2を入力して構文解析を行い、ループを特定する。そして、構文解析部11は、最適化オプションが指定されると、構文解析結果を最適化部12に渡す。そして、最適化部12に含まれるループSIMD化部30が、構文解析部11により特定されたループのうち条件分岐を含むループとループの回転数が実行時まで不明なループとをマスク付きSIMD命令を用いることなくSIMD化する。ここで、ループの回転数が実行時まで不明なループには、例えばwhileループ、break文を含むループがある。
したがって、コード生成装置1は、マスク付きSIMD命令がないCPUについても条件分岐を含むループをSIMD化することができる。また、コード生成装置1は、ループの回転数が実行時まで不明なループをSIMD化することができる。なお、ループの回転数が実行時まで不明なループには、例えばwhileループ、break文を含むループがある。
また、実施例では、ループSIMD化部30は、条件分岐を含むループについて、条件分岐文内で実行される演算のオペランドをオペランドスタックに積む命令列を生成する。そして、ループSIMD化部30は、演算を行うSIMD命令が1度に演算する個数のオペランドがオペランドスタックに積まれているか否かをチェックする命令列を生成する。そして、ループSIMD化部30は、SIMD命令が1度に演算する個数のオペランドをオペランドスタックから取り出す命令列を生成する。そして、ループSIMD化部30は、オペランドスタックから取り出されたオペランドに対して演算を行うSIMD命令を生成する。したがって、ループSIMD化部30は、条件分岐を含むループをオペランドスタックを用いてSIMD化することができる。また、ループSIMD化部30は、実行効率の良い命令列を生成することができる。
また、実施例では、ループSIMD化部30は、余りのオペランドの数と演算の種別からSIMD化が有効か否かを判定する命令列、オペランドスタックにNULLオペランドを追加する命令列及びSIMD命令を生成する。また、ループSIMD化部30は、余りのオペランドの数の演算を行う命令列を生成する。したがって、ループSIMD化部30は、余りのオペランドを効率良く処理する命令列を生成することができる。
なお、実施例では、コード生成装置1について説明したが、コード生成装置1が有する構成をソフトウェアによって実現することで、同様の機能を有するコード生成プログラムを得ることができる。そこで、コード生成プログラムを実行するコンピュータについて説明する。
図20は、実施例に係るコード生成プログラムを実行するコンピュータのハードウェア構成を示す図である。図20に示すように、コンピュータ90は、メインメモリ91と、CPU92と、LAN(Local Area Network)インタフェース93と、HDD(Hard Disk Drive)94とを有する。また、コンピュータ90は、スーパーIO(Input Output)95と、DVI(Digital Visual Interface)96と、ODD(Optical Disk Drive)97とを有する。
メインメモリ91は、プログラムやプログラムの実行途中結果などを記憶するメモリである。CPU92は、メインメモリ91からプログラムを読み出して実行する中央処理装置である。CPU92は、メモリコントローラを有するチップセットを含む。
LANインタフェース93は、コンピュータ90をLAN経由で他のコンピュータに接続するためのインタフェースである。HDD94は、プログラムやデータを格納するディスク装置であり、スーパーIO95は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。DVI96は、液晶表示装置を接続するインタフェースであり、ODD97は、DVDの読み書きを行う装置である。
LANインタフェース93は、PCIエクスプレス(PCIe)によりCPU92に接続され、HDD94及びODD97は、SATA(Serial Advanced Technology Attachment)によりCPU92に接続される。スーパーIO95は、LPC(Low Pin Count)によりCPU92に接続される。
そして、コンピュータ90において実行されるコード生成プログラムは、コンピュータ90により読み出し可能な記憶媒体の一例であるDVDに記憶され、ODD97によってDVDから読み出されてコンピュータ90にインストールされる。あるいは、コード生成プログラムは、LANインタフェース93を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ90にインストールされる。そして、インストールされたコード生成プログラムは、HDD94に記憶され、メインメモリ91に読み出されてCPU92によって実行される。
1 コード生成装置
2 ソースコード
3 オブジェクトコード
11 構文解析部
12 最適化部
13 コード生成部
20 汎用最適化部
30 ループSIMD化部
31 SIMD化可否判定部
32 SIMD化ループ変換部
36 依存解析チェック部
37 連続性チェック部
38 命令有無チェック部
39 飛び込みチェック部
40 固有最適化部
50 条件分岐SIMD化部
51 push命令生成部
52 チェック命令生成部
53 pop命令生成部
54 SIMD命令生成部
60 不明ループSIMD化部
61 push命令生成部
62 チェック命令生成部
63 pop命令生成部
64 SIMD命令生成部
70 連続SIMD化部
80 余りループ生成部
81 方式選択部
82 スカラループ生成部
83 NULLオペランド生成部
84 SIMD命令生成部
90 コンピュータ
91 メインメモリ
92 CPU
93 LANインタフェース
94 HDD
95 スーパーIO
96 DVI
97 ODD

Claims (8)

  1. コード生成装置において、
    ソースコードの構文解析に基づいてループを特定する構文解析部と、
    第1命令変更部とを有し、
    前記第1命令変更部は、
    前記構文解析部が特定したループに含まれる条件分岐文内で実行される演算のオペランドを該演算に対応する命令のアドレス毎に用意したスタックに積む命令列を生成する第1push命令生成部と、
    前記演算を行うSIMD命令が1度に演算する個数のオペランドが前記スタックに積まれているか否かをチェックする命令列を生成する第1チェック命令生成部と、
    前記スタックから前記個数のオペランドを取り出す命令列を生成する第1pop命令生成部と、
    前記スタックから取り出された前記個数のオペランドに対して前記演算を実行するSIMD命令を生成する第1SIMD命令生成部と
    を有するコード生成装置。
  2. 前記コード生成装置はさらに、
    前記ループの実行後に前記スタックにオペランドが残されている場合、残されたオペランドについて前記演算を実行する命令列を生成する余り処理部を有する請求項1に記載のコード生成装置。
  3. 前記余り処理部は、前記スタックに残されたオペランドの数と前記演算の種別からSIMD化が有効か否かを判定する命令列と、前記スタックにNULLオペランドを追加する命令列及び前記SIMD命令と、前記スタックに残されたオペランドの数の前記演算を行う命令列とを生成する請求項2に記載のコード生成装置。
  4. 前記コード生成装置はさらに、
    前記構文解析部により特定されたループのうちストライドアクセスのループについてSIMD化を行うループSIMD化部を有する請求項1に記載のコード生成装置。
  5. 前記コード生成装置はさらに、
    前記構文解析部により特定されたループのうち繰り返し回数が実行時まで不明な不明ループについてSIMD化を行う第2命令変更部を有し、
    前記第2命令変更部は、
    前記不明ループに含まれる演算のオペランドを該演算に対応する命令のアドレス毎に用意したスタックに積む命令列を生成する第2push命令生成部と、
    前記演算を行うSIMD命令が1度に演算する個数のオペランドが前記スタックに積まれているか否かをチェックする命令列を生成する第2チェック命令生成部と、
    前記スタックから前記個数のオペランドを取り出す命令列を生成する第2pop命令生成部と、
    前記スタックから取り出された前記個数のオペランドに対して前記演算を実行するSIMD命令を生成する第2SIMD命令生成部と
    を有する請求項1に記載のコード生成装置。
  6. 前記第2命令変更部は、前記不明ループとして終了条件付きループ及び飛び出しを含むループについてSIMD化を行う請求項5に記載のコード生成装置。
  7. コード生成方法において、
    コンピュータが、
    ソースコードの構文解析に基づいてループを特定し、
    特定された前記ループに含まれる条件分岐文内で実行される演算のオペランドを該演算に対応する命令のアドレス毎に用意したスタックに積む命令列を生成し、
    前記演算を行うSIMD命令が1度に演算する個数のオペランドが前記スタックに積まれているか否かをチェックする命令列を生成し、
    前記スタックから前記個数のオペランドを取り出す命令列を生成し、
    前記スタックから取り出された前記個数のオペランドに対して前記演算を実行するSIMD命令を生成するコード生成方法。
  8. コード生成プログラムにおいて、
    コンピュータに、
    ソースコードの構文解析に基づいてループを特定させ、
    特定された前記ループに含まれる条件分岐文内で実行される演算のオペランドを該演算に対応する命令のアドレス毎に用意したスタックに積む命令列を生成させ、
    前記演算を行うSIMD命令が1度に演算する個数のオペランドが前記スタックに積まれているか否かをチェックする命令列を生成させ、
    前記スタックから前記個数のオペランドを取り出す命令列を生成させ、
    前記スタックから取り出された前記個数のオペランドに対して前記演算を実行するSIMD命令を生成させるコード生成プログラム。
JP2017191599A 2017-09-29 2017-09-29 コード生成装置、コード生成方法及びコード生成プログラム Active JP7006097B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2017191599A JP7006097B2 (ja) 2017-09-29 2017-09-29 コード生成装置、コード生成方法及びコード生成プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017191599A JP7006097B2 (ja) 2017-09-29 2017-09-29 コード生成装置、コード生成方法及びコード生成プログラム

Publications (2)

Publication Number Publication Date
JP2019067117A JP2019067117A (ja) 2019-04-25
JP7006097B2 true JP7006097B2 (ja) 2022-01-24

Family

ID=66340078

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017191599A Active JP7006097B2 (ja) 2017-09-29 2017-09-29 コード生成装置、コード生成方法及びコード生成プログラム

Country Status (1)

Country Link
JP (1) JP7006097B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2021093012A (ja) * 2019-12-11 2021-06-17 富士通株式会社 コンパイルプログラム、および情報処理装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009265708A (ja) 2008-04-22 2009-11-12 Hitachi Ltd コンパイラ及びそのコード生成方法
US20130290674A1 (en) 2012-04-30 2013-10-31 Biju George Modeling Structured SIMD Control FLow Constructs in an Explicit SIMD Language

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS59165147A (ja) * 1983-03-11 1984-09-18 Fujitsu Ltd コンパイラにおける条件文のベクトル命令化方式

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009265708A (ja) 2008-04-22 2009-11-12 Hitachi Ltd コンパイラ及びそのコード生成方法
US20130290674A1 (en) 2012-04-30 2013-10-31 Biju George Modeling Structured SIMD Control FLow Constructs in an Explicit SIMD Language

Also Published As

Publication number Publication date
JP2019067117A (ja) 2019-04-25

Similar Documents

Publication Publication Date Title
US7386844B2 (en) Compiler apparatus and method of optimizing a source program by reducing a hamming distance between two instructions
JP5583770B2 (ja) 最適化simdコードのための動作指示命令の挿入
TWI494851B (zh) 用於推測式述詞指令之功能單元、處理器及方法
CN112559051A (zh) 使用脉动阵列和融合操作的深度学习实现方式
KR102379894B1 (ko) 벡터 연산들 수행시의 어드레스 충돌 관리 장치 및 방법
US20120216011A1 (en) Apparatus and method of single-instruction, multiple-data vector operation masking
JP6942298B2 (ja) ベクトル演算命令の例外条件処理
TWI728068B (zh) 複數乘法指令
JP2023051994A (ja) 連鎖タイル演算を実施するためのシステムおよび方法
JP2013254484A (ja) ベクトル分割ループの性能の向上
US9395986B2 (en) Compiling method and compiling apparatus
US20130007422A1 (en) Processing vectors using wrapping add and subtract instructions in the macroscalar architecture
EP2951682B1 (en) Hardware and software solutions to divergent branches in a parallel pipeline
US9317284B2 (en) Vector hazard check instruction with reduced source operands
TWI740851B (zh) 用於向量負載指示之資料處理設備、方法及電腦程式
KR101624786B1 (ko) 기입마스크 레지스터의 트레일링 최하위 마스킹 비트를 결정하는 시스템, 장치, 및 방법
JP2015191346A (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
CN107257955B (zh) 快速向量动态存储器冲突检测
JP5326314B2 (ja) プロセサおよび情報処理装置
US9182960B2 (en) Loop distribution detection program and loop distribution detection method
JP7006097B2 (ja) コード生成装置、コード生成方法及びコード生成プログラム
US20150089189A1 (en) Predicate Vector Pack and Unpack Instructions
JP6790646B2 (ja) コンパイル装置、コンパイル方法、および、コンパイルプログラム
CN115469931B (zh) 一种循环程序的指令优化方法、装置、系统、设备及介质
JPH07110769A (ja) Vliw型計算機

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20200709

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20210728

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20210803

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20210816

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20211220

R150 Certificate of patent or registration of utility model

Ref document number: 7006097

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150