Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
JP5846005B2 - プログラム、コード生成方法および情報処理装置 - Google Patents
[go: Go Back, main page]

JP5846005B2 - プログラム、コード生成方法および情報処理装置 - Google Patents

プログラム、コード生成方法および情報処理装置 Download PDF

Info

Publication number
JP5846005B2
JP5846005B2 JP2012076510A JP2012076510A JP5846005B2 JP 5846005 B2 JP5846005 B2 JP 5846005B2 JP 2012076510 A JP2012076510 A JP 2012076510A JP 2012076510 A JP2012076510 A JP 2012076510A JP 5846005 B2 JP5846005 B2 JP 5846005B2
Authority
JP
Japan
Prior art keywords
instruction
instructions
tree
code
simd
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
JP2012076510A
Other languages
English (en)
Other versions
JP2013206289A (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 JP2012076510A priority Critical patent/JP5846005B2/ja
Priority to US13/794,938 priority patent/US8943484B2/en
Publication of JP2013206289A publication Critical patent/JP2013206289A/ja
Application granted granted Critical
Publication of JP5846005B2 publication Critical patent/JP5846005B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; 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
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]

Landscapes

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

Description

本発明はプログラム、コード生成方法および情報処理装置に関する。
現在、CPU(Central Processing Unit)などのプロセッサの中には、SIMD(Single Instruction Multiple Data)命令と呼ばれる1つの命令によって、異なるデータに対して同じ種類の演算を並列実行できるものがある。SIMD命令を実行するプロセッサは、並列に処理すべき異なるデータを組み合わせて格納するSIMDレジスタと呼ばれるレジスタを備える。例えば、SIMDレジスタs1にデータA1,A2が格納され、SIMDレジスタs2にデータB1,B2が格納された状態で、プロセッサにs1+s2というSIMD命令が入力されたとする。すると、プロセッサは、A1+B1およびA2+B2という2つの加算を、1命令で並列に実行することになる。
SIMD命令を含むコードを生成する方法としては、SIMD命令でない複数の命令の中から、演算の種類が同じであり並列に実行できる2以上の命令を検索し、検索した命令を組み合わせてSIMD命令を生成する方法がある。例えば、高級言語で記述されたソースコードを機械可読なオブジェクトコードに変換するコンパイラの中には、最適化処理の中で、2以上の命令を組み合わせてSIMD命令に変換するものがある。組み合わせ可能な命令の数(並列度)は、プロセッサのアーキテクチャによって異なる。
なお、ソースコードをRTL(Register Transfer Language)で記述された中間コードに変換し、中間コードから同じ種類の演算を異なるデータに適用している命令のセットを抽出し、SIMD命令に変換するプログラム処理方法が提案されている。また、複数の命令の間の依存関係を示すトレース依存性ツリーを生成し、同一のレベルに属する同じ種類の演算を指定した2以上の命令をトレース依存性ツリーから検索し、検索した命令を1つのSIMD命令にマージするコンピュータシステムが提案されている。
特開2003−202991号公報 国際公開第2006/007193号
SIMD命令を生成するには、依存関係がなく並列に実行可能な命令同士を組み合わせることになる。そこで、命令の組み合わせを探索する方法としては、前述のように、命令間の依存関係を示すツリーを利用する方法が考えられる。コードを解析して複数のツリー(1つの大きなツリーに属する複数の部分ツリーでもよい)が生成されたとき、ツリー同士を比較し、異なるツリーに属する演算の種類が同じ命令同士を組み合わせることによって、組み合わせのパターンを探すことができる。
しかし、コードを解析して生成される複数のツリーは、同じ形状をしているとは限らない。このため、前述のように同じレベルにある命令同士を比較するだけでは、適切な命令の組み合わせを見つけることができないことがある。このとき、異なるレベルにある命令同士を組み合わせることが可能な場合もある。一方で、SIMD命令に変換できる命令の組み合わせを多く見つけるために、ツリーの構造とは関係なく命令の組み合わせを全探索しようとすると、計算量が増大し非効率的となってしまう。
一側面では、本発明は、異なるデータに対して同じ種類の演算を並列実行するよう指示する命令を生成するための命令の組み合わせを効率的に探索できるプログラム、コード生成方法および情報処理装置を提供することを目的とする。
一側面では、第1のコードから、第1のコードに含まれる2以上の命令を組み合わせて、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令を生成することで、当該特定命令を含む第2のコードを生成するためのプログラムが提供される。プログラムはコンピュータに以下の処理を実行させる。第1のコードに含まれる命令の間の依存関係を示す第1および第2の演算木を生成し、第1の演算木の各命令で指定された演算を第1の演算木の構造に応じた順序で並べた第1の演算列と、第2の演算木の各命令で指定された演算を第2の演算木の構造に応じた順序で並べた第2の演算列とを算出する。第1および第2の演算列の少なくとも一方から1またはそれ以上の演算を削除することで現れる、第1および第2の演算列に共通のサブ演算列のうち、長さが最大である1またはそれ以上の最長サブ演算列を算出する。2以上の最長サブ演算列が算出されたとき、各最長サブ演算列について、当該最長サブ演算列に含まれる各演算に該当する第1の演算木の命令と第2の演算木の命令とを組み合わせた場合の、実行時の計算リソースの使用状況を評価し、評価結果に基づいて、何れかの最長サブ演算列が示す命令の組み合わせのパターンを選択する。
また、一側面では、第1のコードから、第1のコードに含まれる2以上の命令を組み合わせて、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令を生成することで、当該特定命令を含む第2のコードを生成する、コンピュータが実行するコード生成方法が提供される。コード生成方法では、第1のコードに含まれる命令の間の依存関係を示す第1および第2の演算木を生成し、第1の演算木の各命令で指定された演算を第1の演算木の構造に応じた順序で並べた第1の演算列と、第2の演算木の各命令で指定された演算を第2の演算木の構造に応じた順序で並べた第2の演算列とを算出する。第1および第2の演算列の少なくとも一方から1またはそれ以上の演算を削除することで現れる、第1および第2の演算列に共通のサブ演算列のうち、長さが最大である1またはそれ以上の最長サブ演算列を算出する。2以上の最長サブ演算列が算出されたとき、各最長サブ演算列について、当該最長サブ演算列に含まれる各演算に該当する第1の演算木の命令と第2の演算木の命令とを組み合わせた場合の、実行時の計算リソースの使用状況を評価し、評価結果に基づいて、何れかの最長サブ演算列が示す命令の組み合わせのパターンを選択する。
また、一側面では、第1のコードと、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令を含む第2のコードとを記憶する記憶部と、第1のコードに含まれる2以上の命令を組み合わせて特定命令を生成することで、第1のコードから第2のコードを生成する演算部と、を有する情報処理装置が提供される。演算部は、第1のコードに含まれる命令の間の依存関係を示す第1および第2の演算木を生成し、第1の演算木の各命令で指定された演算を第1の演算木の構造に応じた順序で並べた第1の演算列と、第2の演算木の各命令で指定された演算を第2の演算木の構造に応じた順序で並べた第2の演算列とを算出する。第1および第2の演算列の少なくとも一方から1またはそれ以上の演算を削除することで現れる、第1および第2の演算列に共通のサブ演算列のうち、長さが最大である1またはそれ以上の最長サブ演算列を算出する。2以上の最長サブ演算列が算出されたとき、各最長サブ演算列について、当該最長サブ演算列に含まれる各演算に該当する第1の演算木の命令と第2の演算木の命令とを組み合わせた場合の、実行時の計算リソースの使用状況を評価し、評価結果に基づいて、何れかの最長サブ演算列が示す命令の組み合わせのパターンを選択する。
一側面では、異なるデータに対して同じ種類の演算を並列実行するよう指示する命令を生成するための命令の組み合わせを効率的に探索できる。
第1の実施の形態の情報処理装置を示す図である。 端末装置が備えるハードウェア例を示すブロック図である。 端末装置が備えるソフトウェア例を示すブロック図である。 SIMD命令とSIMDレジスタの関係例を示す図である。 SIMDレジスタの実装例を示す図である。 命令間の依存関係の例を示す図である。 SIMD化により発生する転送命令の例を示す図である。 ソースコードの例を示す図である。 演算木の第1の例を示す図である。 LCSデータの例を示す図である。 LCSの算出方法の例を示す図である。 SIMDレジスタの第1の割り当て例を示す図である。 SIMDレジスタの第2の割り当て例を示す図である。 SIMDレジスタの第3の割り当て例を示す図である。 演算木の第2の例を示す図である。 クロスFMA命令の実行例を示す図である。 SIMD化処理の手順例を示すフローチャートである。 中間コードの例を示す図である。 命令データと演算木データの例を示す図である。 演算木リストの例を示す図である。 演算木生成処理の手順例を示すフローチャートである。 演算木の間の依存関係の例を示す図である。 依存判定処理の手順例を示すフローチャートである。 演算木組データと命令組データの例を示す図である。 命令組判定処理の手順例を示すフローチャートである。 LCSマッチング処理の手順例を示すフローチャートである。 SIMD化数解析処理の第1の手順例を示すフローチャートである。 SIMD化数解析処理の第2の手順例を示すフローチャートである。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。情報処理装置10は、第1のコード11aから、SIMD命令を含む第2のコード11bを生成する。第1のコード11aは、例えば、高級言語で記述されたソースコードや、ソースコードから変換された中間コードである。第2のコード11bは、例えば、情報処理装置10または他のコンピュータのプロセッサが解釈可能なオブジェクトコードや実行コードである。情報処理装置10は、ユーザが操作する端末装置としてのクライアントコンピュータでもよいし、端末装置からアクセスされるサーバコンピュータであってもよい。なお、SIMD命令は、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令の一例である。
情報処理装置10は、記憶部11および演算部12を有する。記憶部11は、第1のコード11aおよび第2のコード11bを記憶する。記憶部11は、RAM(Random Access Memory)などの揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置でもよい。演算部12は、第1のコード11aに含まれる2以上の命令を組み合わせてSIMD命令に変換することで、第2のコード11bを生成する。演算部12は、CPUやDSP(Digital Signal Processor)などのプロセッサでもよいし、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などのプロセッサ以外の電子回路でもよい。プロセッサは、例えば、記憶部11または他のメモリに記憶されたプログラムを実行する。
演算部12は、第1のコード11aに含まれる命令の間の依存関係を示す演算木13a,13bを生成する。依存関係には、一方の命令で算出されるデータを他方の命令で参照するという定義・参照の関係が含まれる。ここで、演算木13aに属する命令と演算木13bに属する命令とは異なる命令である。演算木13a,13bは、1つの大きな演算木に含まれる部分木であってもよい。演算部12は、3個以上の演算木を生成してもよい。
次に、演算部12は、演算木13aに属する各命令で指定された演算を、演算木13aの構造に応じた順序で並べた演算列14aを生成する。また、演算部12は、演算木13bに属する各命令で指定された演算を、演算木13bの構造に応じた順序で並べた演算列14bを生成する。演算には、加算(+),減算(−),乗算(×),除算(÷)が含まれる。また、演算には、べき乗演算(逆数・平方根・平方根の逆数などを求める演算を含む)、超越関数(sin,cos,log,expなどを含む)計算、剰余演算、符号変換、比較演算、メモリアクセス(Load,Storeなどをくむ)が含まれる。ツリー状に関連付けられた複数の演算を一列に並べる方法としては、帰り掛け深さ優先探索や、帰り掛け幅優先探索などのアルゴリズムを用いることができる。
次に、演算部12は、演算列14a,14bに共通のサブ演算列のうち、長さが最大である最長サブ演算列を算出する。サブ演算列は、元の演算列から、順序を入れ替えずに1またはそれ以上の演算を取り出したものである。演算列14aと演算列14bとが同一でない場合、共通のサブ演算列は、演算列14a,14bの少なくとも一方から1またはそれ以上の演算を削除することで現れる。このように算出される最長サブ演算列は、演算列14a,14bの最長共通部分列(LCS:Longest Common Subsequence)と呼ぶことができる。最長サブ演算列は、2以上算出されることがある。例えば、演算列14a=“+×÷+・・・”,演算列14b=“+÷÷−・・・”とする。この場合、演算列14aの1番目・3番目の演算と演算列14bの1番目・2番目の演算を採用した最長サブ演算列15a=“+÷・・・”と、演算列14aの1番目・3番目の演算と演算列14bの1番目・3番目の演算を採用した最長サブ演算列15b=“+÷・・・”とが算出される。
そして、演算部12は、算出された最長サブ演算列に基づいて、演算木13aに属する命令と演算木13bに属する命令との間の組み合わせを決定する。算出された最長サブ演算列が1個である場合、演算部12は、その最長サブ演算列に含まれる各演算に該当する演算木13aの命令と演算木13bの命令とを組み合わせてSIMD命令を生成する。一方、算出された最長サブ演算列が2個以上の場合、演算部12は、最長サブ演算列毎に、その最長サブ演算列に従ってSIMD命令を生成した場合の、実行時の計算リソースの使用状況を評価し、評価結果に基づいて何れか1つの最長サブ演算列を選択する。
ここで、命令の組み合わせ方によっては、SIMD命令に付随して、SIMDレジスタ間でデータを転送するための転送命令が生成されてしまうことがある。例えば、命令1:A1=B1+C1,命令2:A2=B2+C2,命令3:D1=A2×C1,命令4:D2=A3×C2という命令が存在し、SIMDの並列度が2であるとする。この場合、命令1,2を組み合わせてSIMD命令1を生成し、命令3,4を組み合わせてSIMD命令2を生成することが考えられる。しかし、SIMD命令1を実行するとデータA1,A2が同じSIMDレジスタに格納される一方、SIMD命令2を実行するにはデータA2,A3を同じSIMDレジスタに格納しておくことになる。よって、この組み合わせでは、SIMD命令1,2の間に転送命令が挿入されてしまう。転送命令が多いほど、生成される第2のコード11bの実行効率が低下する。
そこで、計算リソースの評価では、演算部12は、各最長サブ演算列を採用した場合に発生する転送命令の数を評価し、転送命令が少ない最長サブ演算列を選択してもよい。また、演算部12は、最長サブ演算列毎に、SIMD命令に変換することによる命令の減少量と、転送命令の発生による命令の増加量とを算出し、前者から後者を引いた実質的なSIMD効率を評価して、SIMD効率が高い最長サブ演算列を選択してもよい。
第1の実施の形態の情報処理装置10によれば、演算木13a,13bを演算列14a,14bに変換して最長サブ演算列を算出することで、命令の組が最も多くなるような演算木13a,13bの間の命令の組み合わせパターンを特定できる。このとき、演算木13a,13bの形状が同じでなくてもよく、また、組み合わせるべき2つの命令が演算木13a,13bの同じレベルに存在していなくてもよい。また、2以上の最長サブ演算列が算出されたときは、実行時の計算リソースの使用状況が有利になる最長サブ演算列が選択される。これにより、命令の組み合わせを効率的に探索することができる。
[第2の実施の形態]
図2は、端末装置が備えるハードウェア例を示すブロック図である。第2の実施の形態の端末装置100は、高級言語で記述されたソースコードをコンパイルして、機械可読なオブジェクトコードを生成し、複数のオブジェクトコードをリンクして、端末装置100または他のコンピュータに実行させる実行コードを生成する。ただし、第2の実施の形態で説明するコンパイルおよびリンクは、サーバコンピュータで実行することもできる。
端末装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、ディスクドライブ106および通信インタフェース107を有する。CPU101は、第1の実施の形態の演算部12の一例であり、RAM102やHDD103は、第1の実施の形態の記憶部11の一例である。
CPU101は、プログラムの命令を実行する演算器を含むプロセッサである。CPU101は、HDD103に記憶されているプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、端末装置100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列実行してもよい。
RAM102は、CPU101が実行するプログラムや計算に用いられるデータを一時的に記憶する揮発性メモリである。なお、端末装置100は、RAM以外の種類のメモリを備えてもよく、複数のメモリを備えてもよい。
HDD103は、OS(Operating System)やファームウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性記憶装置である。なお、端末装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、端末装置100に接続されたディスプレイ21に画像を出力する。ディスプレイ21としては、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイなどを用いることができる。
入力信号処理部105は、端末装置100に接続された入力デバイス22から入力信号を取得し、CPU101に通知する。入力デバイス22としては、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
ディスクドライブ106は、記録媒体23に記録されたプログラムやデータを読み取る駆動装置である。記録媒体23として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)を使用できる。ディスクドライブ106は、例えば、CPU101からの命令に従って、記録媒体23から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク24を介して他のコンピュータと通信を行えるインタフェースである。通信インタフェース107は、有線網に接続する有線インタフェースでもよいし、無線網に接続する無線インタフェースでもよい。
図3は、端末装置が備えるソフトウェア例を示すブロック図である。端末装置100は、ファイル記憶部110、コンパイラ120およびリンカ130を有する。ファイル記憶部110は、RAM102またはHDD103に確保した記憶領域として実現できる。コンパイラ120およびリンカ130は、CPU101が実行するプログラムのモジュールとして実現できる。ただし、コンパイラ120およびリンカ130の機能の一部または全部を、ソフトウェアでなく電子回路として実現することも可能である。
ファイル記憶部110は、ソースファイル111、オブジェクトファイル112および実行ファイル113を記憶する。ソースファイル111は、高級言語で記述されたソースコードを含む。オブジェクトファイル112は、SIMD命令を含む機械可読なオブジェクトコードを含む。実行ファイル113は、SIMD命令を解釈できる所定のアーキテクチャのプロセッサが実行できる形式のファイルである。なお、CPU101は、実行ファイル113を実行可能であってもよいし、実行可能でなくてもよい。
コンパイラ120は、ファイル記憶部110からソースファイル111を読み出し、ソースコードをオブジェクトコードに変換して、オブジェクトファイル112をファイル記憶部110に格納する。コンパイラ120は、入出力制御部121、ファイル入力部122、中間コード生成部123、中間コード記憶部124、最適化部125、アセンブリコード生成部128およびファイル出力部129を有する。
入出力制御部121は、ファイルの種類に応じた入出力方法を選択し、ファイル入力部122およびファイル出力部129を制御する。ファイル入力部122は、入出力制御部121からの指示に応じて、ソースファイル111をオープンし、ソースファイル111からソースコードを読み出す。中間コード生成部123は、ファイル入力部122が読み出したソースコードを解析して、コンパイラ120の内部で利用される中間言語で記述された中間コードに変換し、中間コードを中間コード記憶部124に格納する。ソースコードの解析には、字句解析、構文解析、意味解析などが含まれる。中間コード記憶部124は、RAM102に確保された記憶領域であり、中間コードを記憶する。
最適化部125は、中間コード記憶部124に記憶された中間コードを、実行速度が向上するように最適化する。最適化部125は、解析部126および最適化実行部127を有する。解析部126は、中間コードを解析して最適化方法を決定する。解析部126が行う最適化方法の決定には、中間コードに含まれる命令の中でSIMD命令に変換する命令の組み合わせを決定することを含む。最適化実行部127は、解析部126が決定した最適化方法に従って中間コードを最適化する。最適化実行部127が行う最適化には、中間コードに含まれる命令をSIMD命令に変換することを含む。
アセンブリコード生成部128は、最適化された中間コードを、低級言語であるアセンブリ言語で記述されたアセンブリコードに変換する。ファイル出力部129は、入出力制御部121からの指示に応じて、オブジェクトファイル112を生成する。そして、ファイル出力部129は、アセンブリコード生成部128が生成したアセンブリコードをオブジェクトコードに変換し、オブジェクトファイル112に書き込む。
リンカ130は、ファイル記憶部110からオブジェクトファイル112を読み出し、オブジェクトコードを解析して、参照されている他のオブジェクトファイルやライブラリを検出する。そして、リンカ130は、オブジェクトファイル112と、検出した他のオブジェクトファイルやライブラリとをリンクし、実行ファイル113を生成する。なお、コンパイラ120にリンカ130の機能が統合されていてもよい。
ここで、プロセッサ内でのSIMD命令の実行方法について説明する。
図4は、SIMD命令とSIMDレジスタの関係例を示す図である。SIMD命令を解釈できるプロセッサは、並列に処理されるデータを組み合わせて格納するSIMDレジスタを備える。各SIMDレジスタは、プロセッサのアーキテクチャによって決まる並列度に相当する数のサブレジスタを含む。図4は、並列度が2の場合を示している。
例えば、図4に示すように、A=B+C,X=Y+Zという2つの命令を1つのSIMD命令s1=s2+s3に変換した場合を考える。この場合、SIMDレジスタs2のサブレジスタ1にデータB、SIMDレジスタs2のサブレジスタ2にデータY、SIMDレジスタs3のサブレジスタ1にデータC、SIMDレジスタs3のサブレジスタ2にデータZを格納しておく。すると、SIMD命令によって、2つの加算が並列に実行されてデータA,Xが算出され、SIMDレジスタs1のサブレジスタ1にデータA、SIMDレジスタs1のサブレジスタ2にデータXが格納されることになる。
なお、同じ位置にあるサブレジスタの集合をスロットと呼ぶ。すなわち、SIMDレジスタs1,s2,s3の各サブレジスタ1はスロット1に属し、SIMDレジスタs1,s2,s3の各サブレジスタ2はスロット2に属する。SIMD命令では、同じスロットに属する複数のサブレジスタを用いて1つの演算が行われることになる。
図5は、SIMDレジスタの実装例を示す図である。プロセッサ内にSIMDレジスタを実装する方式としては、図5に示すような(A)分割方式と(B)結合方式がある。
分割方式では、1つの大きな物理レジスタを論理的に均等な大きさに分割して、複数のサブレジスタを形成する。並列度=2の場合は物理レジスタの記憶領域を2等分し、並列度=4の場合は物理レジスタの記憶領域を4等分する。物理レジスタの大きさを一定とすると、並列度が高いほど、各サブレジスタのビット数は小さくなる。分割方式では、SIMDレジスタは物理的なレジスタを指し、サブレジスタは論理的なレジスタを指す。
一方、結合方式では、ビット数が等しい複数の物理レジスタをグルーピングし、各物理レジスタをサブレジスタとして用いて、SIMDレジスタを形成する。並列度=2の場合は2個の物理レジスタの集合をSIMDレジスタとして扱い、並列度=4の場合は4個の物理レジスタの集合をSIMDレジスタとして扱う。物理レジスタの大きさを一定とすると、並列度が高いほど、SIMDレジスタのビット数は大きくなる。分割方式では、SIMDレジスタは論理的なレジスタを指し、サブレジスタは物理的なレジスタを指す。
次に、SIMD命令に変換する命令組を選択するときの問題点について説明する。
図6は、命令間の依存関係の例を示す図である。命令依存グラフ30は、中間コードに含まれる命令間の依存関係を示す。ここでは、コンパイラ120が1度に処理するコード範囲(翻訳単位)に、8個の命令が含まれている場合を考える。図6に示すように、命令1,2,3,8では乗算(×)が行われ、命令4,5,7では減算(−)が行われ、命令6では除算(÷)が行われる。命令4は命令1の演算結果を参照し、命令5は命令1,2の演算結果を参照し、命令6は命令4,5の演算結果を参照し、命令7は命令3の演算結果を参照し、命令8は命令6,7の演算結果を参照している。なお、図6では、理解を容易にするため、各命令を高級言語の形式で記載している。
このような命令依存グラフ30において、ルートからの深さが同じ命令(同じレベルの命令)の間で、SIMD命令に変換する(SIMD化する)命令の組み合わせを探すと、乗算を行う命令1,2の組と、減算を行う命令4,5の組が選択される。しかし、命令1,2および命令4,5という組み合わせは、以下に説明するように最適でない。
図7は、SIMD化により発生する転送命令の例を示す図である。命令1,2を組み合わせたSIMD命令を実行すると、命令1で算出されたデータA(I)と命令2で算出されたデータB(I)が、SIMDレジスタs1に格納される。一方で、命令4はデータA(I),V(I)を参照し、命令5はデータA(I),B(I)を参照する。そのため、命令4,5を組み合わせたSIMD命令を実行するには、データA(I),A(I)を同じSIMDレジスタに格納し、データV(I),B(I)を同じSIMDレジスタに格納しておくことになる。よって、2つのSIMD命令の間に転送命令が挿入される。図7の例では、データA(I)がSIMDレジスタs1からSIMDレジスタs4に転送され、SIMDレジスタs1のスロット1にデータV(I)がロードされている。
以上のようなSIMDレジスタ間のデータ転送は、レベルが異なる命令1,3を組み合わせてSIMD化し、レベルが異なる命令5,7を組み合わせてSIMD化すれば発生しない。このように、命令依存グラフ30において、同じレベルの命令同士を比較するだけでは、最適な命令の組み合わせを発見できない可能性がある。また、命令間の依存関係によっては、同じ種類の演算を行う命令が同じレベルに存在するとは限らない。これに対して、中間コードにおいて一定の範囲内にある命令の間の組み合わせを全通り試して、最適な組み合わせを探す方法も考えられる。しかし、命令組を全探索する方法は、一定範囲にある命令の数をNとすると計算量がO(NN)と大きくなってしまう。
そこで、最適化部125は、以下に説明するような方法で命令組を探索する。
図8は、ソースコードの例を示す図である。ソースファイル111のある翻訳単位に、図8に示すような10個の命令が含まれているとする。命令1,2,3,5,6,8,9,10では加算(+)が行われ、命令4,7で乗算(×)が行われる。命令4は命令1,2の演算結果を参照し、命令5は命令3,4の演算結果を参照する。命令9は命令6,7の演算結果を参照し、命令10は命令8,9の演算結果を参照する。すなわち、命令1〜5の集合と命令6〜10の集合とは、依存関係がなく並列に実行可能である。
図9は、演算木の第1の例を示す図である。最適化部125は、図8に示したソースファイル111から、図9のような演算木31,32を生成する。演算木31,32は、各命令で行われる演算、各命令で参照されるデータ、各命令によって定義される(算出される)データの間の関係を、木構造で表したものである。演算木31,32のリーフ(葉)には、一連の演算の出発点となるデータが記載され、ルート(根)には、一連の演算の結果として定義されるデータが記載される。上位のレベルの演算が下位のレベルの演算の結果を参照することで、リーフからルートに向かって演算が進行する。
演算木31は命令1〜5に基づいて生成され、演算木32は命令6〜10に基づいて生成される。上記の通り、命令1〜5の集合と命令6〜10の集合の間には依存関係がないため、演算木31と演算木32とは別個の木として生成されている。演算木31に属する命令と演算木32に属する命令とは、並列に実行することが可能である。そこで、最適化部125は、演算木31,32を用いて、SIMD化する命令の組を決定する。
SIMD化できる命令組を探すにあたり、最適化部125は、演算木31,32をそれぞれ演算列に変換する。まず、最適化部125は、演算木31,32のノードを、帰り掛け深さ優先探索または帰り掛け幅優先探索の方法で辿る。帰り掛け深さ優先探索で演算木31のノードを辿ると、E(I),F(I),+,A(I),B(I),+,C(I),D(I),+,×,+という記号列が生成される。ただし、ここでは定義側のデータの記載は省略している。同様に、帰り掛け深さ優先探索で演算木32のノードを辿ると、E(I+1),F(I+1),+,A(I+1),B(I+1),+,C(I+1),D(I+1),×,+,+という記号列が生成される。ここで生成される記号列は、一連の演算を逆ポーランド記法(後置記法)で記述したものに相当する。
そして、最適化部125は、演算木31,32それぞれから生成した記号列から、演算(+,−,×,÷など)のみを抽出し演算列とする。すなわち、演算木31に対応する演算列は+++×+となり、演算木32に対応する演算列は++×++となる。最適化部125は、演算木31,32から生成した2つの演算列のLCSを算出することで、演算木31の命令と演算木32の命令との間の組み合わせの候補を求める。
図10は、LCSデータの例を示す図である。LCSは、2つの系列の中に共通に含まれる部分列のうち最も長いものであり、ここで言う部分列とは、ある系列から順序を変更せずに1またはそれ以上の要素を取り出したものである。最適化部125は、2つの演算列の間のLCSを算出し、LCSを列挙したLCSデータ141を生成する。
演算木31に対応する演算列1=+++×+と演算木32に対応する演算列2=++×++の間のLCSは、長さが4であり、7通り存在する。7通りのLCSうち、1つは++++というパターンであり、残り6つは++×+というパターンである。
(1)演算列1の1,2,3,5番目と演算列2の1,2,4,5番目とを選択する。これは、命令3,8、命令1,6、命令2,9、命令5,10の組み合わせを意味する。
(2)演算列1の1,2,4,5番目と演算列2の1,2,3,4番目とを選択する。これは、命令3,8、命令1,6、命令4,7、命令5,9の組み合わせを意味する。
(3)演算列1の1,2,4,5番目と演算列2の1,2,3,5番目とを選択する。これは、命令3,8、命令1,6、命令4,7、命令5,10の組み合わせを意味する。
(4)演算列1の2,3,4,5番目と演算列2の1,2,3,4番目とを選択する。これは、命令1,8、命令2,6、命令4,7、命令5,9の組み合わせを意味する。
(5)演算列1の2,3,4,5番目と演算列2の1,2,3,5番目とを選択する。これは、命令1,8、命令2,6、命令4,7、命令5,10の組み合わせを意味する。
(6)演算列1の1,3,4,5番目と演算列2の1,2,3,4番目とを選択する。これは、命令3,8、命令2,6、命令4,7、命令5,9の組み合わせを意味する。
(7)演算列1の1,3,4,5番目と演算列2の1,2,3,5番目とを選択する。これは、命令3,8、命令2,6、命令4,7、命令5,10の組み合わせを意味する。
図11は、LCSの算出方法の例を示す図である。最適化部125は、例えば、動的計画法に基づいて、図11に示すようなマトリクスMを作成してLCSを算出する。まず、演算列1を第1行〜第5行に対応付け、演算列2を第1列〜第5列に対応付ける。また、第0行の各欄(M[0,0]〜M[0,5])と第0列の各欄(M[0,0]〜M[5,0])の値を全て0に設定する。そして、次のルールに従って、マトリクスMの左上(M[1,1])から右下(M[5,5])に向かって各欄の値を計算していく。
M[i,j]の値は、演算列1のi番目の演算と演算列2のj番目の演算が一致している場合、(a1)左上の欄M[i−1,j−1]の値+1,(b1)左の欄M[i,j−1]の値,(c1)上の欄M[i−1,j]の値の中から、最も大きいものを選択する。また、演算列1のi番目の演算と演算列2のj番目の演算が異なる場合、(a2)左上の欄M[i−1,j−1]の値,(b2)左の欄M[i,j−1]の値,(c2)上の欄M[i−1,j]の値の中から、最も大きいものを選択する。
上記のルールで算出されるM[5,5]の値が、演算木31,32の間のLCSの長さを示す。そして、M[5,5]からマトリクスMの左上に向かって、M[5,5]の値が算出されたときのパスを逆方向に辿ることで、LCSを算出することができる。LCSに含まれる演算は、M[5,5]から左上に向かってパスを辿ったときに、値が減少する直前の欄の行・列に対応付けられている演算である。例えば、M[4,3]=3からM[3,2]=2を辿った場合、M[4,3]に対応する演算×がLCSに含まれる。
LCSの長さが4であることは、最大で、演算木31に属する4つの命令と演算木32に属する4つの命令とを組み合わせて4つのSIMD命令を生成できることを意味する。上記の7通りのLCSが示す命令の組み合わせのパターンは、SIMD命令に変換できる命令の数に差異がない。ただし、7通りの組み合わせパターンの何れを採用するかによって、生成されるオブジェクトコードの実行効率に違いが生じる。また、4つの命令組をSIMD化できる場合であっても、そのうち一部の命令組をSIMD化しない方が、生成されるオブジェクトコードの実行効率が高くなる場合もある。
図12は、SIMDレジスタの第1の割り当て例を示す図である。ここでは、上記の1番目の組み合わせパターンを採用し、4つの命令組を全てSIMD化した場合を考える。図12に示すように、4つのSIMD命令を実行するために、12個のSIMDレジスタが使用される。また、命令1,6から生成された2番目のSIMD命令と、命令2,9から生成された3番目のSIMD命令の間に、転送命令が1つ挿入されている。
すなわち、SIMD化による命令の減少数が4である一方、転送命令の発生による命令の増加数が1であるため、転送命令による損失なしにSIMD化できた命令の数(実効SIMD化数)は3である。ここで、もし命令2,9をSIMD化しなければ(3番目のSIMD命令s11=s10+s7を生成しなければ)、転送命令は発生しない。
図13は、SIMDレジスタの第2の割り当て例を示す図である。ここでは、上記の1番目の組み合わせパターンに含まれる4つの命令組のうち、命令2,9をSIMD化せずに、残りの3つの命令組をSIMD化した場合を考える。図13のSIMD化方法では、使用されるSIMDレジスタの数および命令の総数は、図12の場合と同じである。ただし、図13のSIMD化方法では、SIMD命令間に転送命令が挿入されていない。転送命令が存在すると、転送命令とその前後にあるSIMD命令の間に依存関係が生じることから、命令の実行順序に制約が生じ、オブジェクトコードの実行効率が低下するおそれがある。よって、図13のSIMD化方法の方が、図12よりも有利であると言える。
図14は、SIMDレジスタの第3の割り当て例を示す図である。ここでは、上記の2番目の組み合わせパターンを採用し、4つの命令組を全てSIMD化した場合を考える。図14のSIMD化方法では、使用されるSIMDレジスタの数は12であり、命令の総数は8である。また、転送命令が2個挿入されており、実効SIMD化数は2である。従って、図14のSIMD化方法は、図12,13のSIMD化方法より不利である。
以上のように、最適化部125は、算出されたLCSが示す命令の組み合わせパターンそれぞれについて、当該組み合わせパターンに含まれる一部または全部の命令組をSIMD化した場合の、プロセッサのリソースの使用状況を評価する。最適化部125は、リソースの使用状況が最も有利なSIMD化方法を採用すればよい。リソースの使用状況を評価するための評価指標としては、使用するSIMDレジスタの数、命令の総数、転送命令の数、実効SIMD化数などを用いることができる。また、評価指標として、メモリの使用領域の大きさ、クリティカルパス(命令間の依存関係が直列的に並んだパスのうち最長のもの)の長さ、実行時間、プロセッサの消費電力などを用いることもできる。
前述の7通りの組み合わせパターンを実効SIMD化数の観点から評価すると、1番目および3番目の組み合わせパターンが最適であると判定される。なお、以上説明した例では、四則演算(加算・減算・乗算・除算)を行う命令をSIMD化したが、他の種類の演算やメモリアクセスを行う命令をSIMD化することもできる。また、以上説明した例では、形状が同じ演算木31,32からSIMD化する命令組を決定したが、形状が異なる2つの演算木からSIMD化する命令組を決定することもできる。
図15は、演算木の第2の例を示す図である。演算木33は命令11〜17に基づいて生成される。命令11,13,14,15,17では加算(+)が行われ、命令12,16では乗算(×)が行われる。命令13は命令11,12の演算結果を参照し、命令16は命令13,14の演算結果を参照し、命令17は命令15,16の演算結果を参照する。演算木32に属する命令と演算木33に属する命令の間には、依存関係がない。
演算木32,33から、上記の演算木31,32の場合と同様の方法でSIMD化する命令組を探索すると、次の5つの命令組が選択される:命令6,11、命令7,12、命令9,13、命令8,15、命令10,17。このように、最適化部125は、異なる形状の2つの演算木から、SIMD化する命令組を探索できる。このとき、異なるレベルにある命令の組が、SIMD化する命令組として選択されることがある。
次に、一部のプロセッサのアーキテクチャでサポートされているクロスFMA(Fused Multiply and Add)命令について説明する。FMA命令は、乗算と加算または減算とを組み合わせた演算を指定する命令である。例えば、A×B+Cという演算を、1つのFMA命令で指定することができる。演算の種類が同じ2以上のFMA命令を組み合わせてSIMD命令に変換することもできる。例えば、A×B+CというFMA命令とX×Y+ZというFMA命令を、1つのSIMD命令に変換することができる。
クロスFMA命令は、FMA命令から生成されたSIMD命令を拡張したものである。クロスFMA命令では、転送命令がなくても仮想的にスロット間でデータの転送やコピーが行われたものと仮定して、当該データに対して演算が行われる。例えば、A×B+C,X×Y+Cという演算をクロスFMA命令で指定すると、データCをコピーしておかなくても、クロスFMA命令の中でデータCが仮想的にコピーされたものとして扱われる。
実行ファイル113が、クロスFMA命令をサポートするプロセッサに実行させるものである場合、クロスFMA命令を利用することで、SIMD化に伴う転送命令の発生を回避できることがある。そこで、最適化部125は、クロスFMA命令を利用可能であるか否かを考慮して、各SIMD化方法に対応するリソースの使用状況を評価する。なお、FMA命令でない命令を組み合わせてクロスFMA命令を生成するには、乗算対象のデータの1つを“1”にするか、加算対象のデータの1つを“0”にすればよい。
図16は、クロスFMA命令の実行例を示す図である。ここでは、ソースコードに次の4つの命令が含まれている場合を考える。命令1:C2.real=C1.real+R1,命令2:C2.img=C1.img+R1,命令3:C3.real=C2.real×R2,命令4:C3.img=C2.img×R2。
命令1はC2.real=C1.real×1.0+R1と解釈し、命令2はC2.img=C1.img×1.0+R1と解釈することで、FMA命令に置き換えられる。また、命令3はC3.real=C2.real×R2+0と解釈し、命令4はC3.img=C2.img×R2+0と解釈することで、FMA命令に置き換えられる。そこで、命令1,2および命令3,4の組から、クロスFMA命令を生成することにする。
例えば、SIMDレジスタs1にC1.real,C1.imgを格納し、SIMDレジスタs2にR1,R2を格納し、SIMDレジスタs3に1.0,1.0を格納する。この状態で、命令1,2から生成されたクロスFMA命令を実行すると、SIMDレジスタs2のR1が仮想的にコピーされたものとして扱われて、C2.real,C2.imgが算出される。このとき、SIMDレジスタs2のR1は、物理的に移動しているわけではない。同様に、SIMDレジスタs4に0,0を格納した状態で、命令3,4から生成されたクロスFMA命令を実行すると、SIMDレジスタs2のR2が仮想的にコピーされたものとして扱われて、C3.real,C3.imgが算出される。このとき、SIMDレジスタs2のR2は、物理的に移動しているわけではない。
次に、解析部126で実行される処理の手順について説明する。
図17は、SIMD化処理の手順例を示すフローチャートである。
(ステップS1)解析部126は、中間コード記憶部124から、1つの翻訳単位の中間コードを読み出し、読み出した中間コードに含まれる命令の間の依存関係を解析する。そして、解析部126は、命令間の依存関係に従って、複数の演算木を生成する。
(ステップS2)解析部126は、ステップS1で生成した演算木の間の依存関係を確認する。演算木の間の依存関係は、ある演算木のルートノードと他の演算木のルートノード、および、ある演算木のリーフと他の演算木のルートノードを比較することで確認できる。
(ステップS3)解析部126は、ステップS1で生成した複数の演算木の間の組み合わせと、各組の演算木の中におけるSIMD化する命令の組み合わせとを決定する。このとき、ステップS2で依存関係があると判断された演算木同士は、組み合わせないようにする。1つの組に属する演算木の数は、SIMDの並列度と一致させる。ステップS3の処理は、以下のステップS3a,S3b,S3cの処理を含む。
(ステップS3a)解析部126は、演算木の組を1つ選択する。
(ステップS3b)解析部126は、ステップS3aで選択した組に属する演算木それぞれを演算列に変換し、複数の演算列の間のLCSを全て算出する。
(ステップS3c)解析部126は、ステップS3bで算出したLCS毎に、そのLCSが示す命令の組み合わせパターンを採用した場合のリソースの利用状況を評価する。そして、解析部126は、評価結果が最良の命令の組み合わせを選択する。
以下では、図17に示した処理手順の実装例について説明する。まず、中間コードから演算木を生成する手順について説明する。
図18は、中間コードの例を示す図である。中間コード142は、中間コード記憶部124に記憶される。中間コード142のある1つの翻訳単位には、命令1〜12が含まれている。命令1,2,4,6,7,9は、RAMからデータを読み出すためのLOAD命令であり、命令12は、RAMにデータを書き込むためのSTORE命令である。命令3,8はMULT(乗算)命令であり、命令5,10,11はADD(加算)命令である。
命令3は命令1,2に依存し、命令5は命令3,4に依存し、命令8は命令6,7に依存し、命令10は命令8,9に依存し、命令11は命令5,10に依存し、命令12は命令11に依存している。なお、図18に記載したR01,R02,R03,R04,R05,R06,R07,R08,R09,R10,R11は、論理的なレジスタを示す。
解析部126は、命令列を後方から前方に向かって走査し、命令間の依存関係を解析して演算木を生成する。上記の命令1〜12からは1つの演算木が生成される。ここで、1つの演算木の中で表現する依存関係は、木構造にするため、ある命令により1回だけ定義され他の命令により1回だけ参照されるレジスタに関する依存関係に限定する。
図19は、命令データと演算木データの例を示す図である。解析部126は、中間コード142から命令を1つずつ抽出して命令データ151を生成し、命令データ151を解析して命令の依存関係を判定することで演算木データ152を生成する。
命令データ151は、命令毎に、命令番号、命令名、定義オペランド、参照オペランド、前命令および後命令の項目を含む。命令番号は、各命令を識別するための番号である。命令名は、演算の種類を示す名称(ADD,SUB,MULT,DIVなど)である。定義オペランドの項目には、中間コード142で使用されている論理的なレジスタの識別子であって、演算結果のデータを格納するレジスタの識別子が設定される。参照オペランドの項目には、参照されるデータを格納する1またはそれ以上のレジスタの識別子が設定される。前命令の項目には、中間コード142において1つ前の命令を示す命令番号が設定される。後命令の項目には、1つ後の命令を示す命令番号が設定される。
演算木データ152は、ノードデータおよびリーフデータを含む。
ノードデータは、ノード番号、命令番号、親ノード番号および子ノード番号の項目を含む。ノード番号は、演算木の各ノードを識別するための番号である。命令番号は、命令データ151に含まれるものと同じである。命令番号によって、命令データ151と演算木データ152とが関連付けられる。親ノード番号は、自ノードの命令の定義オペランドを参照している他の命令に対応するノード番号である。子ノード番号は、自ノードの命令の参照オペランドを定義した他の命令に対応するノード番号である。親ノード番号と子ノード番号によって、複数のノードに対応するノードデータが相互に関連付けられる。
リーフデータは、リーフ番号、オペランドおよび親ノード番号の項目を含む。リーフ番号は、演算木の各リーフを識別するための番号である。オペランドの項目には、データをレジスタにロードするときにアクセスするRAMの記憶領域を示す識別子が設定される。親ノード番号は、そのリーフと依存関係にあるノードに対応するノード番号である。
図20は、演算木リストの例を示す図である。解析部126は、演算木データ152を含む複数の演算木に相当する演算木データから、演算木リスト153を生成する。演算木リスト153は、演算木毎に、演算木番号、ルートノード番号、ルート命令番号、ノード数およびリーフ数の項目を含む。演算木番号は、各演算木を識別するための番号である。ルートノード番号は、演算木のルートノードに付与された番号である。ルート命令番号は、ルートノードに対応する命令を示す命令番号である。ノード数は、演算木に含まれるノードの数である。リーフ数は、演算木に含まれるリーフの数である。
図21は、演算木生成処理の手順例を示すフローチャートである。このフローチャートが示す処理は、前述のステップS1において実行される。
(ステップS111)解析部126は、翻訳単位内の命令列の後方から優先的に、命令を1つ選択する。(ステップS112)解析部126は、選択した命令が既に何れかの演算木に属しているか判断する。命令が何れかの演算木に属する場合、処理をステップS111に進め、それ以外の場合は処理をステップS113に進める。(ステップS113)解析部126は、選択した命令で行う演算が、SIMD化の対象となる演算であるか判断する。SIMD化対象とならない演算には、例えば、分岐命令やバリア命令などの制御命令が含まれる。SIMD化対象となる演算である場合、処理をステップS114に進め、SIMD化対象とならない演算である場合、処理をステップS124に進める。
(ステップS114)解析部126は、ステップS111で選択した命令に対応するノードを、ルートノードとして生成する。また、解析部126は、選択した命令の参照オペランドを抽出する。(ステップS115)解析部126は、未処理の参照オペランドを1つ選択する。(ステップS116)解析部126は、命令データ151から、選択した参照オペランドと同じレジスタを定義オペランドにもつ他の命令(定義命令)を検索する。(ステップS117)解析部126は、ステップS115で選択した参照オペランドであるレジスタが、翻訳単位内で、1つの命令によって1回だけ定義され、1つの命令によって1回だけ参照されるものであるか判断する。条件を満たす場合は処理をステップS118に進め、条件を満たさない場合は処理をステップS120に進める。
(ステップS118)解析部126は、ステップS115で選択した参照オペランドをもつ命令(参照命令)と定義命令との間の依存関係が、複数の演算木を跨がる依存関係であるか判断する。条件を満たす場合は処理をステップS120に進め、条件を満たさない場合は処理をステップS119に進める。(ステップS119)解析部126は、ステップS116で検索された定義命令に対応するノードを生成し、処理をステップS121に進める。また、解析部126は、定義命令から参照オペランドを抽出する。(ステップS120)解析部126は、ステップS115で選択した参照オペランドに対応するリーフを生成する。(ステップS121)解析部126は、参照命令に対応するノードと、定義命令に対応するノードまたはリーフの間の親子関係を、演算木データ152に登録する。
(ステップS122)解析部126は、ステップS114およびステップS119で抽出された参照オペランドが、全て処理されたか判断する。未処理の参照オペランドがある場合は処理をステップS115に進め、全ての参照オペランドを処理した場合は処理をステップS123に進める。(ステップS123)解析部126は、ステップS111で選択した命令をルートとする演算木が完成したと判断し、完成した演算木を演算木リスト153に登録する。(ステップS124)解析部126は、翻訳単位内の全ての命令をステップS111において選択したか判断する。全ての命令を選択した場合は処理を終了し、未選択の命令がある場合は処理をステップS111に進める。
次に、演算木間の依存関係を確認する手順について説明する。
図22は、演算木の間の依存関係の例を示す図である。演算木間の依存関係は、一方の演算木に属する命令と他方の演算木に属する命令との間に実行順序の制約がある関係であり、一方の演算木に属する命令で定義されるレジスタが、他の演算木に属する命令で参照される関係を含む。ここでは、演算木A,B,C,Dが生成された場合を考える。
演算木Aのリーフの参照オペランドはmem01,mem02であり、演算木Aのルートノードの定義オペランドはR03である。演算木Bのリーフの参照オペランドはmem05であり、演算木Bのルートノードの定義オペランドはR08である。演算木Cのリーフの参照オペランドはmem03,mem04であり、演算木Cのルートノードの定義オペランドはmem05である。演算木Dのリーフの参照オペランドはR03,R08であり、演算木Dのルートノードの定義オペランドはmem07である。中間コード142では、演算木A,B,C,Dの順に命令が並んでいるとする。
上記の図21の手順で演算木を生成した場合、解析部126は、各演算木のルートノードの定義オペランドとリーフの参照オペランドを確認すれば、依存関係を確認できる。2つの演算木のルートノードの定義オペランドが同じであるか、または、一方の演算木のリーフの参照オペランドと他方の演算木のルートノードの定義オペランドとが同じであるとき、2つの演算木は依存関係をもつ。図22の例の場合、演算木Cは演算木A,Bの両方に依存し、演算木Dも演算木A,Bの両方に依存する。演算木C,Dの間には依存関係がないため、演算木Cの命令と演算木Dの命令は並列に実行できる。なお、3つ以上の演算木の間の依存関係には、推移律が成立する。例えば、演算木Cに依存する演算木Eが存在する場合、この演算木Eは演算木Aにも依存していると言える。
図23は、依存判定処理の手順例を示すフローチャートである。このフローチャートが示す処理は、前述のステップS2において実行される。
(ステップS131)解析部126は、複数の演算木のうち、演算木番号の小さいものを優先的に、演算木#1として1つ選択する。(ステップS132)解析部126は、複数の演算木のうち、演算木#1より演算木番号の大きいものを、演算木#2として1つ選択する。(ステップS133)解析部126は、演算木#1,#2のルートノードの定義オペランドが同一であるか判断する。同一である場合は処理をステップS135に進め、同一でない場合は処理をステップS134に進める。(ステップS134)解析部126は、演算木#2のリーフの参照オペランドの中に、演算木#1のルートノードの定義オペランドが含まれているか判断する。条件を満たす場合は処理をステップS135に進め、条件を満たさない場合は処理をステップS136に進める。
(ステップS135)解析部126は、演算木#1から演算木#2への依存関係(演算木#2が演算木#1に依存する関係)があると判定する。(ステップS136)解析部126は、ステップS132において演算木#1よりも演算木番号の大きい演算木を全て選択したか判断する。全て選択した場合は処理をステップS137に進め、未選択の演算木がある場合は処理をステップS132に進める。(ステップS137)解析部126は、ステップS131において全ての演算木を選択したか判断する。全て選択した場合は処理を終了し、未選択の演算木がある場合は処理をステップS131に進める。
次に、SIMD化する命令組を決定する手順について説明する。
図24は、演算木組データと命令組データの例を示す図である。解析部126は、SIMD化する命令組を決定すると、演算木組データ154および命令組データ155を生成する。また、解析部126は、SIMD化する命令組を探索している間、一時保存データ156を生成してRAM102上に保存しておく。
演算木組データ154は、演算木の組毎に、木組番号、演算木番号および命令組番号の項目を含む。木組番号は、演算木の組を識別するための番号である。演算木番号の項目には、組み合わせた各演算木を識別するための番号が列挙される。列挙される演算木番号の数は、SIMDの並列度に一致する。命令組番号の項目には、命令組データ155で定義された命令組番号のうち、その演算木の組についての命令組を示す命令組番号が列挙される。演算木組データ154と命令組データ155とは、命令組番号で関連付けられる。
命令組データ155は、命令の組毎に、命令組番号、命令番号およびSIMD命令位置の項目を含む。命令組番号は、命令の組を識別するための番号である。命令番号の項目には、組み合わせた各命令を識別するための番号が列挙される。列挙される命令番号の数は、SIMDの並列度、すなわち、演算木組データ154の演算木番号の項目に列挙される演算木番号の数に一致する。SIMD命令位置の項目には、中間コード142において、生成したSIMD命令を埋め込む位置を示す情報が設定される。
一時保存データ156は、演算木番号、最大LCS長および最大実効SIMD化数の項目を含む。演算木番号の項目は、確定前の演算木の組の候補の中で、現時点で最良と判断した演算木の組を示す。以下の説明では、実効SIMD化数を用いて演算木の組の優劣を評価するものとする。最大LCS長は、最良と判断した演算木の組のLCS長である。最大実効SIMD化数は、最良と判断した演算木の組についての実効SIMD化数のうち、最良な命令の組み合わせパターンを選択したときの値(最大値)である。
図25は、命令組判定処理の手順例を示すフローチャートである。このフローチャートが示す処理は、前述のステップS3において実行される。
(ステップS141)解析部126は、生成された演算木が、全ての組み合わせを探索できる程度の量であるか、すなわち、演算木の数が閾値以下であるか判断する。閾値は、端末装置100の計算能力に応じて変更してもよい。演算木の数が閾値以下の場合は処理をステップS144に進め、閾値を超える場合は処理をステップS142に進める。(ステップS142)解析部126は、後述する方法により、ノード数の多い演算木から優先的に他の演算木との間のLCSを算出し、演算木の組を1つ決定する。(ステップS143)解析部126は、全ての演算木を処理したか判断する。全ての演算木を処理した場合は処理を終了し、未処理の演算木がある場合は処理をステップS142に進める。
(ステップS144)解析部126は、演算木の組み合わせパターンを全て算出する。例えば、SIMDの並列度が2である場合、演算木を2個ずつ組にするパターンを全て算出する。(ステップS145)解析部126は、ステップS144で算出したパターンを1つ選択する。(ステップS146)解析部126は、選択した演算木の組み合わせパターンについて、最適な命令の組み合わせを選択した場合の実効SIMD化数を算出する。この処理は、後述するLCSマッチング処理のアルゴリズムの一部を用いて実現される。
(ステップS147)解析部126は、ステップS146で算出した実効SIMD化数が、現時点の最大実効SIMD化数以上である場合、最大実効SIMD化数を更新する。(ステップS148)解析部126は、ステップS145で全ての演算木の組み合わせパターンを選択したか判断する。全て選択した場合は処理をステップS149に進め、未選択のパターンがある場合は処理をステップS145に進める。(ステップS149)解析部126は、最大実効SIMD化数が算出されたときの演算木の組み合わせ、および、その演算木の組み合わせ内での命令の組み合わせを採用する。
図26は、LCSマッチング処理の手順例を示すフローチャートである。このフローチャートが示す処理は、前述のステップS142において実行される。また、ステップS153〜S161の処理は、前述のステップS146でも利用される。なお、図26に示す処理ではSIMDの並列度が2である場合を考える。
(ステップS151)解析部126は、演算木組データ154に未登録の演算木(まだ他の演算木と組み合わせることが決定していない演算木)の中から、ノード数が最大のもの1つを演算木#1として選択する。解析部126は、演算木#1を選択する毎に、前述の一時保存データ156を初期化する。(ステップS152)解析部126は、演算木#1以外の演算木であって、演算木組データ154に未登録の演算木の中から、ノード数の多い方から優先的に1つを演算木#2として選択する。
(ステップS153)解析部126は、演算木#1,#2の間に依存関係があるか判断する。依存関係がある場合は処理をステップS162に進め、依存関係がない場合は処理をステップS154に進める。(ステップS154)解析部126は、演算木#2のノード数が、現時点の最大LCS長以上であるか判断する。ノード数が最大LCS長以上の場合は処理をステップS155に進め、最大LCS長未満の場合は処理をステップS162に進める。(ステップS155)解析部126は、演算木#1,#2の間のLCSを算出する。(ステップS156)解析部126は、算出したLCSの長さが、現時点の最大LCS長以上であるか判断する。LCS長が最大LCS長以上の場合は処理をステップS157に進め、最大LCS長未満の場合は処理をステップS162に進める。
(ステップS157)解析部126は、ステップS155で算出したLCSを1つ選択する。(ステップS158)解析部126は、後述する方法により、選択したLCSが示す演算木#1,#2の間の命令の組み合わせパターンについて、1またはそれ以上の命令組を採用して実効SIMD化数を算出する。(ステップS159)解析部126は、ステップS158で算出した実効SIMD化数が、現時点の最大実効SIMD化数以上であるか判断する。実効SIMD化数が最大実効SIMD化数以上の場合は処理をステップS160に進め、最大実効SIMD化数未満の場合は処理をステップS161に進める。
(ステップS160)解析部126は、演算木#1,#2の組を一時保存データ156に登録し、最大LCS長と最大実効SIMD化数を更新する。また、解析部126は、ステップS158で実効SIMD化数を算出するにあたって採用した命令の組を保存しておく。(ステップS161)解析部126は、ステップS157で全てのLCSを選択したか判断する。全て選択した場合は処理をステップS162に進め、未選択のLCSがある場合は処理をステップS157に進める。(ステップS162)解析部126は、ステップS152で条件に当てはまる全ての演算木を選択したか判断する。全て選択した場合は処理をステップS163に進め、未選択の演算木がある場合は処理をステップS152に進める。(ステップS163)解析部126は、一時保存データ156の演算木組および最良の1またはそれ以上の命令組を、演算木組データ154に登録する。
図27は、SIMD化数解析処理の第1の手順例を示すフローチャートである。このフローチャートが示す処理は、前述のステップS158において実行される。
(ステップS171)解析部126は、LCSに基づいて、演算木#1に属する命令と演算木#2に属する命令との組を1つ選択する。(ステップS172)解析部126は、ステップS171で選択した命令組を仮にSIMD命令に変換する。(ステップS173)解析部126は、ステップS172の変換を行った後の中間コードについて、プロセッサのリソースの使用状況を評価し、変換前のリソースの使用状況と比較する。前述のように、リソースの使用状況として、例えば、SIMDレジスタの数、命令の総数、転送命令の数などを評価する。リソースの使用状況を評価するため、解析部126は、例えば、SIMDレジスタの割り当てをシミュレーションする。
(ステップS174)解析部126は、ステップS172の変換によってリソースの使用状況が悪化したか(例えば、命令の総数や転送命令の数が増加したか)判断する。悪化した場合は処理をステップS176に進め、悪化していない場合は処理をステップS175に進める。(ステップS175)解析部126は、LCSが示す命令の組み合わせパターンの実効SIMD化数を1増加させる。(ステップS176)解析部126は、ステップS172のSIMD命令への変換をキャンセルする。(ステップS177)解析部126は、ステップS171でLCSが示す全ての命令組を選択したか判断する。全て選択した場合は処理を終了し、未選択の命令組がある場合は処理をステップS171に進める。
以上のようにして、解析部126は、LCSが示す命令の組み合わせパターン毎に、実効SIMD化数が最大になるように、1またはそれ以上の命令の組を採用する。ただし、SIMDの並列度が2であり、リソースの使用状況として転送命令の数を評価すればよい場合、上記のステップS173の処理を簡略化することも可能である。
図28は、SIMD化数解析処理の第2の手順例を示すフローチャートである。このフローチャートが示す処理は、図27の処理に代えて実行できる。
(ステップS181)解析部126は、LCSに基づいて、演算木#1に属する命令と演算木#2に属する命令との組を1つ選択する。(ステップS182)解析部126は、命令組の一方の命令に含まれるオペランドと他方の命令に含まれるオペランドの組を1つ選択する。ここで選択するオペランドには、参照オペランドと定義オペランドの両方が含まれる。(ステップS183)解析部126は、ステップS182で選択した2つのオペランドの少なくとも一方が、採用することが既に決定された命令組に出現するオペランドであるか判断する。出現済のオペランドである場合は処理をステップS184に進め、未出現のオペランドである場合は処理をステップS189に進める。
(ステップS184)解析部126は、ステップS182で選択したオペランド組が、出現済のオペランド組と同じ組み合わせ方であるか判断する。組み合わせ方が同じ場合は処理をステップS189に進め、組み合わせ方が異なる場合は処理をステップS185に進める。(ステップS185)解析部126は、選択した各オペランドに割り当てられるスロットが、前に割り当てられたスロットと同じであるか判断する。同じ場合は処理をステップS187に進め、異なる場合は処理をステップS186に進める。
(ステップS186)解析部126は、生成されるオブジェクトコードでクロスFMA命令を利用可能か(クロスFMA命令をサポートするプロセッサ用のオブジェクトコードか)判断する。クロスFMA命令を利用可能な場合は処理をステップS189に進め、利用可能でない場合は処理をステップS191に進める。(ステップS187)解析部126は、選択したオペランドが後続の命令で参照されるか、すなわち、後続の命令と依存関係があるか判断する。依存関係がある場合は処理をステップS191に進め、依存関係がない場合は処理をステップS188に進める。(ステップS188)解析部126は、ステップS187の判定が、選択した命令組について1回目か判断する。1回目の場合は処理をステップS189に進め、1回目でない場合は処理をステップS191に進める。
(ステップS189)解析部126は、ステップS182で全てのオペランド組を選択したか判断する。全て選択した場合は処理をステップS190に進め、未選択のオペランド組がある場合は処理をステップS182に進める。(ステップS190)解析部126は、LCSが示す命令の組み合わせパターンについての実効SIMD化数を1増加させ、処理をステップS192に進める。(ステップS191)解析部126は、ステップS181で選択した命令組のSIMD化をキャンセルする。(ステップS192)解析部126は、ステップS181で全ての命令組を選択したか判断する。全て選択した場合は処理を終了し、未選択の命令組がある場合は処理をステップS181に進める。
第2の実施の形態の端末装置100によれば、複数の演算木それぞれを演算列に変換してLCSを算出することで、命令組が最も多くなるような演算木の間の命令の組み合わせパターンを特定できる。このとき、演算木の形状が同じでなくてもよく、また、組み合わせるべき2つの命令が演算木の同じレベルに存在していなくてもよい。また、リソースの使用状況が最も有利になるように、LCSおよび採用する命令組が選択される。これにより、コンパイラ120の最適化処理を効率的に実行できる。
なお、前述のように、第1の実施の形態の情報処理は、情報処理装置10にプログラムを実行させることで実現でき、第2の実施の形態の情報処理は、端末装置100にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体23)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。
プログラムを流通させる場合、例えば、当該プログラムを記録した可搬記録媒体が提供される。また、プログラムを他のコンピュータの記憶装置に格納しておき、ネットワーク経由でプログラムを配布することもできる。コンピュータは、例えば、可搬記録媒体に記録されたプログラムまたは他のコンピュータから受信したプログラムを、記憶装置(例えば、HDD103)に格納し、当該記憶装置からプログラムを読み込んで実行する。ただし、可搬記録媒体から読み込んだプログラムを直接実行してもよく、他のコンピュータからネットワークを介して受信したプログラムを直接実行してもよい。
10 情報処理装置
11 記憶部
11a 第1のコード
11b 第2のコード
12 演算部
13a,13b 演算木
14a,14b 演算列
15a,15b 最長サブ演算列

