JP2022021554A - アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 - Google Patents
アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 Download PDFInfo
- Publication number
- JP2022021554A JP2022021554A JP2020125185A JP2020125185A JP2022021554A JP 2022021554 A JP2022021554 A JP 2022021554A JP 2020125185 A JP2020125185 A JP 2020125185A JP 2020125185 A JP2020125185 A JP 2020125185A JP 2022021554 A JP2022021554 A JP 2022021554A
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- assembly
- machine language
- assembly instruction
- function
- 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.)
- Withdrawn
Links
- 238000000034 method Methods 0.000 title claims description 23
- 230000010365 information processing Effects 0.000 title claims description 21
- 238000006243 chemical reaction Methods 0.000 title claims description 10
- 230000006870 function Effects 0.000 claims description 130
- 230000001419 dependent effect Effects 0.000 claims description 10
- 238000010586 diagram Methods 0.000 description 42
- 230000009486 mnemonic function Effects 0.000 description 33
- 238000005516 engineering process Methods 0.000 description 12
- 230000001174 ascending effect Effects 0.000 description 3
- 238000004891 communication Methods 0.000 description 2
- 238000011156 evaluation Methods 0.000 description 2
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3838—Dependency mechanisms, e.g. register scoreboarding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
- G06F9/4552—Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
【課題】生成した機械語を実行する際のクロックサイクル数が増大するのを抑制すること。【解決手段】アセンブリ命令変換プログラムは、第1のアセンブリ命令と等価な処理を行う第2のアセンブリ命令の機械語の生成を指示する生成指示を、複数の前記第1のアセンブリ命令ごとに記憶領域に複数格納し、前記記憶領域にある複数の前記生成指示に従って、依存関係のある複数の前記第2のアセンブリ命令の機械語が連続しないように前記機械語を生成する処理をコンピュータに実行させる。【選択図】図19
Description
本発明は、アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置に関する。
プログラムの実行速度を高速化する技術の一つとしてJIT(Just In Time)コンパイラ技術がある。JITコンパイラ技術は、実行時に決定されるパラメータ、処理内容、及びプロセッサの状況に応じて、好適な機械語の命令列をプログラムの実行時に生成する技術である。JITコンパイラ技術を用いて生成した機械語の命令列は、AOT(Ahead Of Time)型のコンパイラが生成する汎用的に処理可能な機械語の命令列からなる実行プログラムよりも処理が高速である。
但し、JITコンパイラ技術で生成される機械語は、ターゲットプロセッサの命令セットに含まれるアセンブリ命令の機械語であるため、それとは別の命令セットの機械語を実行する別のプロセッサでは動作しない。JITコンパイラ技術で生成した機械語を別の命令セットの機械語に変換すれば、該別の命令セットを採用したプロセッサでも動作可能な実行プログラムが得られる。
しかし、このように単純に機械語を変換したのでは、変換前と比較して実行プログラムを実行するときのクロックサイクル数が増大する可能性がある。
一側面によれば、生成した機械語を実行する際のクロックサイクル数が増大するのを抑制することを目的とする。
一側面によれば、第1のアセンブリ命令と等価な処理を行う第2のアセンブリ命令の機械語の生成を指示する生成指示を、複数の前記第1のアセンブリ命令ごとに記憶領域に複数格納し、前記記憶領域にある複数の前記生成指示に従って、依存関係のある複数の前記第2のアセンブリ命令の機械語が連続しないように前記機械語を生成する、処理をコンピュータに実行させるためのアセンブリ命令変換プログラムが提供される。
一側面によれば、生成した機械語を実行する際のクロックサイクル数が増大するのを抑制できる。
本実施形態の説明に先立ち、本実施形態の基礎となる事項について説明する。
図1は、JITコンパイラ技術でコンパイルすることを前提としたC++の疑似ソースコードである。
このソースコード1においては、main関数1aを実行することによりgenerateJitCode関数1bが呼び出される。generateJitCode関数1bは、その内部でvpmovsxbd関数1cを呼び出す関数である。
vpmovsxbd関数1cは、コード1dで定義されるように、Intel社のx86_64アーキテクチャの命令セットに含まれるアセンブリ命令「vpmovsxbd」の機械語を生成する関数である。以下では、このようにあるアセンブリ命令の機械語を生成する関数であって、そのアセンブリ命令の名前と同一の関数名を有する関数をニーモニック関数と呼ぶ。
この例では、generateJitCode関数1bを実行することにより、コード1eのように「vpmovsxbd xmm0, xmm0」、「vpmovsxbd xmm1, xmm1」、…、「vpmovsxbd xmm15, xmm15」というアセンブリ命令の機械語が生成される。
そして、main関数1a内のexecuteJitCode関数1fが、vpmovsxbd関数1cが生成した機械語列を実行する。
図2(a)は、x86_64アーキテクチャにおけるベクトルレジスタについて説明するための模式図である。
図2(a)に示すように、x86_64アーキテクチャを採用するプロセッサにおいてはベクトルレジスタとして128ビットのSIMD(Single Instruction Multiple Data)レジスタが全部で32個用意されている。また、これらのベクトルレジスタの名前は「xmm0」、「xmm1」、…「xmm31」となる。なお、その名前における「0」、「1」、…「31」等の数字部分はレジスタ番号を示す。また、ニーモニック関数の引数においては、図1のように各ベクトルレジスタを「xmm (i)」(0≦i≦15)で識別する。
図2(b)は、上記のアセンブリ命令「vpmovsxbd」について説明するための模式図である。
アセンブリ命令「vpmovsxbd」は、ベクトルレジスタの下位側の4個の要素に格納されている8ビットのデータの各々を32ビットに符号拡張する命令である。例えば、「vpmovsxpd xmm1, xmm0」は、ベクトルレジスタxmm0の下位側の4個の要素に格納されている8ビットのデータa0~a3を32ビットに符号拡張し、それをベクトルレジスタxmm1の4個の要素に格納する。
図1のソースコード1で生成されるアセンブリ命令「vpmovsxbd」の機械語は、このようにx86_64アーキテクチャのプロセッサで動作する機械語である。そのため、x86_64アーキテクチャとは異なるアーキテクチャのプロセッサではこの機械語を実行することができない。
しかし、x86_64アーキテクチャ向けのソースコード1が既に開発者の手元にある場合には、そのソースコード1を他のアーキテクチャのプロセッサでも実行できるようにすることで、プログラム資産を有効活用できる。そのようなアーキテクチャとしては、例えばARM社のArmv8-Aアーキテクチャがある。
そこで、x86_64アーキテクチャのアセンブリ命令である「vpmovsxbd」命令を、以下のようにArmv8-Aアーキテクチャの等価なアセンブリ命令に置き換えることを考える。
図3(a)は、Armv8-Aアーキテクチャを採用するプロセッサにおけるベクトルレジスタについて説明するための模式図である。
図3(a)に示すように、Armv8-Aアーキテクチャにおいてもベクトルレジスタとして128ビットのSIMDレジスタが全部で32個用意されている。但し、これらのベクトルレジスタの名前はx86_64アーキテクチャにおけるのとは異なり、「v0」、「v1」、…「v31」となる。なお、その名前における「0」、「1」、…「31」等の数字部分はレジスタ番号を示す。また、x86_64とArmv8-Aの各々のベクトルレジスタは、それらのベクトルレジスタが同一の場合に相互に対応するという。例えば、x86_64の「xmm1」のベクトルレジスタと、Armv8-Aの「v1」のベクトルレジスタは、相互に対応したベクトルレジスタである。
また、Armv8-Aのベクトルレジスタをアセンブリ命令のオペランドに指定する場合には、「vi.s4」、「vi.h8」、「vi.b16」 (0≦i≦31)等の書式を使用する。この書式において、ドット「.」の後に続く「s」、「h」、「b」は、一つのレジスタ「vi」に格納されたベクトルデータの各要素のサイズを示す書式である。例えば、「s」は要素のサイズがシングルワード(32ビット)であることを示し、「h」は要素のサイズがハーフワード(16ビット)であることを示す。そして、「b」は、要素のサイズがバイト(8ビット)であることを示す。
図3(b)は、Armv8-Aアーキテクチャの命令セットに含まれるアセンブリ命令「sxtl」について説明するための模式図である。
アセンブリ命令「sxtl」は、オペランドに指定されたベクトルレジスタの要素のサイズに応じて、そのベクトルレジスタに格納されているデータの各要素を符号拡張する命令である。
例えば、「sxtl v2.h8, v0.b16」のように第1オペランドに「vi.h8」(0≦i≦31)が指定され、第2オペランドに「vj.b16」(0≦j≦31)が指定された場合を考える。この場合、アセンブリ命令「sxtl」は、ベクトルレジスタ「vj」の下位側の8個の要素に格納されている8ビットのデータを16ビットに符号拡張してベクトルレジスタ「vi」の各要素に格納する。例えば、「sxtl v2.h8, v0.b16」は、ベクトルレジスタv0の下位側の8個の要素の各々に格納されている8ビットのデータa0~a7を、それぞれ16ビットに符号拡張してベクトルレジスタv2の8個の要素に格納する。
また、「sxtl v1.s4, v2.h8」のように第1オペランドに「vi.s4」(0≦i≦31)が指定され、第2オペランドに「vj.h8」(0≦j≦31)が指定された場合を考える。この場合、アセンブリ命令「sxtl」は、ベクトルレジスタ「vj」の下位側の4個の要素に格納されている16ビットのデータを32ビットに符号拡張してレジスタ「vi」の各要素に格納する。例えば、「sxtl v1.s4, v2.h8」は、ベクトルレジスタv2の下位側の4個の要素の各々に格納されている16ビットのデータa0~a3を、それぞれ32ビットに符号拡張してベクトルレジスタv1の4個の要素に格納する。
よって、図3(b)のように「sxtl v2.h8, v0.b16」と「sxtl v1.s4, v2.h8」とをこの順に実行すると、下位側の4個のデータを8ビットから32ビットに符号拡張するx86_64のアセンブリ命令「vpmovsxbd」と等価な処理を実現できる。
図4は、このことを利用して、Armv8-Aアーキテクチャの命令セットの機械語を生成するようにソースコード1を改変したソースコード2の模式図である。なお、図4において、図1と同じ要素には図1におけるのと同じ符号を付し、以下ではその説明を省略する。
図4の例では、vpmovsxbd関数1cを呼び出すと、コード2aとコード2bの各々のsxtl関数が実行される。
sxtl関数は、アセンブリ命令「sxtl」のニーモニック関数である。この例では、sxtl関数の引数の型に応じて、sxtl関数の処理の内容が変わる。例えば、「sxtl(v(i).h8, v(j).b16)」のように記述した場合を考える。この場合は、コード2cに示すように、sxtl関数は、Armv8-Aアーキテクチャのアセンブリ命令「sxtl vi.h8, vj.b16」の機械語を生成する。また、「sxtl(v(i).s4, v(j).h8)」のように記述した場合は、コード2dに示すように、Armv8-Aアーキテクチャのアセンブリ命令「sxtl vi.s4, vj.h8」の機械語をsxtl関数が生成する。
そして、generateJitCode関数1bを実行すると、コード2eのように「sxtl vi.h8, vi.b16」(0≦i≦15)と「sxtl vi.s4, vi.h8」(0≦i≦15)の各命令の機械語列が生成される。その機械語列の「sxtl v0.h8, v0.b16」と「sxtl v0.s4, v0.h8」とをこの順に実行すると、x86_64アーキテクチャの「vpmovsxpd xmm0, xmm0」と等価な処理を実現できる。
これにより、x86_64アーキテクチャ向けのソースコード1を活かしながら、Armv8-Aアーキテクチャの命令セットの機械語を生成することができる。
但し、この方法には以下のような問題がある。
図5は、ソースコード1、2の各々を実行することにより生成される機械語列を逆アセンブルしたコード1e、2eの模式図である。
図5に示すように、ソースコード1のforループの内側でvpmovsxbd関数を16回呼び出すのに対応して、x86_64のアセンブリ命令「vpmovsxbd」は全部で16個生成される。
一方、Armv8-Aにおいては、前述のように二つのアセンブリ命令「sxtl」で一つのアセンブリ命令「vpmovsxbd」を実現する。そのため、ソースコード2のforループの内側で「vpmovsxbd」関数を16回呼び出すとアセンブリ命令「sxtl」が全部で32個(=2×16個)生成される。
図6は、x86_64の上記の16個のアセンブリ命令をパイプライン処理するときの模式図である。
パイプライン処理は、IF(命令フェッチ)ステージ、ID(命令デコード)ステージ、EX1(実行)ステージ、EX2/MA(実行/メモリアクセス)ステージ、及びWB(ライトバック)ステージを有する。
x86_64アーキテクチャにおける16個のアセンブリ命令「vpmovsxbd xmmi, xmmi」(0≦i≦15)は各々が異なるベクトルレジスタを使用しているため命令間に依存関係がない。よって、一つのアセンブリ命令のIFステージが終了する度に後続のアセンブリ命令をパイプラインに投入できる。その結果、16個のアセンブリ命令の実行は20クロックサイクルで終了する。
図7は、Armv8-Aの上記の32個のアセンブリ命令をパイプライン処理するときの模式図である。
そのパイプライン処理においては、x86_64アーキテクチャにおけるのと同様にIFステージ、IDステージ、EX1ステージ、EX2/MAステージ、及びWBステージがこの順に実行される。
ここで、2番目の「sxtl v0.s4, v0.h8」命令について考える。この「sxtl v0.s4, v0.h8」命令はソースオペランドとしてベクトルレジスタ「v0」を利用しているが、このベクトルレジスタ「v0」は先行命令の「sxtl v0.h8, v0.b16」命令もデスティネーションオペランドとして使用している。したがって、「sxtl v0.s4, v0.h8」命令は、先行の「sxtl v0.h8, v0.b16」命令がWBステージでベクトルレジスタ「v0」にデータを書き込むまでEX1ステージを実行することができない。そのため、「sxtl v0.s4, v0.h8」命令は、2クロックサイクルだけパイプラインをストールさせてしまう。
次に、2番目の「sxtl v0.s4, v0.h8」命令と3番目の「sxtl v1.h8, v1.b16」命令について考える。これらの命令は、互いに異なるベクトルレジスタを使用しているため、命令間に依存関係はない。しかし、2番目の「sxtl v0.s4, v0.h8」命令がEX1ステージを終えて演算器を開放した後でないと、3番目の「sxtl v1.h8, v1.b16」命令がEX1ステージで演算器を使用できない。そのため、3番目の「sxtl v1.h8, v1.b16」命令も2クロックサイクルだけパイプラインをストールさせてしまう。
同様に、4~32番目の命令も2クロックサイクルだけパイプラインをストールさせてしまう。
その結果、32個のアセンブリ命令の実行が終了するまで98クロックサイクルも要することになり、x86_64アーキテクチャにおけるクロックサイクル数(20サイクル)よりも大幅に増えてしまう。
以下に、クロックサイクル数が増えるのを抑制することが可能な各実施形態について説明する。
(第1実施形態)
図8は、JITコンパイラ技術により生成された機械語を実行する第1のターゲットマシンのハードウェア構成図である。
図8は、JITコンパイラ技術により生成された機械語を実行する第1のターゲットマシンのハードウェア構成図である。
第1のターゲットマシン10は、サーバやPC(Personal Computer)、スマートフォン等の計算機であって、第1のプロセッサ11と第1のメモリ12とを有する。
このうち、第1のプロセッサ11は、例えばx86_64アーキテクチャを採用したCPU(Central Procesing Unit)であって、算術演算や論理演算を行う演算器を含む第1の計算コア13と第1のレジスタファイル14とを備える。
第1のレジスタファイル14は、「xmm0」、「xmm1」、…「xmm31」という文字列で識別される32個の第1のベクトルレジスタ15を備えたハードウェアである。
一方、第1のメモリ12は、x86_64の機械語が展開されるDRAM(Dynamic Random Access Memory)等の揮発性メモリである。
本実施形態では、JITコンパイラ技術で第1のプロセッサ11の命令セットの機械語に翻訳されることを前提にして記述されたソースコードから、以下の第2のプロセッサの命令セットの機械語を生成できるようにする。
図9は、第2のターゲットマシンのハードウェア構成図である。
第1のターゲットマシン10と同様に、第2のターゲットマシン20もサーバやPC、スマートフォン等の計算機であって、第2のプロセッサ21と第2のメモリ22とを有する。
第2のプロセッサ21は、第1のプロセッサ11とは異なるArmv8-Aアーキテクチャを採用したCPUである。また、第2のプロセッサ21は、算術演算や論理演算を行う演算器を有する第2の計算コア23と第2のレジスタファイル24とを備える。
第2のレジスタファイル24は、「v0」、「v1」、…「v31」という文字列で識別される32個の第2のベクトルレジスタ25を備えたハードウェアである。
一方、第2のメモリ22は、Armv8-Aの機械語が展開されるDRAM等の揮発性メモリである。
図10は、第2のプロセッサ21が実行する機械語を生成するための情報処理装置のハードウェア構成図である。
図10に示すように、情報処理装置30は、記憶装置30a、メモリ30b、プロセッサ30c、通信インターフェース30d、表示装置30e、及び入力装置30fを有する。これらの各部は、バス30gにより相互に接続される。
このうち、記憶装置30aは、HDD(Hard Disk Drive)やSSD(Solid State Drive)等の不揮発性のストレージデバイスであり、本実施形態に係るアセンブリ命令変換プログラム31を記憶する。
なお、アセンブリ命令変換プログラム31をコンピュータが読み取り可能な記録媒体30hに記録させておき、プロセッサ30cに記録媒体30hのアセンブリ命令変換プログラム31を読み取らせるようにしてもよい。
そのような記録媒体30hとしては、例えばCD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、及びUSB(Universal Serial Bus)メモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体30hとして使用してもよい。これらの記録媒体30hは、物理的な形態を持たない搬送波のような一時的な媒体ではない。
更に、公衆回線、インターネット、及びLAN(Local Area Network)等に接続された装置にアセンブリ命令変換プログラム31を記憶させておき、プロセッサ30cがそのアセンブリ命令変換プログラム31を読み出して実行するようにしてもよい。
一方、メモリ30bは、DRAM等のようにデータを一時的に記憶するハードウェアであって、その上に前述のアセンブリ命令変換プログラム31が展開される。
プロセッサ30cは、情報処理装置30の各部を制御したり、メモリ30bと協働してアセンブリ命令変換プログラム31を実行したりするCPUやGPU(Graphical Processing Unit)等のハードウェアである。
更に、通信インターフェース30dは、情報処理装置30をLAN(Local Area Network)等のネットワークに接続するためのインターフェースである。
そして、表示装置30eは、液晶表示装置等のハードウェアであって、開発者に種々の情報の入力を促すプロンプトを表示する。また、入力装置30fは、キーボードやマウス等のハードウェアである。
次に、アセンブリ命令変換プログラム31のソースコードの例について説明する。
図11は、C++で記述されたアセンブリ命令変換プログラム31の疑似ソースコード32の模式図である。
このソースコード32においては、main関数33を実行することによりgenerateJitCode関数34、genJitCodeOfFifo関数35、及びexecuteJitCode関数36がこの順に呼び出される。
このうち、generateJitCode関数34は、forループ37の内部でvpmovsxbd関数38を複数回呼び出す関数である。また、このforループ37の実行が終了すると、generateJitCode関数34はret関数51を呼び出す。
図12は、vpmovsxbd関数38の定義の一例を示すC++の疑似ソースコードである。
この例では、コード43において、XmmReg型、VRegB16型、VRegH8型、及びVRegS4型を定義する。XmmReg型は、x86_64の32個の第1のベクトルレジスタ15(図8参照)の各々のレジスタ番号を表すメンバ変数「index」を有する型である。
一方、VRegB16型、VRegH8型、及びVRegS4型は、Armv8-Aの32個の第2のベクトルレジスタ25(図9参照)の各々のレジスタ番号を表すメンバ変数「index」を有する型である。このうち、VRegB16型は、バイトサイズ(8ビット)の要素を16個有する第2のベクトルレジスタ25を指定する型である。また、VRegH8型は、ハーフワードサイズ(16ビット)の要素を8個有する第2のベクトルレジスタ25を指定する型である。そして、VRegS4型は、シングルワードサイズ(32ビット)の要素を4個有する第2のベクトルレジスタ25を指定する型である。
vpmovsxbd関数38は、上記のXmmReg型の変数を引数にとる関数であって、x86_64のアセンブリ命令「vpmovsxbd」と等価な処理を行うArmv8-Aの機械語を生成するニーモニック関数である。
vpmovsxbd関数38の引数の「XmmReg src」は、XmmReg型の第1オペランドを示す変数であり、「XmmReg dst」は、XmmReg型の第2オペランドを示す変数である。この場合、vpmovsxbd関数38は、x86_64アーキテクチャのアセンブリ命令「vpmovsxbd dst, src」と等価な処理を行うArmv8-Aの機械語を生成する。
このvpmovsxbd関数38を呼び出すと、if文39の判定結果に応じて、genJitCodeOfFifo関数35とコード40のいずれか一方が実行される。
コード40は、アセンブリ命令「vpmovsxbd dst, src」と等価な処理を行うArmv8-Aの機械語を生成する生成指示41をFIFO(First In First Out)バッファに格納するコードである。
図13は、FIFOバッファの模式図である。
FIFOバッファ45は、記憶装置30aやメモリ30b等に確保された記憶領域の一例であって、ソースコード32を実行する前では空である。
そのFIFOバッファ45には、コード40を実行する度に生成指示41が格納される。ここでは、複数の生成指示41の各々を「vpmovsxbd, xmm0, xmm0」等のアセンブリ命令で識別する。例えば、「vpmovsxbd, xmm0, xmm0」で識別される生成指示41は、x86_64のアセンブリ命令「vpmovsxbd, xmm0, xmm0」と等価な処理を行うArmv8-Aの機械語を生成する指示を表す。
また、FIFOバッファ45に生成指示41が格納される順序は、コード40を実行する順序と同一である。
例えば、図11の例では、forループ37の内側でレジスタ番号を示す変数「i」の値を変えながらvpmovsxbd関数38が4回呼ばれる。そのため、forループ37を最初に実行すると、「i = 0」に対応した「vpmovsxbd xmm0, xmm0」の生成指示41がFIFOバッファ45に最初に格納される。その後、「i = 1」に対応した「vpmovsxbd xmm1, xmm1」の生成指示41がFIFOバッファ45に格納され、最終的には「vpmovsxbd xmm3, xmm3」の生成指示41がFIFOバッファ45に格納される。
再び図12を参照する。
if文39は、FIFOバッファ45に格納されている生成指示41が示すアセンブリ命令の種類が、ニーモニック関数vpmovsxbdの種類と異なるかを判定する文である。なお、アセンブリ命令の種類は、アセンブリ命令の名前とそのオペランドの型との組である。そして、ニーモニック関数の種類は、ニーモニック関数の名前と引数の型との組である。
例えば、FIFOバッファ45に格納されている生成指示41が示すアセンブリ命令が「vpmovsxbd dst, src」であるとする。この場合は、生成指示41が示すアセンブリ命令の名前とニーモニック関数vpmovsxbdの名前「vpmovsxbd」とが一致する。また、ニーモニック関数vpmovsxbdの第1及び第2オペランドの型はいずれもXmmReg型である。この型は、アセンブリ命令「vpmovsxbd dst, src」の第1及び第2オペランドの型と一致する。よって、この場合は、アセンブリ命令「vpmovsxbd dst, src」の種類は、ニーモニック関数vpmovsxbdの種類と同じということになる。
そして、if文39の判定結果に応じ、前述のgenJitCodeOfFifo関数35とコード40のいずれか一方が実行される。
なお、本実施形態では、FIFOバッファ45に複数の生成指示41が格納されている場合、格納されている全ての生成指示41が示すアセンブリ命令の種類は全て同一となる。よって、if文39は、複数の生成指示41のうちのいずれかのセンブリ命令の種類が、ニーモニック関数vpmovsxbdの種類と異なるかを判定することになる。
図14(a)は、ret関数51の定義の一例を示すC++の疑似ソースコードである。
ret関数51は、x86_64アーキテクチャの命令セットに含まれるアセンブリ命令「ret」と等価な処理を行うArmv8-Aの機械語を生成するニーモニック関数である。
このret関数51を呼び出すと、if文52の判定結果に応じて、genJitCodeOfFifo関数35とコード53のいずれか一方が実行される。
if文52は、FIFOバッファ45に格納されている生成指示41が示すアセンブリ命令の種類が、ニーモニック関数retの種類と異なるかを判定する文である。
そして、コード53は、アセンブリ命令「ret」の生成指示41をFIFOバッファ45に格納するコードである。その生成指示41は、x86_64のアセンブリ命令「ret」と等価な処理を行うArmv8-Aの機械語を生成する指示である。
図14(b)は、アセンブリ命令「ret」の生成指示41が格納されたFIFOバッファ45の模式図である。
前述のように、本実施形態では、FIFOバッファ45には同一の種類のアセンブリ命令に係る生成指示41のみが格納される。そのため、アセンブリ命令「ret」に係る生成指示41と、アセンブリ命令「vpmovsxbd」に係る生成指示41とがFIFOバッファ45に共存することはない。
図15は、genJitCodeOfFifo関数35の定義の一例を示すC++の疑似ソースコードである。
図15に示すように、genJitCodeOfFifo関数35は、if文54において変数instTypeの内容を判定し、その内容に応じた処理を実行する。変数instTypeは、FIFOバッファ45にある生成指示41が示すアセンブリ命令の名前とそのオペランドの型とを示す変数である。
例えば、「vpmovsxbd xmm0, xmm0」の生成指示41の場合、アセンブリ命令の名前「vpmovsxbd」と、第1オペランド(xmm0)及び第2オペランド(xmm0)の各々の型である「XmmReg」とが変数instTypeに格納される。
FIFOバッファ45にアセンブリ命令「vpmovsxbd」の生成指示41が格納されている場合にはif文54の評価式が真となり、translateVPMOVSXBD関数56が呼び出される。
また、FIFOバッファ45にアセンブリ命令「ret」の生成指示41が格納されている場合には、if文55の評価式が真となり、translateRET関数57が呼び出される。
そして、genJitCodeOfFifo関数35は、上記のtranslateVPMOVSXBD関数56やtranslateRET関数57の実行を終えると、コード58においてFIFOバッファ45の中身を空にする。
図16は、translateVPMOVSXBD関数56の定義の一例を示すC++の疑似ソースコードである。
この例では、translateVPMOVSXBD関数56は、第1のforループ61と第2のforループ62とを有する。このうち、第1のforループ61は、FIFOバッファ45に格納されている先頭の生成指示41から順に、アセンブリ命令「sxtl」のニーモニック関数であるsxtl関数65を呼び出すループ処理である。なお、translateVPMOVSXBD関数56の内部でsxtl関数65が呼び出される回数は、FIFOバッファ45に格納しているアセンブリ命令「vpmovsxbd」に対応した生成指示41の個数に等しい。
ここでは、コード63において、VRegB16型の変数「vB16」とVRegH8の変数「vH8」とを宣言する。そして、コード64において、変数「vB16」のメンバ変数「index」に、FIFOバッファ45の先頭からi番目の生成指示41に係るアセンブリ命令の第2オペランドのレジスタ番号を格納する。同様に、コード64において、変数「vH8」のメンバ変数「index」に、FIFOバッファ45の先頭からi番目の生成指示41に係るアセンブリ命令の第1オペランドのレジスタ番号を格納する。
その後、sxtl関数65が、Armv8-Aの命令セットに含まれるアセンブリ命令「sxtl」の機械語を生成する。そのアセンブリ命令「sxtl」の第1オペランドは、32個の第2のベクトルレジスタ25のうち、vH8.indexが示すレジスタ番号の第2のベクトルレジスタ25である。また、このアセンブリ命令「sxtl」の第2オペランドは、32個の第2のベクトルレジスタ25のうち、vB16.indexが示すレジスタ番号の第2のベクトルレジスタ25である。
この場合、アセンブリ命令「sxtl」は、第2オペランドが示す第2のベクトルレジスタ25の8ビットの要素を16ビットに符号拡張し、それを第1オペランドが示す第2のベクトルレジスタ25の各要素に格納する命令となる。
第1のforループ61の内部の処理は、FIFOバッファ45に格納された順番を示す変数「i」が小さい順に実行される。そのため、FIFOバッファ45に最も早くに格納された生成指示41から順に、sxtl関数65によって機械語が生成されることになる。
同様に、第2のforループ62は、FIFOバッファ45に格納されている先頭の生成指示41から順に、アセンブリ命令「sxtl」のニーモニック関数であるsxtl関数68を呼び出すループ処理である。なお、translateVPMOVSXBD関数56の内部でsxtl関数68が呼び出される回数は、FIFOバッファ45に格納しているアセンブリ命令「vpmovsxbd」に対応した生成指示41の個数に等しい。
この例では、コード66において、VRegH8の変数「vH8」とVRegS4型の変数「vS4」とを宣言する。そして、コード67において、変数「vH8」のメンバ変数「index」に、FIFOバッファ45の先頭からi番目の生成指示41に係るアセンブリ命令の第2オペランドのレジスタ番号を格納する。同様に、変数「vS4」のメンバ変数「index」に、FIFOバッファ45の先頭からi番目の生成指示41に係るアセンブリ命令の第1オペランドのレジスタ番号を格納する。
その後、sxtl関数68がアセンブリ命令「sxtl」の機械語を生成する。そのアセンブリ命令「sxtl」の第1オペランドは、32個の第2のベクトルレジスタ25のうち、vS4.indexが示すレジスタ番号の第2のベクトルレジスタ25である。同様に、アセンブリ命令「sxtl」の第2オペランドは、32個の第2のベクトルレジスタ25のうち、vH8.indexが示すレジスタ番号の第2のベクトルレジスタ25である。
この場合、アセンブリ命令「sxtl」は、第2オペランドが示す第2のベクトルレジスタ25の16ビットの要素を32ビットに符号拡張し、それを第1オペランドが示す第2のベクトルレジスタ25の各要素に格納する命令となる。
第1のforループ61と同様に、第2のforループ62の内部の処理は、FIFOバッファ45に格納された順番を示す変数「i」が小さい順に実行される。そのため、FIFOバッファ45に最も早くに格納された生成指示41から順に、sxtl関数68によって機械語が生成される。
図17は、translateRET関数57の定義の一例を示すC++の疑似ソースコードである。
translateRET関数57は、x86_64のアセンブリ命令「ret」に係る生成指示41がFIFOバッファ45に格納されている場合に、Armv8-Aのアセンブリ命令「ret」のニーモニック関数であるret_Armv8a関数69を呼び出す処理を行う。x86_64アーキテクチャにも同じ「ret」というアセンブリ命令が存在するため、区別するため、Armv8-Aのアセンブリ命令「ret」に対応するニーモニック関数の名前はret_Armv8aとしている。また、Armv8-Aのアセンブリ命令「ret」はオペランドを取らない命令なので、対応するニーモニック関数ret_Armv8aは引数をとらない。なお、translateRET関数57の内部でret_Armv8a関数69が呼び出される回数は、FIFOバッファ45に格納しているアセンブリ命令「ret」に対応した生成指示41の個数に等しい。
図18は、このようなアセンブリ命令変換プログラム31を実行したときに生成される機械語を逆アセンブルしたアセンブリ命令の命令列の模式図である。これらのアセンブリ命令は、第2のプロセッサ21(図9参照)の命令セットであるArmv8-Aで定義された命令である。
本実施形態では、第1のforループ61(図16参照)を実行することにより、グループG1のようにアセンブリ命令の命令列「sxtl v0.h8, v0.b16」、「sxtl v1.h8, v1.b16」、…「sxtl v3.h8, v3.b16」に対応した機械語がこの順に生成される。これらのアセンブリ命令は、レジスタ番号が相互に異なる第2のベクトルレジスタ25がオペランドに指定されているため、依存関係のある複数のアセンブリ命令が連続して並ぶことがない。
その後、第2のforループ62を実行することにより、グループG2のようにアセンブリ命令の命令列「sxtl v0.s4, v0.h8」、「sxtl v1.s4, v1.h8」、…「sxtl v3.s4, v3.h8」に対応した機械語がこの順に生成される。これらのアセンブリ命令も、レジスタ番号が相互に異なる第2のベクトルレジスタ25がオペランドに指定されているため、依存関係のある複数のアセンブリ命令が連続して並ぶことがない。
このように、本実施形態では、グループG1の要素である各アセンブリ命令が相互に異なる第2のベクトルレジスタ25を使用する。グループG2についても同様である。その結果、上記のように依存関係のあるアセンブリ命令が連続するのを防止できる。
図19は、図16の各アセンブリ命令を第2のプロセッサ21においてパイプライン処理するときの模式図である。
本実施形態では前述のように依存関係のある複数のアセンブリ命令が連続して並ばないため、パイプライン処理の実行中に依存関係に起因したストールが発生しない理想的な機械語の順序となっている。その結果、図7のように各機械語の実行時にパイプラインがストールするのを回避でき、図7におけるよりも少ないクロックサイクル数で処理を実行できる。
図20は、本実施形態に係る情報処理装置30の機能構成図である。
図20に示すように、情報処理装置30は、記憶部71と制御部72とを有する。
このうち、記憶部71は、FIFOバッファ45を記憶する処理部である。一例として、記憶部71は、図10の記憶装置30aとメモリ30bとにより実現される。
一方、制御部72は、情報処理装置30の各部を制御する処理部であって、呼び出し部73、判定部74、格納部75、生成部76、及び出力部77を有する。これらの各部は、メモリ30bとプロセッサ30cとが協働してアセンブリ命令変換プログラム31(図10参照)を実行することにより実現される。
呼び出し部73は、ニーモニック関数を呼び出す処理部であって、例えば図11のgenerateJitCode関数34によって実現される。図11を参照して説明したように、そのgenerateJitCode関数34を実行すると、ニーモニック関数のvpmovsxbd関数38とret関数51が呼び出される。
判定部74は、FIFOバッファ45に格納されている生成指示41が示すアセンブリ命令の種類が、呼び出し部73が呼び出したニーモニック関数の種類と異なるかを判定する処理部である。一例として、判定部74は、図12のif文39と、図14(a)のif文52により実現される。
格納部75は、生成指示41をFIFOバッファ45に格納する処理部であり、コード40(図12参照)とコード53(図14参照)によって実現される。例えば、コード40を実行すると、forループ37(図11参照)でニーモニック関数vpmovsxbd38が複数回呼び出されるのに対応して、複数のアセンブリ命令「vpmovsxbd」ごとに生成指示41がFIFOバッファ45に格納される。
生成部76は、FIFOバッファ45にある複数の生成指示41に従い、生成指示41に係るアセンブリ命令「vpmovsxbd」と等価な処理を行うArmv8-Aのアセンブリ命令の機械語を生成する処理部である。この例では、図16のtranslateVPMOVSXBD関数56によって生成部76が実現される。図18に示したように、translateVPMOVSXBD関数56は、依存関係のある複数のアセンブリ命令「sxtl」が連続して並ばないように機械語を生成する。
出力部77は、生成部76が生成した機械語を外部に出力する処理部である。
図21は、本実施形態に係るアセンブリ命令変換方法のフローチャートである。
まず、呼び出し部73がニーモニック関数を呼び出す(ステップS11)。一例として、情報処理装置30が図11のgenerateJitCode関数34を実行することにより、ニーモニック関数のvpmovsxbd関数とret関数とを呼び出す。
次に、判定部74が、FIFOバッファ45にある生成指示41のアセンブリ命令と、ステップS11で呼び出されたニーモニック関数の各々の種類が異なるかどうかを判定する(ステップS12)。このとき、判定部74は、FIFOバッファ45が空かどうかも判定する。
ここで、FIFOバッファ45が空であるか、又は生成指示41のアセンブリ命令とニーモニック関数の各々の種類が同一である場合にはステップS13に移る。
ステップS13においては、格納部75が生成指示41をFIFOバッファ45に格納する。ステップS11でニーモニック関数のvpmovsxbd関数38が呼ばれた場合、生成指示41は、アセンブリ命令「vpmovsxbd」と等価な処理を行うArmv8-Aのアセンブリ命令の機械語を生成する指示となる。また、ステップS11でニーモニック関数のret関数51が呼ばれた場合、生成指示41は、アセンブリ命令「ret」と等価な処理を行うArmv8-Aのアセンブリ命令の機械語を生成する指示となる。
一方、FIFOバッファ45にある生成指示41のアセンブリ命令と、ステップS11で呼び出したニーモニック関数の各々の種類が異なる場合(ステップS12:肯定)にはステップS14に移る。一例として、FIFOバッファ45に格納されている生成指示41が示すアセンブリ命令が「vpmovsxbd」である場合に、ステップS11でニーモニック関数retが呼び出されたときにステップS14に移る。
ステップS14においては、生成部76が、FIFOバッファ45にある複数の生成指示41ごとに、生成指示41に係るアセンブリ命令「vpmovsxbd」と等価な処理を行うArmv8-Aのアセンブリ命令の機械語を生成する。
本実施形態では、図16のtranslateVPMOVSXBD関数56を実行することによりArmv8-Aのアセンブリ命令の機械語を生成する。
これにより、前述のように最初に命令列「sxtl v0.h8, v0.b16」、「sxtl v1.h8, v1.b16」、…「sxtl v3.h8, v3.b16」の機械語が生成され、次いで命令列「sxtl v0.s4, v0.h8」、「sxtl v1.s4, v1.h8」、…「sxtl v3.s4, v3.h8」の機械語が生成される。この命令列においては、依存関係のある複数のアセンブリ命令が連続して並ばない。
しかも、図16のtranslateVPMOVSXBD関数56の各forループ61、62は、変数「i」の値が小さい順にアセンブリ命令「sxtl」の機械語を生成する。変数「i」は、生成指示41がFIFOバッファ45に格納された順番を示しているため、先にFIFOバッファ45に格納された生成指示41から順に機械語が生成されることになる。そのため、vpmovsxbd関数38(図11参照)が呼ばれた順番と同じ順序でアセンブリ命令「sxtl」の機械語を生成できる。その結果、ソースコード32(図11参照)のようにvpmovsxbd関数38が複数回呼び出される場合でも、これと同じ順序でアセンブリ命令「vpmovsxbd」を実行したときと同一の実行結果となる機械語を生成できる。
その後に、生成部76がFIFOバッファ45を空にする。
次に、格納部75が生成指示41をFIFOバッファ45に格納する(ステップS15)。一例として、ステップS14で空になる前のFIFOバッファ45に格納されていた生成指示41が示すアセンブリ命令が「vpmovsxbd」命令であり、ステップS11でニーモニック関数retが呼び出された場合を考える。この場合にステップS15でFIFOバッファ45に格納される生成指示41が示すアセンブリ命令は「ret」命令となる。
この後は、generateJitCode関数34に記述されている全てのニーモニック関数の呼び出しを終えるまでステップS11~S15を繰り返す。
その後、生成部76が、FIFOバッファ45に残っている生成指示41に対応した機械語を生成する(ステップS16)。一例として、情報処理装置30が図11のgenJitCodeOfFifo関数35を実行することにより、FIFOバッファ45に残っている生成指示41に対応した機械語を生成する。
そして、出力部77が、生成部76が生成した機械語列を外部に出力する(ステップS17)。
以上により、本実施形態に係るアセンブリ命令変換方法の基本的な処理を終える。
上記した本実施形態によれば、x86_64のアセンブリ命令「vpmovsxbd」を取得する度に生成部76がArmv8-Aのアセンブリ命令「sxtl」の機械語を生成するのではなく、格納部75が各生成指示41を一旦FIFOバッファ45に格納する。そのため、生成部76が、同一のレジスタを使用するアセンブリ命令「sxtl」同士が連続して並ばないように、当該アセンブリ命令「sxtl」の機械語を生成することができる。その結果、これらの機械語をパイプライン処理するときにストールが発生せず、第2のターゲットマシン20がx86_64のアセンブリ命令「vpmovsxbd」と等価な処理を行うときのクロックサイクル数が増大するのを抑制できる。
特に、x86_64のアセンブリ命令「vpmovsxbd」と等価な処理は、同一の第2のベクトルレジスタ25を使用する二つのArmv8-Aのアセンブリ命令「sxtl」により実現される。例えば、「vpmovsxbd xmm0, xmm1」は、「v0」の第2のベクトルレジスタ25を使用する「sxtl v0.h8, v0.b16」と「sxtl v0.s4, v0.h8」により実現される。このように同一の第2のベクトルレジスタ25を使用する依存関係がArmv8-Aのアセンブリ命令に生じる場合に本実施形態を適用することにより、依存関係を解消してクロックサイクル数の増大を抑制できる。
また、図11のソースコード32のように、レジスタ番号「i」を変えながらvpmovsxbd関数38を複数回呼び出すと、上記のように同一の第2のベクトルレジスタ25を使用するアセンブリ命令「sxtl」が複数生成される。この場合に本実施形態を適用することでクロックサイクル数を大幅に抑制でき、プログラムの実行速度を速めることができる。
(第2実施形態)
第1実施形態では、FIFOバッファ45に格納された生成指示41を利用して機械語を生成した。これに対し、本実施形態では以下のようにFIFOバッファ45を不要とする。
第1実施形態では、FIFOバッファ45に格納された生成指示41を利用して機械語を生成した。これに対し、本実施形態では以下のようにFIFOバッファ45を不要とする。
図22は、本実施形態に係るアセンブリ命令変換プログラム31(図10参照)のC++の疑似ソースコード80の模式図である。なお、図22において、図11で説明したのと同じ要素には図11におけるのと同じ符号を付し、以下ではその説明を省略する。
図22に示すように、本実施形態においては、generateJitCode関数34のforループ37の前後に開発者がinsertDummyStart関数81とinsertDummyEnd関数82とを記述する。なお、insertDummyStart関数81は第1のダミー関数の一例であり、insertDummyEnd関数82は第2のダミー関数の一例である。
この例では、main関数33がgenerateJitCode関数34を呼び出すことにより、該generateJitCode関数34がvpmovsxbd関数38とret関数51とを呼び出す。そして、ニーモニック関数であるvpmovsxbd関数38とret関数51の各々がArmv8-Aアーキテクチャの機械語を生成する。
そして、main関数33の内部に記述されたreorderJitCode関数83が、generateJitCode関数34が生成した機械語を並べ替える。
図23は、generateJitCode関数34が生成した機械語列85の模式図である。
図23に示すように、機械語列85には、insertDummyStart関数81の機械語である第1のダミー機械語85aと、insertDummyEnd関数82の機械語である第2のダミー機械語85bが含まれる。
第1のダミー機械語85aと第2のダミー機械語85bは、いずれもArmv8-Aアーキテクチャで定義されていない無意味な機械語である。
その第1のダミー機械語85aと第2のダミー機械語85bとの間には、アセンブリ命令「vpmovsxbd」と等価な処理をする複数のアセンブリ命令「sxtl」の機械語85cが生成される。
そして、第2のダミー機械語85bの後に、ret関数51の機械語85dが生成される。
この時点では、隣接する機械語85c同士が同一の第2のベクトルレジスタ25を使用しているため、この機械語列85に対してパイプライン処理を実行すると図7のようにストールが発生する。
そこで、本実施形態では、以下のようにしてreorderJitCode関数83が機械語85cを並べ替える。
図24は、reorderJitCode関数83による機械語85cの並べ替えの方法について示す模式図である。
図24の例では、並び替えをする前に、reorderJitCode関数83が第1のダミー機械語85aの次の機械語85cから順に番号「0」、「1」、「2」、…を付ける。そして、偶数番の機械語85cが連続して出現し、その後に奇数番の機械語85cが連続して出現するように、reorderJitCode関数83が各機械語85cを並べ替える。その後、第1のダミー機械語85aと第2のダミー機械語85bを削除する。
これにより、同一の第2のベクトルレジスタ25を使用するアセンブリ命令「strl」の機械語85cが連続して並ばないようにすることができる。その結果、各機械語85cをパイプライン処理するときにストールが発生せず、第2のターゲットマシン20がx86_64のアセンブリ命令「vpmovsxbd」と等価な処理を行うときのクロックサイクル数が増大するのを抑制できる。
図25は、本実施形態に係る情報処理装置30の機能構成図である。
図25に示すように、情報処理装置30は制御部91を有する。制御部91は、情報処理装置30の各部を制御する処理部であって、生成部92、ソート部93、及び出力部94を有する。これらの各部は、図10のメモリ30bとプロセッサ30cとが協働してアセンブリ命令変換プログラム31のソースコード80(図22参照)を実行することにより実現される。
このうち、生成部92は、x86_64のアセンブリ命令「vpmovsxbd」と等価な処理を行うArmv8-Aのアセンブリ命令の機械語85cを、複数のアセンブリ命令「vpmovsxbd」ごとに複数生成する処理部である。例えば、情報処理装置30が、ソースコード80に記述されたgenerateJitCode関数34を実行することにより生成部92の機能を実現できる。
ソート部93は、依存関係のある機械語85c(図23参照)が連続して並ばないように機械語85cを並べ替える処理部であり、reorderJitCode関数83(図22参照)によって実現される。
一例として、ソート部93は、機械語列85において、第1のダミー機械語85aと第2のダミー機械語85bとの間にある機械語85cを特定する。各ダミー機械語85a、85bはArmv8-Aで定義されておらず、並び替えの始点と終点のみに出現する。そのため、ソート部93は、各ダミー機械語85a、85bを目印にして、並び替えの始点と終点を一意に特定できる。
そして、ソート部93は、図24に示したように、第1のダミー機械語85aの次の機械語85cから順に番号「0」、「1」、「2」、…を付ける。更に、ソート部93は、偶数番の機械語85cが連続して出現し、その後に奇数番の機械語85cが連続して出現するように各機械語85cを並べ替える。その後、ソート部93は、第1のダミー機械語85aと第2のダミー機械語85bを削除する。
出力部94は、このようにソート部93が並び替えた機械語85cを含む機械語列85を外部に出力する処理部である。
図26は、本実施形態に係るアセンブリ命令変換方法のフローチャートである。
まず、生成部92が、Armv8-Aの機械語列85を生成する(ステップS21)。例えば、情報処理装置30がgenerateJitCode関数34を実行することによって機械語列85を生成できる。これにより、アセンブリ命令「vpmovsxbd」と等価な処理を行うアセンブリ命令「sxtl」の機械語85cが、複数のアセンブリ命令「vpmovsxbd」ごとに複数生成される。
次に、ソート部93が、第1のダミー機械語85aと第2のダミー機械語85bとで挟まれた部分にある機械語85cを特定する(ステップS22)。
次いで、ソート部93が、特定した機械語85cを並べ替える(ステップS23)。例えば、ソート部93は、前述のように偶数番の機械語85cが連続して出現し、その後に奇数番の機械語85cが連続して出現するように各機械語85cを並べ替える。
その後、ソート部93が、第1のダミー機械語85aと第2のダミー機械語85bとを削除する(ステップS24)。
そして、出力部94が機械語列85を外部に出力する(ステップS25)。
以上により、本実施形態に係るアセンブリ命令変換方法の基本的な処理を終える。なお、「vpmovsxbd」とは別のx86_64アセンブリ命令においては、これと等価な処理を行うArmv8-Aのアセンブリ命令の個数が例えば3個の場合がある。この場合は、ソート部93が、機械語85cに付けた番号「0」、「1」、「2」、…を「3」で割ったときの余りを求め、同じ余りが連続して出現するように機械語85cを並べ替えてもよい。例えば、ソート部93が、余りが「0」の機械語85cが連続して出現し、次に余りが「1」の機械語85cが連続して出現し、最後に余りが「2」の機械語85cが連続して出現する順に各機械語85cを並べ替えてもよい。このように、本実施形態は、x86_64アセンブリ命令が、N個(Nは3以上の自然数)のArmv8-Aアセンブリ命令で実現される場合にも適用することができる。
上記した本実施形態によれば、図24に示したように、ソート部93が、依存関係のあるアセンブリ命令の機械語85cが連続して並ばないように、該機械語85cを並べ替える。これにより、各機械語85cをパイプライン処理してもストールが発生しないため、第2のターゲットマシン20がx86_64のアセンブリ命令「vpmovsxbd」と等価な処理を行うときのクロックサイクル数が増大するのを抑制できる。
10…第1のターゲットマシン、11…第1のプロセッサ、12…第1のメモリ、13…第1の計算コア、14…第1のレジスタファイル、15…第1のベクトルレジスタ、20…第2のターゲットマシン、21…第2のプロセッサ、22…第2のメモリ、23…第2の計算コア、24…第2のレジスタファイル、25…第2のベクトルレジスタ、30…情報処理装置、41…生成指示、45…FIFOバッファ、71…記憶部、72…制御部、73…呼び出し部、74…判定部、75…格納部、76…生成部、77…出力部、85…機械語列、91…制御部、92…生成部、93…ソート部、94…出力部。
Claims (12)
- 第1のアセンブリ命令と等価な処理を行う第2のアセンブリ命令の機械語の生成を指示する生成指示を、複数の前記第1のアセンブリ命令ごとに記憶領域に複数格納し、
前記記憶領域にある複数の前記生成指示に従って、依存関係のある複数の前記第2のアセンブリ命令の機械語が連続しないように前記機械語を生成する、
処理をコンピュータに実行させるためのアセンブリ命令変換プログラム。 - 前記第1のアセンブリ命令は、第1の命令セットに含まれるアセンブリ命令であり、
前記第2のアセンブリ命令は、前記第1の命令セットとは異なる第2の命令セットに含まれるアセンブリ命令であることを特徴とする請求項1に記載のアセンブリ命令変換プログラム。 - 前記第2の命令セットのレジスタに対応する前記第1の命令セットのレジスタが引数として指定された関数を、引数の前記レジスタを変えながら複数回呼び出すごとに、前記生成指示を前記記憶領域に格納することを特徴とする請求項2に記載のアセンブリ命令変換プログラム。
- 前記依存関係は、複数の前記第2のアセンブリ命令が同一のレジスタを使用する関係であることを特徴とする請求項1に記載のアセンブリ命令変換プログラム。
- オペランドに指定された前記レジスタが同一の複数の前記第2のアセンブリ命令によって前記第1のアセンブリ命令と等価な処理が行われることを特徴とする請求項4に記載のアセンブリ命令変換プログラム。
- 相互に異なる前記レジスタを使用する複数の前記第2のアセンブリ命令を要素とする複数のグループごとに前記機械語を生成する、
処理を前記コンピュータに実行させるための請求項3に記載のアセンブリ命令変換プログラム。 - 前記記憶領域はFIFO(First In First Out)バッファであり、
前記機械語を生成する処理は、
前記生成指示のうちで前記FIFOバッファに最も早くに格納された前記生成指示から順に行われることを特徴とする請求項1に記載のアセンブリ命令変換プログラム。 - 第1のアセンブリ命令と等価な処理を行う第2のアセンブリ命令の機械語を、複数の前記第1のアセンブリ命令ごとに複数生成し、
依存関係のある複数の前記第2のアセンブリ命令の各々の機械語が連続して並ばないように前記機械語を並べ替える、
処理をコンピュータに実行させるためのアセンブリ命令変換プログラム。 - 前記機械語を生成する関数の前に記述された第1のダミー関数と、前記関数の後に記述された第2のダミー関数とを検出したときに、前記機械語を並べ替える処理を前記コンピュータに実行させるための請求項8に記載のアセンブリ命令変換プログラム。
- 前記第1のアセンブリ命令は、第1の命令セットに含まれるアセンブリ命令であり、
前記第2のアセンブリ命令は、前記第1の命令セットとは異なる第2の命令セットに含まれるアセンブリ命令であり、
前記第1のダミー関数の機械語と、前記第2のダミー関数の機械語の各々は、前記第2の命令セットにおいて定義されていないことを特徴とする請求項9に記載のアセンブリ命令変換プログラム。 - コンピュータが、
第1のアセンブリ命令と等価な処理を行う第2のアセンブリ命令の機械語の生成を指示する生成指示を、複数の前記第1のアセンブリ命令ごとに記憶領域に複数格納し、
前記記憶領域にある複数の前記生成指示に従って、依存関係のある複数の前記第2のアセンブリ命令の機械語が連続しないように前記機械語を生成する、
処理を実行することを特徴とするアセンブリ命令変換方法。 - 第1のアセンブリ命令と等価な処理を行う第2のアセンブリ命令の機械語の生成を指示する生成指示を、複数の前記第1のアセンブリ命令ごとに記憶領域に複数格納する格納部と、
前記記憶領域にある複数の前記生成指示に従って、依存関係のある複数の前記第2のアセンブリ命令の機械語が連続しないように前記機械語を生成する生成部と、
を有することを特徴とする情報処理装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2020125185A JP2022021554A (ja) | 2020-07-22 | 2020-07-22 | アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 |
US17/210,559 US11321094B2 (en) | 2020-07-22 | 2021-03-24 | Non-transitory computer-readable medium, assembly instruction conversion method and information processing apparatus |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2020125185A JP2022021554A (ja) | 2020-07-22 | 2020-07-22 | アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2022021554A true JP2022021554A (ja) | 2022-02-03 |
Family
ID=80220505
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2020125185A Withdrawn JP2022021554A (ja) | 2020-07-22 | 2020-07-22 | アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 |
Country Status (2)
Country | Link |
---|---|
US (1) | US11321094B2 (ja) |
JP (1) | JP2022021554A (ja) |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS63138427A (ja) | 1986-11-29 | 1988-06-10 | Nec Corp | 配列に対する命令のスケジユ−リング処理方式 |
JPH04353923A (ja) | 1991-05-31 | 1992-12-08 | Nec Corp | 電子計算機の並列命令実行方式 |
US7337438B1 (en) * | 2003-03-31 | 2008-02-26 | Applied Micro Circuits Corporation | Macros to support structures for an assembler that does not support structures |
US7673293B2 (en) * | 2004-04-20 | 2010-03-02 | Hewlett-Packard Development Company, L.P. | Method and apparatus for generating code for scheduling the execution of binary code |
US9015655B2 (en) * | 2012-10-19 | 2015-04-21 | Northrop Grumman Systems Corporation | Generating a diverse program |
US9542211B2 (en) * | 2014-03-26 | 2017-01-10 | Intel Corporation | Co-designed dynamic language accelerator for a processor |
US9361458B1 (en) * | 2014-10-08 | 2016-06-07 | Trend Micro Incorporated | Locality-sensitive hash-based detection of malicious codes |
-
2020
- 2020-07-22 JP JP2020125185A patent/JP2022021554A/ja not_active Withdrawn
-
2021
- 2021-03-24 US US17/210,559 patent/US11321094B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
US11321094B2 (en) | 2022-05-03 |
US20220027161A1 (en) | 2022-01-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5646737B2 (ja) | 条件付き比較命令 | |
TWI279715B (en) | Method, system and machine-readable medium of translating and executing binary of program code, and apparatus to process binaries | |
US7480787B1 (en) | Method and structure for pipelining of SIMD conditional moves | |
JPS62197830A (ja) | デ−タ処理システム | |
US20170031682A1 (en) | Element size increasing instruction | |
JP2015201119A (ja) | コンパイルプログラム、コンパイル方法およびコンパイル装置 | |
JP6835436B2 (ja) | マスクをマスク値のベクトルに拡張するための方法および装置 | |
JP4228241B2 (ja) | 演算処理装置 | |
JPH04260930A (ja) | データ処理装置 | |
JPH04260927A (ja) | データ処理装置 | |
JP2002229778A (ja) | 高速ディスプレースメント付きpc相対分岐方式 | |
KR900010587A (ko) | 생산라인의 고성능 명령어 실행방법 및 장치 | |
TWI782060B (zh) | 用於在資料處理設備中比對連續值的設備、方法、電腦程式及電腦可讀取儲存媒體 | |
JP2022021554A (ja) | アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 | |
JPH04260929A (ja) | データ処理装置 | |
CN111522586B (zh) | 信息处理装置、非暂态计算机可读介质和信息处理方法 | |
KR20200028965A (ko) | 데이터 처리장치에서의 벡터 인터리빙 | |
TWI428822B (zh) | 微處理器及其相關方法 | |
JP7295469B2 (ja) | 関数生成プログラム、関数生成方法、及び情報処理装置 | |
JPH04260926A (ja) | ビット検索回路及びそれを備えたデータ処理装置 | |
JP2019067117A (ja) | コード生成装置、コード生成方法及びコード生成プログラム | |
JP2019185486A (ja) | コード変換装置、コード変換方法、及びコード変換プログラム | |
JP2024030940A (ja) | ソースコード変換プログラムおよびソースコード変換方法 | |
JP2021149807A (ja) | 情報処理装置及びコンパイラプログラム | |
JPH04260928A (ja) | データ処理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20230407 |
|
A761 | Written withdrawal of application |
Free format text: JAPANESE INTERMEDIATE CODE: A761 Effective date: 20240129 |