Claims (6)

  1. 第1のコードから、前記第1のコードに含まれる2以上の命令を組み合わせて、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令を生成することで、当該特定命令を含む第2のコードを生成するためのプログラムであって、コンピュータに、
    前記第1のコードに含まれる命令の間の依存関係を示す第1および第2の演算木を生成し、前記第1の演算木の各命令で指定された演算を前記第1の演算木の構造に応じた順序で並べた第1の演算列と、前記第2の演算木の各命令で指定された演算を前記第2の演算木の構造に応じた順序で並べた第2の演算列とを算出し、
    前記第1および第2の演算列の少なくとも一方から1またはそれ以上の演算を削除することで現れる、前記第1および第2の演算列に共通のサブ演算列のうち、長さが最大である1またはそれ以上の最長サブ演算列を算出し、
    2以上の最長サブ演算列が算出されたとき、各最長サブ演算列について、当該最長サブ演算列に含まれる各演算に該当する前記第1の演算木の命令と前記第2の演算木の命令とを組み合わせた場合の、実行時の計算リソースの使用状況を評価し、評価結果に基づいて、何れかの最長サブ演算列が示す命令の組み合わせのパターンを選択する、
    処理を実行させるプログラム。
  2. 前記計算リソースの使用状況の評価では、前記第2のコードに、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令を挿入することに伴って生成される、当該特定命令で参照されるデータをレジスタ間で転送するための転送命令の数を評価する、請求項1記載のプログラム。
  3. 前記計算リソースの使用状況の評価では、前記第1のコードに含まれる命令を、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令に変換することによる命令の減少量と、前記転送命令が生成されることによる命令の増加量とに応じた指標値を算出する、請求項2記載のプログラム。
  4. 前記計算リソースの使用状況の評価では、前記第2のコードを実行するプロセッサが、前記転送命令が入力されなくても仮想的にレジスタ間でデータが転送されたと扱って当該データに対して演算を行うクロス演算命令をサポートしているか判定し、判定結果に応じて、生成される前記転送命令の数を評価する、請求項2または3記載のプログラム。
  5. 第1のコードから、前記第1のコードに含まれる2以上の命令を組み合わせて、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令を生成することで、当該特定命令を含む第2のコードを生成する、コンピュータが実行するコード生成方法であって、
    前記第1のコードに含まれる命令の間の依存関係を示す第1および第2の演算木を生成し、前記第1の演算木の各命令で指定された演算を前記第1の演算木の構造に応じた順序で並べた第1の演算列と、前記第2の演算木の各命令で指定された演算を前記第2の演算木の構造に応じた順序で並べた第2の演算列とを算出し、
    前記第1および第2の演算列の少なくとも一方から1またはそれ以上の演算を削除することで現れる、前記第1および第2の演算列に共通のサブ演算列のうち、長さが最大である1またはそれ以上の最長サブ演算列を算出し、
    2以上の最長サブ演算列が算出されたとき、各最長サブ演算列について、当該最長サブ演算列に含まれる各演算に該当する前記第1の演算木の命令と前記第2の演算木の命令とを組み合わせた場合の、実行時の計算リソースの使用状況を評価し、評価結果に基づいて、何れかの最長サブ演算列が示す命令の組み合わせのパターンを選択する、
    コード生成方法。
  6. 第1のコードと、異なるデータに対して同じ種類の演算を並列実行するよう指示する特定命令を含む第2のコードとを記憶する記憶部と、
    前記第1のコードに含まれる2以上の命令を組み合わせて前記特定命令を生成することで、前記第1のコードから前記第2のコードを生成する演算部と、
    を有し、前記演算部は、
    前記第1のコードに含まれる命令の間の依存関係を示す第1および第2の演算木を生成し、前記第1の演算木の各命令で指定された演算を前記第1の演算木の構造に応じた順序で並べた第1の演算列と、前記第2の演算木の各命令で指定された演算を前記第2の演算木の構造に応じた順序で並べた第2の演算列とを算出し、
    前記第1および第2の演算列の少なくとも一方から1またはそれ以上の演算を削除することで現れる、前記第1および第2の演算列に共通のサブ演算列のうち、長さが最大である1またはそれ以上の最長サブ演算列を算出し、
    2以上の最長サブ演算列が算出されたとき、各最長サブ演算列について、当該最長サブ演算列に含まれる各演算に該当する前記第1の演算木の命令と前記第2の演算木の命令とを組み合わせた場合の、実行時の計算リソースの使用状況を評価し、評価結果に基づいて、何れかの最長サブ演算列が示す命令の組み合わせのパターンを選択する、
    情報処理装置。
JP2012076510A 2012-03-29 2012-03-29 プログラム、コード生成方法および情報処理装置 Active JP5846005B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2012076510A JP5846005B2 (ja) 2012-03-29 2012-03-29 プログラム、コード生成方法および情報処理装置
US13/794,938 US8943484B2 (en) 2012-03-29 2013-03-12 Code generation method and information processing apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012076510A JP5846005B2 (ja) 2012-03-29 2012-03-29 プログラム、コード生成方法および情報処理装置

Publications (2)

Publication Number Publication Date
JP2013206289A JP2013206289A (ja) 2013-10-07
JP5846005B2 true JP5846005B2 (ja) 2016-01-20

Family

ID=49236679

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012076510A Active JP5846005B2 (ja) 2012-03-29 2012-03-29 プログラム、コード生成方法および情報処理装置

Country Status (2)

Country Link
US (1) US8943484B2 (ja)
JP (1) JP5846005B2 (ja)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9195436B2 (en) * 2013-10-14 2015-11-24 Microsoft Technology Licensing, Llc Parallel dynamic programming through rank convergence
US10372492B2 (en) * 2013-12-11 2019-08-06 Dropbox, Inc. Job-processing systems and methods with inferred dependencies between jobs
US9465653B2 (en) 2013-12-11 2016-10-11 Dropbox, Inc. Automated invalidation of job output data in a job-processing system
US9501268B2 (en) * 2013-12-23 2016-11-22 International Business Machines Corporation Generating SIMD code from code statements that include non-isomorphic code statements
JP6237278B2 (ja) * 2014-01-31 2017-11-29 富士通株式会社 コンパイルプログラム、コンパイル方法およびコンパイル装置
JP6245031B2 (ja) * 2014-03-27 2017-12-13 富士通株式会社 コンパイルプログラム、コンパイル方法およびコンパイル装置
US20180121202A1 (en) * 2016-11-02 2018-05-03 Intel Corporation Simd channel utilization under divergent control flow
JP6897213B2 (ja) * 2017-03-24 2021-06-30 日本電気株式会社 コード生成装置、コード生成方法及びコード生成プログラム
US10133573B1 (en) * 2017-12-12 2018-11-20 Google Llc Multivalue reductions using serial initial reductions in multiple register spaces and parallel subsequent reductions in a single register space
US10997083B2 (en) * 2018-09-04 2021-05-04 Arm Limited Parallel page table entry access when performing address translations
JP7263994B2 (ja) * 2019-09-17 2023-04-25 富士通株式会社 情報処理方法及び最適化プログラム
AU2021470708A1 (en) * 2020-11-04 2024-04-04 Mynatix Ag System for auto-parallelization of processing codes for multi-processor systems with optimized latency, and method thereof

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4045802B2 (ja) * 2002-01-08 2008-02-13 ソニー株式会社 プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム
US7802076B2 (en) 2004-06-24 2010-09-21 Intel Corporation Method and apparatus to vectorize multiple input instructions
US8225285B2 (en) * 2006-04-03 2012-07-17 International Business Machines Corporation Generating a test suite to test support for routines
JP2008097249A (ja) * 2006-10-11 2008-04-24 Internatl Business Mach Corp <Ibm> プログラム中の命令列をより高速な命令に置換する技術

Also Published As

Publication number Publication date
US8943484B2 (en) 2015-01-27
JP2013206289A (ja) 2013-10-07
US20130262835A1 (en) 2013-10-03

Similar Documents

Publication Publication Date Title
JP5846005B2 (ja) プログラム、コード生成方法および情報処理装置
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
Eigenmann et al. On the automatic parallelization of the Perfect Benchmarks (R)
US9823911B2 (en) Method and apparatus for compiling code based on a dependency tree
JP3711206B2 (ja) コンパイル方法
Fedyukovich et al. Gradual synthesis for static parallelization of single-pass array-processing programs
EP2951682B1 (en) Hardware and software solutions to divergent branches in a parallel pipeline
JP6245031B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP6432450B2 (ja) 並列計算装置、コンパイル装置、並列処理方法、コンパイル方法、並列処理プログラムおよびコンパイルプログラム
Phothilimthana et al. Tpugraphs: A performance prediction dataset on large tensor computational graphs
JP2015201119A (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
Rul et al. A profile-based tool for finding pipeline parallelism in sequential programs
Kannan Efficient sparse matrix multiple-vector multiplication using a bitmapped format
US9213548B2 (en) Code generation method and information processing apparatus
Zhang et al. AccelOpt: A Self-Improving LLM Agentic System for AI Accelerator Kernel Optimization
US10108405B2 (en) Compiling apparatus and compiling method
Deo et al. Performance and metrics analysis between python3 via mojo
Preissl et al. Transforming MPI source code based on communication patterns
US20220405110A1 (en) Non-transitory computer-readable recording medium and compilation method
JP2021093012A (ja) コンパイルプログラム、および情報処理装置
Zhao et al. Performance evaluation of NPB and SPEC CPU2006 on various SIMD extensions
JP6897213B2 (ja) コード生成装置、コード生成方法及びコード生成プログラム
CN100559344C (zh) 一种支持用规则记录变量访问专用寄存器组的处理方法
Zhang et al. Slackq: Approaching the qubit mapping problem with a slack-aware swap insertion scheme
Vohra et al. Mind the Abstraction Gap: Bringing Equality Saturation to Real-World ML Compilers

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150106

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20150915

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20151109

R150 Certificate of patent or registration of utility model

Ref document number: 5846005

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150