JP2019185486A - コード変換装置、コード変換方法、及びコード変換プログラム - Google Patents

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

Info

Publication number
JP2019185486A
JP2019185486A JP2018077108A JP2018077108A JP2019185486A JP 2019185486 A JP2019185486 A JP 2019185486A JP 2018077108 A JP2018077108 A JP 2018077108A JP 2018077108 A JP2018077108 A JP 2018077108A JP 2019185486 A JP2019185486 A JP 2019185486A
Authority
JP
Japan
Prior art keywords
array
data
code
arrays
instruction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2018077108A
Other languages
English (en)
Other versions
JP7035751B2 (ja
Inventor
木村 茂
Shigeru Kimura
茂 木村
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 JP2018077108A priority Critical patent/JP7035751B2/ja
Priority to US16/376,557 priority patent/US10908899B2/en
Publication of JP2019185486A publication Critical patent/JP2019185486A/ja
Application granted granted Critical
Publication of JP7035751B2 publication Critical patent/JP7035751B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30025Format conversion instructions, e.g. Floating-Point to Integer, decimal conversion
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/453Data distribution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30043LOAD or STORE instructions; Clear instruction
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30101Special purpose registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/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]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30105Register structure
    • G06F9/30109Register structure having multiple operands in a single register
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues

Landscapes

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

Abstract

【課題】アクセスの局所性が高い配列の異なる要素に対して並列に実行される演算の性能を向上させる。【解決手段】記憶部411は、複数の配列のデータ定義と、それらの配列に対する所定の演算と、所定の演算の演算結果を表す配列のデータ定義とを含む、第1コード421を記憶する。変換部412は、第1コード421に含まれる複数の配列のデータ定義と演算結果を表す配列のデータ定義とを、構造体配列のデータ定義に変換し、第1コード421に含まれる所定の演算を、構造体配列に対する演算に変換する。生成部413は、複数の配列各々の異なるデータに対して、構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成する。【選択図】図4

Description

本発明は、コード変換装置、コード変換方法、及びコード変換プログラムに関する。
従来のコンピュータにおいて、演算性能を向上させるために、複数のデータに対する演算を同じ演算器で並列に実行する、SIMD(Single Instruction Multiple Data)命令が利用されることが多くなっている。特に、高い演算性能が期待されるスーパーコンピュータ又はサーバ内で動作する演算処理装置において、SIMD命令が用意されている。演算処理装置は、プロセッサと呼ばれることもある。
SIMD命令をサポートしているプロセッサは、SIMD命令の実行時に、メモリからデータをレジスタに読み出し、そのレジスタを使用して、所定のSIMD幅に含まれる複数のSIMD要素を単位として並列に演算を行う。そして、プロセッサは、それらのSIMD要素を単位として、演算結果をメモリに格納する。例えば、4個の要素に対して同時に同じ演算を行う場合、SIMD要素の個数(要素数)は4個である。
また、ソフトウェアで記述されるプログラムロジック、特に、繰り返し処理(ループ処理)を高速化するために、コンパイラが最適な命令展開を行うことが望まれる。ループ処理を高速化する技術として、ループアンロール、ソフトウェアパイプライン、ループマージ等、様々な方法が考案されている。
SIMD命令に関連して、実行効率が向上するように、異なるデータに対して同じ種類の演算を並列実行するように指示する特定命令を含むコードを生成する技術が知られている(例えば、特許文献1を参照)。
特開2013−206291号公報
ソースコードに含まれるループ内のSIMD命令のオブジェクト展開は、コンパイラによって、ベクトルレジスタの水平方向に行われることが多いため、SIMD命令は、主として水平方向に対して適用される。一方、ベクトルレジスタの垂直方向に対しては、SIMD命令を適用しないか、又は、データの配置を水平方向に変換してから、SIMD命令を水平方向に対して適用することが考えられる。
以下では、SIMD命令のオブジェクト展開を指して、SIMD展開と記載することがある。また、SIMD命令によるSIMD演算に使用されるベクトルレジスタを指して、SIMDレジスタと記載することがある。
SIMD展開には、配列構造体(Structure of Arrays,SOA)形式のデータ定義が適している。SOA形式は、複数の連続する要素からなるデータ定義であり、SOA形式のデータに含まれる複数の要素は、連続的にアクセスすることが容易である。
しかしながら、SOA形式のデータ定義では、各配列のすべての要素がキャッシュメモリ内に収まるとは限らないため、局所性が高いアクセスに対するキャッシュ効率が低下する。
なお、かかる問題は、SOA形式のデータに対してSIMD命令を適用する場合に限らず、他のデータ定義に基づく配列の異なる要素に対して演算を並列に実行する場合においても生ずるものである。
1つの側面において、本発明は、アクセスの局所性が高い配列の異なる要素に対して並列に実行される演算の性能を向上させることを目的とする。
1つの案では、コード変換装置は、記憶部、変換部、及び生成部を含む。記憶部は、複数の配列のデータ定義と、それらの配列に対する所定の演算と、所定の演算の演算結果を表す配列のデータ定義とを含む、第1コードを記憶する。
変換部は、第1コードに含まれる複数の配列のデータ定義と演算結果を表す配列のデータ定義とを、構造体配列(Array of Structures,AOS)のデータ定義に変換し、第1コードに含まれる所定の演算を、構造体配列に対する演算に変換する。生成部は、複数の配列各々の異なるデータに対して、構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成する。
1つの実施形態によれば、アクセスの局所性が高い配列の異なる要素に対して並列に実行される演算の性能を向上させることができる。
SOA形式のデータに対するSIMD展開を示す図である。 SOA形式のデータに対するSIMD演算を示す図である。 配列の格納領域を示す図である。 コード変換装置の機能的構成図である。 コード変換処理のフローチャートである。 コード変換装置の具体例を示す機能的構成図である。 AOS形式のデータ定義及びSIMD演算を示す図である。 ハイブリッドAOS形式のデータ定義を示す図である。 処理性能を示す図である。 抽出方法M1を示す図である。 抽出方法M2を示す図である。 抽出方法M3を示す図である。 ループ管理テーブルを示す図である。 評価値テーブルを示す図である。 1次元の配列に対する変換処理を示す図である。 2次元の配列に対する変換処理を示す図である。 既存の命令を用いるSIMD展開を示す図である。 AOS専用命令を用いるSIMD展開を示す図である。 コード変換処理の具体例を示すフローチャートである。 グループ番号設定処理のフローチャートである。 変換候補抽出処理のフローチャートである。 変換対象選択処理のフローチャートである。 中間コード生成処理のフローチャートである。 機械語コード生成処理のフローチャートである。 情報処理装置の構成図である。
以下、図面を参照しながら、実施形態を詳細に説明する。
図1は、FORTRANで記述されたSOA形式のデータに対する演算のSIMD展開の例を示している。図1(a)は、1次元の配列A、配列B、及び配列Cに対するSOA形式のデータ定義の例を示している。各配列の要素は、倍精度実数であり、各配列の要素数は、n(nは2以上の整数)である。
図1(b)は、配列A、配列B、及び配列Cの格納領域の例を示している。Aiは、配列Aのi番目(i=1〜n)の要素A(i)を表し、Biは、配列Bのi番目の要素B(i)を表し、Ciは、配列Cのi番目の要素C(i)を表す。A1〜Anからなるストリームは、領域101内に連続して格納され、B1〜Bnからなるストリームは、領域102内に連続して格納され、C1〜Cnからなるストリームは、領域103内に連続して格納される。この場合、3つのストリームを同時にアクセスすることが可能である。
図1(c)は、配列A及び配列Bに対する演算のループを含むソースコードの例を示している。この例では、n=1024であり、doループ内に、C(i)=A(i)+B(i)という演算が含まれている。
図1(d)は、図1(c)のループに対するSIMD展開の例を示している。この例では、SIMD命令によって同時に処理できる要素数は4個であり、3つのストリームが連続域アクセスの対象となる。したがって、図1(b)の領域101〜領域103を用いて、各ストリームが4要素毎にアクセスされ、配列Aの4個の要素と配列Bの4個の要素に対して並列に加算処理が行われる。そして、4個の加算結果が並列に領域103に格納される。
このように、SOA形式のデータ定義によれば、各配列の複数の要素がメモリ内の連続する領域に格納される。一方、SIMD演算に使用するデータをメモリからSIMDレジスタに読み出す場合、連続して格納された複数の要素を、SIMDレジスタに連続して読み出すのが一般的である。
図2は、SIMDレジスタを利用して図1(c)の処理を行うSIMD演算の例を示している。メモリ1〜メモリ3は、メモリ内の連続する領域を表す。メモリ1には、配列Aの要素が格納されており、メモリ2には、配列Bの要素が格納されており、メモリ3には、配列Cの要素が格納されている。
各配列の要素のデータサイズは8バイトであり、SIMDレジスタ1〜SIMDレジスタ3は、64ビットのデータを8個格納することができる。したがって、SIMD命令によって同時に処理できる要素数は8個である。
まず、SIMDロード命令により、メモリ1の先頭アドレスから順に、連続する8個の要素であるA1〜A8が読み出されて、SIMDレジスタ1の水平方向に連続して書き込まれる。同時に、メモリ2の先頭アドレスから順に、連続する8個の要素であるB1〜B8が読み出されて、SIMDレジスタ2の水平方向に連続して書き込まれる。
次に、SIMDレジスタ1及びSIMDレジスタ2の8個のデータに対して並列に加算処理が実行され、加算結果であるC1〜C8がSIMDレジスタ3に書き込まれる。そして、SIMDレジスタ3からC1〜C8が連続して読み出され、メモリ3の先頭アドレスから順に書き込まれる。これにより、1回のループのSIMD演算が完了し、次のループのSIMD演算では、次の8個の要素について、同様の処理が繰り返される。
このように、SIMD演算の演算結果は、SIMDレジスタ3内に連続して格納されているため、その演算結果をSOA形式のデータとしてメモリ3に格納すればよく、演算結果の並べ替えは不要である。
しかしながら、SOA形式のデータ定義では、配列構造体に含まれる複数の配列の要素へのアクセスに際して、アクセスの局所性が低下するという問題がある。例えば、ビジネス系のアプリケーションプログラムでは、特定のデータの再利用率が高いことが多く、データに対するアクセスの局所性が高くなる。SOA形式のデータの場合、各配列のすべての要素がキャッシュメモリ内に収まるとは限らないため、局所性が高いアクセスに対するキャッシュ効率が低下する。
この場合、SOA形式のデータよりも、AOS形式で定義された離散的なデータを扱う方が、キャッシュ効率が高くなり、処理性能が向上する。そこで、処理性能を向上させるために、ソースコードに含まれるSOA形式のデータ定義を、プログラマがAOS形式のデータ定義に変更する方法が考えられる。
図3は、AOS形式で定義された配列A、配列B、及び配列Cの格納領域の例を示している。A1、B1、及びC1は、領域301内に連続して格納され、A2、B2、及びC2は、領域302内に連続して格納され、A3、B3、及びC3は、領域303内に連続して格納される。アプリケーションプログラムにおいて、特定のAi、Bi、及びCiの組み合わせが高い頻度で再利用される場合、その組み合わせのデータがキャッシュメモリ内に留まることによって、キャッシュ効率が向上する。
ただし、従来のSIMD展開では、連続する要素がSIMDレジスタの水平方向に格納されるため、AOS形式のデータに対して、SIMDレジスタを利用してSIMD演算を行うことは困難である。
また、SOA形式のデータ定義では、1回の処理で扱う領域が長いため、連続域アクセスによるページサイズオーバーに起因するTLB(Translation Lookaside Buffer)ミスが多発し、処理性能が劣化する可能性もある。さらに、連続するストリームに対するハードウェアプリフェッチ又はソフトウェアプリフェッチが冗長に発行された場合、処理性能がさらに劣化する。
図1及び図2の例では、配列A、配列B、及び配列Cのストリーム毎に発行されるハードウェアプリフェッチ又はソフトウェアプリフェッチによって、ハードウェア資源が消費される。このため、キャッシュメモリへの冗長なデータ書き込みによるパイプラインに投入される命令数の増加、スケジューリングの阻害、バス幅の消費による転送速度の低下等、様々な性能劣化が発生する。
図4は、実施形態のコード変換装置の機能的構成例を示している。図4のコード変換装置401は、記憶部411、変換部412、及び生成部413を含む。記憶部411は、複数の配列のデータ定義と、それらの配列に対する所定の演算と、所定の演算の演算結果を表す配列のデータ定義とを含む、第1コード421を記憶する。
図5は、図4のコード変換装置401が行うコード変換処理の例を示すフローチャートである。まず、変換部412は、第1コード421に含まれる複数の配列のデータ定義と演算結果を表す配列のデータ定義とを、構造体配列のデータ定義に変換する(ステップ501)。次に、変換部412は、第1コード421に含まれる所定の演算を、構造体配列に対する演算に変換する(ステップ502)。そして、生成部413は、複数の配列各々の異なるデータに対して、構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成する(ステップ503)。
図4のコード変換装置401によれば、アクセスの局所性が高い配列の異なる要素に対して並列に実行される演算の性能を向上させることができる。
図6は、図4のコード変換装置401の具体例を示している。図6のコード変換装置401は、記憶部411、変換部412、生成部413、及び解析部611を含み、高級言語で記述されたソースコード621を機械語コード626に変換する。例えば、ソースコード621は、FORTRAN、C言語、C++、LISP等で記述されたコードであってもよい。コード変換装置401は、コンパイラ装置と呼ばれることもある。
記憶部411は、ソースコード621及び評価関数622を記憶する。ソースコード621は、図4の第1コード421に対応し、ソースプログラムと呼ばれることもある。評価関数622は、ソースコード621に含まれる配列の評価値を計算するために用いられ、計算された評価値は、配列がAOS形式のデータ定義に適している度合いを示す。
解析部611は、ユーザから入力される最適化指示に従って、ソースコード621を解析し、解析結果に基づいてループ管理テーブル623を生成して、記憶部411に格納する。ループ管理テーブル623は、ソースコード621に含まれるループ毎に、ループに含まれる各配列の次元数、出現回数、各次元の添え字等の属性を含むテーブルである。
変換部412は、ループ管理テーブル623を参照して、データ定義を変換する変換候補の配列を抽出する。そして、変換部412は、評価関数622を用いて、変換候補の各配列に対する評価値を計算し、計算した評価値を含む評価値テーブル624を生成して、記憶部411に格納する。
次に、変換部412は、評価値テーブル624を参照して、変換候補の配列の中から変換対象の配列を選択し、選択した配列のデータ定義を、AOS形式のデータ定義に変換する。変換対象の配列には、所定の演算が適用される複数の配列と、それらの配列に対する所定の演算の演算結果を表す配列とが含まれる。変換対象の配列のデータ定義は、SOA形式であってもよく、SOA形式以外のデータ定義であってもよい。
次に、変換部412は、ソースコード621に含まれる所定の演算を、AOS形式のデータに対する演算に変換し、変換後のデータ定義及び演算を含む中間コード625を生成して、記憶部411に格納する。
生成部413は、中間コード625に含まれる所定の演算に対するSIMD展開を行うことで、中間コード625を最適化し、AOS形式のデータの読み出し及び書き込みを行うSIMD命令を含む、機械語コード626を生成して、記憶部411に格納する。機械語コード626は、第2コードに対応し、機械語プログラムと呼ばれることもある。
図6のコード変換装置401によれば、アクセスの局所性が高いデータに着目して、配列のデータ定義をAOS形式に変換することで、機械語コード626を実行するプロセッサのキャッシュ効率が高くなる。変換後のAOS形式のデータ定義では、複数の異なる配列の要素が局所的に配置されるため、それらの要素のデータがまとまってキャッシュメモリ内に留まることが多い。したがって、配列に対するアクセスの局所性が高い場合、キャッシュミス率が低く抑えられ、キャッシュ効率が向上する。これにより、そのような配列に対するSIMD演算の性能を向上させることができる。
また、SOA形式のデータ定義をAOS形式に変換することで、1回の処理で扱う領域が短くなり、連続域アクセスによるページサイズオーバーに起因するTLBミスが減少する。さらに、複数のストリームが1つのストリームにまとめられ、ストリーム数が削減されるため、ハードウェアプリフェッチ等によるハードウェア資源の消費を少なくすることができる。したがって、限られたハードウェア資源を効率的に活用することができ、プロセッサの処理性能が向上するとともに、消費電力も削減される。
生成部413は、AOS形式のデータの読み出し及び書き込みを行うSIMD命令として、SIMDレジスタにアクセスする既存の命令を用いてもよく、新たに定義されるAOS専用命令を用いてもよい。AOS専用命令としては、メモリからAOS形式のデータを読み出してSIMDレジスタに書き込む専用ロード命令と、SIMDレジスタからデータを読み出してAOS形式でメモリに書き込む専用ストア命令とが定義される。
専用ロード命令は、メモリに連続して格納された複数の構造体配列のデータを読み出して、各構造体配列に含まれる複数の配列のデータを、複数のSIMDレジスタにそれぞれ書き込む命令である。
一方、専用ストア命令は、複数のSIMDレジスタから、各構造体配列に含まれる複数の配列のデータを読み出して、メモリに格納された各構造体配列の位置に書き込む命令である。したがって、専用ストア命令を実行することで、所定のSIMDレジスタから演算結果を表す配列のデータが読み出されて、メモリに格納された各構造体配列に含まれる、演算結果を表す配列の位置に書き込まれる。
専用ロード命令は、SIMDレジスタの垂直方向に対して、メモリ内の要素を直接展開するために用いられ、専用ストア命令は、SIMDレジスタの垂直方向に展開された要素を抽出して、メモリ内に格納するために用いられる。これらのAOS専用命令を用いることで、従来の水平方向のSIMD展開に代えて、垂直方向のSIMD展開を効率良く行うことができる。プロセッサは、専用ロード命令及び専用ストア命令をサポートすることで、AOS形式のデータに対する処理性能がさらに向上する。
図7は、AOS形式のデータ定義及びSIMD演算の例を示している。図7(a)は、1次元の配列A、配列B、及び配列Cに対するAOS形式のデータ定義の例を示している。構造体structは、配列A、配列B、及び配列Cの要素からなり、各配列の要素は、倍精度実数であり、各配列の要素数は1024個である。構造体配列Stは、構造体structの配列であり、構造体配列Stの要素数も1024個である。この場合、構造体配列Stのi番目(i=1〜1024)の要素に含まれるAi、Bi、及びCiのデータが、連続してメモリ701に格納され、連続域アクセスの対象となる。
図7(b)は、配列A及び配列Bに対する演算のループを構造体配列Stを用いて記述したソースコードの例を示している。この例では、doループ内に、St(i)%C=St(i)%A+St(i)%Bという演算が含まれている。St(i)%Aは、構造体配列Stのi番目の要素に含まれる配列Aの要素を表し、St(i)%Bは、構造体配列Stのi番目の要素に含まれる配列Bの要素を表し、St(i)%Cは、構造体配列Stのi番目の要素に含まれる配列Cの要素を表す。
図7(c)は、図7(b)のループに対するSIMD展開の例を示している。この例では、SIMD命令によって同時に処理できる要素数は4個であり、メモリ701に格納されている1つのストリームのみが、連続域アクセスの対象となる。
したがって、図7(a)のメモリ701の先頭アドレスから順に、構造体配列Stの4個の要素に対応するA1〜C4の12個のデータが読み出され、SIMDレジスタ1〜SIMDレジスタ3の垂直方向に順に書き込まれる。そして、SIMDレジスタ1に格納された配列Aの4個の要素と、SIMDレジスタ2に格納された配列Bの4個の要素に対して、並列に加算処理が行われ、4個の加算結果が並列にSIMDレジスタ3に書き込まれる。
同時にアクセスされるAi、Bi、及びCiのデータは、メモリ701内で互いに近接して格納されているため、キャッシュメモリ内においても互いに近接して配置される。したがって、SOA形式の場合とは異なり、Ai、Bi、及びCiのうち一部のデータがキャッシュメモリから欠落する可能性は低くなる。
データのキャッシングを行うことで、次の処理ステップで使用されるまで、データをキャッシュメモリ内に留めておくことができる。これにより、次のアクセス時におけるアクセスコストが削減される。しかし、より大きなサイズのデータセットの場合、すべてのデータがキャッシュメモリに収まりきらず、次に使用される前にデータが書き換えられてしまうこともある。したがって、同時に使用される頻度の高い配列だけを、AOS形式の構造体のメンバに加えることが効果的である。
また、AOS形式のデータの特性であるデータの隣接性を確保しつつ、SOA形式のデータのロード順序をサポートする、ハイブリッドAOS形式をデータ定義として用いることもできる。
図8は、ハイブリッドAOS形式のデータ定義の例を示している。構造体Hybrid_structは、配列Aの8個の要素、配列Bの8個の要素、及び配列Cの8個の要素からなり、各配列の要素は、倍精度実数であり、各配列の要素数は1024個である。構造体配列Stは、構造体Hybrid_structの配列であり、構造体配列Stの要素数は128個である。
この場合、構造体配列Stのi番目(i=1〜128)の要素は、A(8*(i−1)+1)〜A(8*i)、B(8*(i−1)+1)〜B(8*i)、及びC(8*(i−1)+1)〜C(8*i)からなる。これらの24個のデータが連続してメモリ801に格納され、連続域アクセスの対象となる。したがって、構造体配列Stの1つの添え字によって、24個のデータをアクセス対象として指定することができる。
図8のハイブリッドAOS形式のデータ定義によれば、図2のSIMD演算の場合と同様に、プロセッサは、配列A、配列B、及び配列Cのいずれからも8個のデータを同時にロードすることができる。この場合、配列A、配列B、及び配列Cの同じ添え字を有する要素同士が隣接していなくても、それらの要素は十分に近い位置に存在するため、通常は同じメモリページに格納されると考えられる。
したがって、複数の異なる配列の要素が局所的に配置されるため、キャッシュ効率が向上する可能性が高くなる。また、1回の処理で扱う領域が短くなるため、連続域アクセスによるページサイズオーバーに起因するTLBミスが減少する可能性も高くなる。
このように、コード変換装置401は、プログラムが扱うデータの特性に応じて、配列のデータ定義をAOS形式又はハイブリッドAOS形式に変換することができる。データ特性とデータに対する処理に応じてデータ定義を切り換えることで、プログラム全体を最適化することが可能になる。
図9は、プログラム特性とデータ定義の組み合わせに応じた処理性能の例を示している。○印は、処理の高速化が可能であることを示し、△印は、処理の高速化が部分的に可能であることを示し、×印は、処理の高速化が不可能であることを示す。
データに対するアクセスの局所性が存在しない場合、SOA形式のデータ定義の方が、AOS形式のデータ定義よりも処理性能が高くなる。一方、データに対するアクセスの局所性が存在する場合、AOS形式のデータ定義の方が、SOA形式のデータ定義よりも処理性能が高くなる。
したがって、データに対するアクセスの局所性が存在する場合、ソースコード621に含まれるSOA形式のデータ定義をAOS形式のデータ定義に変換し、所定の演算をAOS形式のデータに対する演算に変換することで、処理性能の大幅な向上が期待できる。
ハードウェア資源の負荷としては、HPF(Hardware Prefetch)による負荷と、TLBミスによる負荷とが考慮される。SOA形式のデータ定義では、HPFによる負荷及びTLBミスによる負荷がともに大きいため、処理性能が低くなる。一方、AOS形式のデータ定義では、HPFによる負荷は存在せず、TLBミスによる負荷も小さいため、処理性能は高くなる。
したがって、ソースコード621に含まれるSOA形式のデータ定義をAOS形式のデータ定義に変換し、所定の演算をAOS形式のデータに対する演算に変換することで、ハードウェア資源の負荷を削減して、処理性能をさらに向上させることができる。
プロセッサのSIMDサポート状況において、水平方向のSIMD命令がサポートされている場合、SOA形式のデータ定義の方が、AOS形式のデータ定義よりも処理性能が高くなる。AOS形式のデータ定義では、データをSIMDレジスタに格納した後、水平方向に並べ替える処理が発生するため、SIMD演算による効果が相殺され、逆に性能が劣化する場合もある。
一方、垂直方向のSIMD命令がサポートされている場合、AOS形式のデータ定義の方が、SOA形式のデータ定義よりも処理性能が高くなる。特に、AOS専用命令がサポートされている場合、AOS形式のデータに対する処理性能がさらに向上する。
変換部412は、以下のいずれかの抽出方法を用いて、ソースコード621に含まれる配列の中から、変換候補の配列を抽出することができる。
M1:ソースコード621の静的解析に基づく変換候補の抽出
M2:ソースコード621に記述された制御文に基づく変換候補の抽出
M3:プロファイル情報に基づく変換候補の抽出
抽出方法M1を採用した場合、ユーザは、データ定義の変換を示すコンパイラオプションを指定し、変換部412は、指定されたコンパイラオプションに従って、変換候補の配列を抽出する。例えば、データ定義の変換を示すコンパイラオプションとしては、以下のようなものが用いられる。
−KAos:すべての配列の中から変換候補を自動的に抽出するコンパイラオプション
−KAos(A,B):ユーザが明示的に指定した配列名を有する配列を、変換候補として抽出するコンパイラオプション
−KAos(A,B)のA及びBは、ユーザが指定した配列名を表す。この場合、配列名A及び配列名Bを有する配列のうち、次元数と要素数が共通する配列が変換候補として抽出される。コンパイラオプションの名称として、−KAos以外の名称を用いても構わない。
−KAosを指定した場合、ユーザが配列を明示的に指定しなくても、変換候補を自動的に抽出することができる。一方、−KAos(A,B)を指定した場合、ユーザが明示的に指定した配列を、変換候補として抽出することができる。
図10は、抽出方法M1の例を示している。−KAos(A,B)が指定された場合、DOループから1次元の配列A及び配列Bが変換候補として抽出される。そして、配列A及び配列Bが変換対象として選択された場合、それらの配列のデータ定義が構造体配列Stのデータ定義に変換され、DOループ内のA(i)及びB(i)が、St(i)%A及びSt(i)%Bにそれぞれ変換される。抽出される配列の次元数は、2次元以上であってもよい。
抽出方法M2を採用した場合、ユーザは、変換候補の配列を明示的に指定する制御文をソースコード621に記述し、変換部412は、その制御文に従って変換候補の配列を抽出する。例えば、制御文としては、FORTRANにおけるOCL(Object Constraint Language)文、C言語における#pragma等を用いることができ、制御文には、配列名、次元数、及び要素数を記述することができる。制御文を用いることで、ユーザが明示的に指定した配列を、変換候補として抽出することができる。
図11は、抽出方法M2の例を示している。OCL文“!ocl AOS(A,B,C)”によって、配列A、配列B、及び配列Cが変換候補として指定された場合、DOループから2次元の配列A、配列B、及び配列Cが抽出される。そして、配列A、配列B、及び配列Cが変換対象として選択された場合、それらの配列のデータ定義が構造体配列Stのデータ定義に変換される。さらに、DOループ内のA(i,j)、B(i,j)、及びC(i,j)が、St(i,j)%A、St(i,j)%B、及びSt(i,j)%Cにそれぞれ変換される。抽出される配列の次元数は、1次元であってもよく、3次元以上であってもよい。
抽出方法M3を採用した場合、変換部412は、ソースコード621に含まれるループ処理における各配列のアクセス頻度を示すプロファイル情報を取得する。そして、変換部412は、取得したプロファイル情報を用いて、同時にアクセスされる頻度が高い複数の配列を、変換候補として抽出する。同じループ内の複数の配列に対するアクセスがともに高頻度で行われている場合、これらの配列のデータ定義をAOS形式に変換することで、それらの配列のデータが同じ期間にキャッシュメモリに留まる可能性が高くなる。
図12は、抽出方法M3の例を示している。プロファイル情報1201は、高コストのループ処理において、配列A及び配列Cが同時にアクセスされる頻度が高く、配列Bは他の配列と同時にアクセスされないことを示している。この場合、DOループから1次元の配列A及び配列Cが変換候補として抽出される。そして、配列A及び配列Cが変換対象として選択された場合、それらの配列のデータ定義が構造体配列Stのデータ定義に変換され、DOループ内のA(i)及びC(i)が、St(i)%A及びSt(i)%Cにそれぞれ変換される。抽出される配列の次元数は、2次元以上であってもよい。
図13は、ソースコード621に含まれるループのループ管理テーブル623の例を示している。図13(a)は、DOループの例を示しており、図13(b)は、解析部611が図13(a)のDOループを解析して生成したループ管理テーブル623の例を示している。図13(b)のループ管理テーブル623は、以下の項目を含む。
変数:ループ内における配列の記述(添え字を含む)
配列名:配列の名称(添え字を含まない)
次元数:配列の次元数
出現回数:ループ内における配列の記述回数
p次元(p=1〜P):配列のp番目の添え字(定数を含む)
グループ番号:同じ添え字を有する配列のグループを示す識別情報
変換部412は、ループ管理テーブル623を参照して、同じ添え字を有する複数の配列を検索し、それらの配列に同じグループ番号を付与する。図13(b)のループ管理テーブル623の場合、同じ添え字を有する配列のグループとして、以下のグループが抽出される。
{A(i),B(i)}
{AA(i,j),BB(i,j)}
{CC(x,y),DD(x,y)}
{α(W(i))),β(W(i))}
配列α及び配列βの添え字は、間接参照を示すW(i)であり、同じ添え字とみなすことができるため、これらの配列は同じグループに分類される。複数の配列の間で、間接参照を示す添え字が異なっている場合であっても、プロファイル情報等から、実行時にそれらの添え字が等しいと判断できる場合は、それらの配列が同じグループに分類される。
図13(a)のDOループでは、配列のデータ領域として静的領域が用いられているが、データ領域が動的に獲得される配列についても、ループ管理テーブル623に登録することが可能である。
変換部412は、ループ管理テーブル623に含まれる配列の中から、抽出方法M1〜抽出方法M3のいずれかを用いて、変換候補の配列を抽出する。抽出方法M1において、コンパイラオプション−KAosが指定された場合、変換部412は、いずれかのグループに分類された配列を、変換候補として抽出する。
抽出方法M1又は抽出方法M2において、コンパイラオプション又は制御文により複数の配列が明示的に指定された場合、変換部412は、指定された複数の配列が、ループ管理テーブル623内で同じグループ番号を有するか否かをチェックする。そして、指定された複数の配列が同じグループ番号を有する場合、変換部412は、それらの配列を変換候補に決定する。指定された複数の配列が同じグループ番号を有さない場合、変換部412は、それらの配列を変換候補から除外する。
抽出方法M3において、プロファイル情報が指定された場合、変換部412は、指定されたプロファイル情報を用いて、同時にアクセスされる頻度が高い複数の配列を、変換候補として抽出する。
配列名Qを有する配列の評価関数622としては、例えば、次式の評価関数E(Q)を用いることができる。
E(Q)=(C(Q)/S)*w1+(M(Q)/G(Q))*w2 (1)
式(1)のSは、ループに含まれる配列の総数を表し、C(Q)は、ループ内における配列Qの出現回数を表す。したがって、C(Q)/Sは、ループ内における配列Qの割合(出現率)を表す。
G(Q)は、配列Qと同じグループ番号を有する配列の総数を表し、M(Q)は、そのグループ番号が示すグループ内における配列Qの出現回数を表す。したがって、M(Q)/G(Q)は、グループ内における配列Qの割合(一致率)を表す。
出現率が高い配列ほど、アクセスされる頻度が高いため、データ定義をAOS形式に変更することが効果的である。同様に、一致率が高い配列ほど、アクセスされる頻度が高いため、データ定義をAOS形式に変更することが効果的である。w1は、出現率に対する重み係数を表し、w2は、一致率に対する重み係数を表す。
変換部412は、ループ管理テーブル623に登録された各配列の出現回数を用いて、評価関数E(Q)の値(評価値)を計算する。例えば、w1=1、w2=2とすると、図13(b)のループ管理テーブル623から、配列名Aを有する配列の評価値が、次のようにして計算される。
S=14:ループに含まれる配列の総数は、下記の14個である。
A(i),B(i),AA(i,j),BB(i,j),AA(i+1,j),
AA(x,z),BB(i+2,j),BB(z,c),CC(x,y),
A(i+2),AA(i,j),DD(x,y),α(W(i)),β(W(i))
C(A)=2:配列Aの出現回数は、A(i)及びA(i+2)の2回である。
G(A)=2:配列Aと同じグループ番号“1”を有する配列の総数は、A(i)及びB(i)の2個である。
M(A)=1:グループ番号“1”が示すグループ内における配列Aの出現回数は、A(i)の1回である。
E(A)=(2/14)*1+(1/2)*2=1.14 (2)
図14は、変換候補の配列に対する評価値テーブル624の例を示している。この例では、グループ番号“1”〜グループ番号“4”の4個のグループに属するすべての配列が、変換候補として抽出されている。図14の評価値テーブル624は、グループ番号、配列名Q、C(Q)、w1、M(Q)、G(Q)、w2、評価値、及び評価値合計を含む。評価値は、式(1)の評価関数E(Q)を用いて計算された各配列の評価値を表し、評価値合計は、同じグループに属する配列の評価値の総和を表す。
変換部412は、評価値テーブル624を参照して、評価値合計が閾値よりも大きなグループに属する配列を、変換対象として選択する。さらに、変換部412は、各グループに属する配列の中から、評価値が閾値よりも大きな配列を変換対象として選択してもよい。これらの閾値は、事前に設定された所定値であってもよく、ユーザにより指定された値であってもよい。
例えば、評価値合計の閾値が2.2である場合、図14のグループ番号“1”のグループに属するA(i)及びB(i)と、グループ番号“2”のグループに属するAA(i,j)及びBB(i,j)が、変換対象として選択される。
変換部412は、ループ管理テーブル623とは別に評価値テーブル624を生成する代わりに、評価値テーブル624の項目をループ管理テーブル623に追加して、2つのテーブルを統合してもよい。
評価関数E(Q)は、配列Qの出現率又は配列Qの一致率のうち、いずれか一方のみを含む関数であっても構わない。さらに、評価関数E(Q)は、出現率及び一致率以外の属性を含んでいても構わない。例えば、プロファイル情報から得られるプログラムの実行時の情報を、評価関数E(Q)の属性として用いることができる。このような情報としては、各配列のアクセス回数、キャッシュミス等のプロセッサイベント情報、プロセッサが取得した実測値(経験値)又は論理値が挙げられる。
コード変換装置401は、事前に記憶している評価関数E(Q)を用いる代わりに、コンパイラのパラメータとして外部から与えられた評価関数E(Q)を用いて、評価値を計算することもできる。さらに、コード変換装置401は、人工知能の機械学習によって、プログラムの実行時に取得した情報を学習データとしてフィードバックし、自動的に評価関数E(Q)を生成することも可能である。
変換部412は、変換対象として選択した配列の構造体配列を、ソースコード621に追加する。例えば、配列A及び配列Bが変換対象として選択された場合、変換部412は、配列A及び配列Bの構造体structを定義し、その構造体の配列として、任意の配列名の構造体配列を定義する。そして、変換部412は、それらのデータ定義を、ソースコード621中のデータ記述部に追加する。
type struct
属性1::A
属性2::B
end type struct
type(struct)::St(n)
この例では、配列名Stを有する構造体配列が定義されている。構造体配列Stの要素数nは、配列A及び配列Bの要素数と同じである。
次に、変換部412は、ソースコード621に含まれる配列A及び配列Bの記述を、構造体配列Stの配列名を用いた記述に置き換えて、中間コード625を生成する。
A()→St()%A
B()→St()%B
図15は、1次元の配列A、配列B、及び配列Cに対するデータ定義及び演算の変換処理の例を示している。ソースコード621に1次元の配列A、配列B、及び配列Cが含まれている場合、それらの配列の要素からなる構造体structが定義され、その構造体の配列として、構造体配列Stが定義される。構造体配列Stの要素数は1024個である。そして、DOループ内のC(i)=...A(i)+B(i)...という演算が、St(i)%C=...St(i)%A+St(i)%B...という演算に置き換えられる。
図16は、2次元の配列A、配列B、及び配列Cに対するデータ定義及び演算の変換処理の例を示している。ソースコード621に2次元の配列A、配列B、及び配列Cが含まれている場合、それらの配列の要素からなる構造体structが定義され、その構造体の配列として、構造体配列Stが定義される。構造体配列Stの添え字i及びjは、1〜1024の範囲の整数である。そして、DOループ内のC(i,j)=A(i,j)+B(i,j)という演算が、St(i,j)%C=St(i,j)%A+St(i,j)%Bという演算に置き換えられる。
変換部412は、配列A及び配列Bの配列名の変更を、ソースコード621に対して行う代わりに、中間コード625に対して行ってもよい。
次に、生成部413は、既存の命令又はAOS専用命令を用いて、中間コード625に対するSIMD展開を行うことで、機械語コード626を生成する。
図17は、既存の命令を用いるSIMD展開の例を示している。メモリ1701には、配列A、配列B、及び配列Cに対するAOS形式のデータが連続して格納されており、各配列の要素のデータサイズは8バイトである。reg1、reg4、reg5、及びreg6は、SIMDレジスタであり、64ビットのデータを複数個格納することができる。
図17(a)は、ロード命令の例を示している。プロセッサは、ロード命令ld3 reg1,addrを実行することで、メモリ1701からAOS形式のデータA1〜C3を読み出して、reg1の水平方向に連続して書き込む。
図17(b)は、配列Aに対するselect命令の例を示している。まず、プロセッサは、命令mov regx,(0x6&0x3&0x0)を実行することで、reg1内における配列Aの要素A1〜A3の位置を示す要素番号0、3、及び6を、レジスタregxに書き込む。
次に、プロセッサは、select命令select reg4,reg1,regx,3を実行することで、regx内の3個の要素番号が示す3個の要素を、reg1から読み出して、reg4の水平方向に連続して書き込む。このselect命令は、reg1から、各構造体配列に含まれる配列Aのデータの位置を指定して、指定した位置のデータを読み出し、reg4に連続して書き込む命令である。
図17(c)は、配列Bに対するselect命令の例を示している。まず、プロセッサは、命令mov regx,(0x7&0x4&0x1)を実行することで、reg1内における配列Bの要素B1〜B3の位置を示す要素番号1、4、及び7を、レジスタregxに書き込む。
次に、プロセッサは、select命令select reg5,reg1,regx,3を実行することで、regx内の3個の要素番号が示す3個の要素を、reg1から読み出して、reg5の水平方向に連続して書き込む。このselect命令は、reg1から、各構造体配列に含まれる配列Bのデータの位置を指定して、指定した位置のデータを読み出し、reg5に連続して書き込む命令である。
プロセッサは、配列Aの他の要素に対しても、図17(a)と同様のselect命令を実行することで、A1〜A8をレジスタ4に書き込むことができる。また、プロセッサは、配列Bの他の要素に対しても、図17(b)と同様のselect命令を実行することで、B1〜B8をレジスタ5に書き込むことができる。
図17(d)は、reg4〜reg6を用いたSIMD命令の例を示している。プロセッサは、SIMD命令ADD reg6,reg4,reg5を実行することで、reg4に格納されたAi(i=1〜8)と、reg5に格納されたBiとを並列に加算して、加算結果Ciをreg6に書き込む。
図17(e)は、scatter命令の例を示している。まず、プロセッサは、ロード命令ldr x1,&A1を実行することで、メモリ1701内における加算結果Ci(i=1〜8)の格納先先頭アドレスを計算して、不図示のレジスタx1に書き込む。例えば、C1、C2、及びC3の格納先先頭アドレスは、それぞれ、16、40、及び64である。
次に、プロセッサは、命令mov regx,(64,40,16)を実行することで、レジスタx1に格納された、C1〜C3の格納先先頭アドレスを、regxに書き込む。プロセッサは、配列Cの他の要素に対しても同様の命令を実行することで、C1〜C8の格納先先頭アドレスをregxに書き込むことができる。
次に、プロセッサは、scatter命令scatter reg6,(x1,regx),3を実行することで、reg6から3個の要素C1〜C3を読み出して、regx内の3個の要素が示すメモリ1701のアドレスに書き込む。このscatter命令は、reg6から配列Cのデータを読み出し、メモリ1701に格納された各構造体配列に含まれる配列Cのデータの位置を指定して、読み出したデータを指定した位置に書き込む命令である。
プロセッサは、配列Cの他の要素に対しても同様の命令を実行することで、C1〜C8をメモリ1701に書き込むことができる。
図17の既存の命令を用いるSIMD展開によれば、AOS専用命令が定義されていない場合であっても、AOS形式のデータに対するSIMD演算を実行することが可能になる。
図18は、AOS専用命令を用いるSIMD展開の例を示している。reg1〜reg3は、SIMDレジスタであり、64ビットのデータを8個格納することができる。
図18(a)は、専用ロード命令の例を示している。プロセッサは、専用ロード命令ld3 reg1,reg2,reg3,addrを実行することで、メモリ1701からAOS形式のデータA1〜A8を読み出して、reg1〜reg3の垂直方向に順に書き込む。このように、専用ロード命令を用いることで、AOS形式のデータを1命令でメモリ1701からreg1〜reg3へロードすることができる。
図18(b)は、reg1〜reg3を用いたSIMD命令の例を示している。プロセッサは、SIMD命令ADD reg3,reg1,reg2を実行することで、reg1に格納されたAi(i=1〜8)と、reg2に格納されたBiとを並列に加算して、加算結果Ciをreg3に書き込む。
図18(c)は、専用ストア命令の例を示している。まず、プロセッサは、命令ldr x1,&A1を実行することで、メモリ1701内におけるAi、Bi、及びCi(i=1〜8)の格納先先頭アドレスを計算して、不図示のレジスタx1に書き込む。
次に、プロセッサは、専用ストア命令st3 reg1,reg2,reg3,(x1)を実行することで、reg1〜reg3から、Ai、Bi、及びCiを垂直方向に順に読み出して、AOS形式でメモリ1701に書き込む。reg1内のAiとreg2内のBiは、メモリ1701内に既に格納されているが、専用ストア命令はreg1〜reg3を読み出す命令であるため、reg3内のCiとともにメモリ1701に書き込まれる。このように、専用ストア命令を用いることで、AOS形式のデータを1命令でreg1〜reg3からメモリ1701に格納することができる。
図18のAOS専用命令を用いるSIMD展開によれば、図17の既存の命令を用いるSIMD展開と比較して、SIMD演算のための命令の個数が少ないため、SIMD演算を効率良く実行することが可能になる。
次に、図19から図24までを参照しながら、図6のコード変換装置401が行うコード変換処理の手順について説明する。
図19は、コード変換処理の具体例を示すフローチャートである。まず、ユーザは、変換候補の抽出方法として、抽出方法M1〜抽出方法M3のいずれかを指定し、最適化指示を入力する(ステップ1901)。
ユーザが抽出方法M1を指定した場合、コード変換装置401は、指定されたコンパイラオプションに従って、変換候補を抽出する。ユーザが抽出方法M2を指定した場合、コード変換装置401は、ソースコード621に記述された制御文に従って、変換候補を抽出する。ユーザが抽出方法M3を指定した場合、コード変換装置401は、指定されたプロファイル情報を用いて、変換候補を抽出する。
次に、解析部611は、ソースコード621を解析し、解析結果に基づいてループ管理テーブル623を生成する(ステップ1902)。
次に、変換部412は、ループ管理テーブル623にグループ番号を設定し(ステップ1903)、ループ管理テーブル623を参照して、変換候補の配列を抽出する(ステップ1904)。そして、変換部412は、変換候補の配列の中から変換対象の配列を選択し(ステップ1905)、変換対象の配列に対する変換処理を行って、中間コード625を生成する(ステップ1906)。
次に、生成部413は、中間コード625に対するSIMD展開を行って、機械語コード626を生成する(ステップ1907)。
図20は、図19のステップ1903におけるグループ番号設定処理の例を示すフローチャートである。まず、変換部412は、ループ管理テーブル623から同じ次元数を有する変数を抽出する(ステップ2001)。例えば、図13(b)のループ管理テーブル623の場合、同じ次元数を有する変数として、以下の変数が抽出される。
1次元の変数:
A(i),A(i+2),B(i),α(W(i)),β(W(i))
2次元の変数:
AA(i,j),AA(i+1,j),AA(x,z),BB(i,j),
BB(i+2,j),BB(z,c),CC(x,y),DD(x,y)
次に、変換部412は、同じ次元数を有する変数の中から、同じ添え字を有する変数を抽出し、抽出した変数のグループを生成する(ステップ2002)。これにより、以下の4個のグループが生成される。
{A(i),B(i)}
{AA(i,j),BB(i,j)}
{CC(x,y),DD(x,y)}
{α(W(i))),β(W(i))}
次に、変換部412は、各グループにグループ番号を設定する(ステップ2003)。これにより、以下のようなグループ番号が設定される。
グループ番号“1”:{A(i),B(i)}
グループ番号“2”:{AA(i,j),BB(i,j)}
グループ番号“3”:{CC(x,y),DD(x,y)}
グループ番号“4”:{α(W(i))),β(W(i))}
図21は、図19のステップ1904における変換候補抽出処理の例を示すフローチャートである。まず、変換部412は、コンパイラオプション又は制御文により複数の配列が明示的に指定されているか否かをチェックする(ステップ2101)。
複数の配列が明示的に指定されている場合(ステップ2101,YES)、変換部412は、指定された複数の配列が、ループ管理テーブル623内で同じグループ番号を有するか否かをチェックする(ステップ2102)。指定された複数の配列が同じグループ番号を有する場合(ステップ2102,YES)、変換部412は、それらの配列を変換候補に決定する(ステップ2103)。一方、指定された複数の配列が同じグループ番号を有さない場合、変換部412は、それらの配列を変換候補から除外する(ステップ2104)。
複数の配列が明示的に指定されていない場合(ステップ2101,NO)、変換部412は、生成されたグループの中から変換候補を抽出する。例えば、コンパイラオプション−KAosが指定されている場合、いずれかのグループに分類されたすべての配列が、変換候補として抽出される。また、プロファイル情報が指定されている場合、同時にアクセスされる頻度が高い複数の配列が、変換候補として抽出される。
図22は、図19のステップ1905における変換対象選択処理の例を示すフローチャートである。まず、変換部412は、評価関数622を用いて、変換候補の各配列に対する評価値を計算し、計算した評価値を含む評価値テーブル624を生成する(ステップ2201)。そして、変換部412は、評価値テーブル624を参照して、評価値合計が閾値よりも大きなグループに属する配列を、変換対象として選択する(ステップ2202)。
図23は、図19のステップ1906における中間コード生成処理の例を示すフローチャートである。まず、変換部412は、ソースコード621に含まれる変換対象の配列のデータ定義を、グループ毎にAOS形式のデータ定義に変更し、構造体配列を定義する(ステップ2301)。構造体配列の添え字及び要素数としては、変更前の各配列の添え字及び要素数が用いられる。
次に、変換部412は、ソースコード621に含まれる変換対象の配列の記述を、構造体配列を用いた記述に変更する(ステップ2302)。そして、変換部412は、AOS形式のデータ定義及び構造体配列の記述を含むコードをコンパイルすることで、中間コード625を生成する(ステップ2303)。
図24は、図19のステップ1907における機械語コード生成処理の例を示すフローチャートである。まず、生成部413は、専用ロード命令及び専用ストア命令を含む、AOS専用命令が定義されているか否かをチェックする(ステップ2401)。
AOS専用命令が定義されている場合(ステップ2401,YES)、生成部413は、専用ロード命令を機械語コード626に記述する(ステップ2402)。一方、AOS専用命令が定義されていない場合(ステップ2401,NO)、生成部413は、既存の命令を組み合わせて、メモリからAOS形式のデータを読み出してSIMDレジスタに書き込む処理を、機械語コード626に記述する(ステップ2403)。
次に、生成部413は、SIMDレジスタを用いるSIMD命令を機械語コード626に記述し(ステップ2404)、AOS専用命令が定義されているか否かをチェックする(ステップ2405)。
AOS専用命令が定義されている場合(ステップ2405,YES)、生成部413は、専用ストア命令を機械語コード626に記述する(ステップ2406)。一方、AOS専用命令が定義されていない場合(ステップ2405,NO)、生成部413は、既存の命令を組み合わせて、SIMDレジスタからAOS形式のデータを読み出してメモリに書き込む処理を、機械語コード626に記述する(ステップ2407)。
そして、生成部413は、専用ロード命令又は既存の命令と、SIMD命令と、専用ストア命令又は既存の命令とを含む、機械語コード626を生成する(ステップ2408)。
図4及び図6のコード変換装置401の構成は一例に過ぎず、コード変換装置401の用途又は条件に応じて、一部の構成要素を省略又は変更してもよい。例えば、図6のコード変換装置401において、ループ管理テーブル623が外部の装置によって生成される場合は、解析部611を省略することができる。
図5及び図19〜図24のフローチャートは一例に過ぎず、コード変換装置401の構成又は条件に応じて一部の処理を省略又は変更してもよい。例えば、ループ管理テーブル623が外部の装置によって生成される場合は、図19のステップ1902の処理を省略することができる。コンパイラオプション又は制御文により複数の配列が明示的に指定されていない場合は、図19のステップ1904の処理を省略することができる。
図1〜図3に示したSOA形式のデータ定義及びSIMD展開は一例に過ぎず、SOA形式のデータ定義及びSIMD展開は、ソースコード621の言語と、ソースコード621に含まれる配列及び演算の種類とに応じて変化する。
図7、図10〜図12、及び図15〜図18に示したAOS形式のデータ定義及びSIMD展開は一例に過ぎず、AOS形式のデータ及びSIMD展開は、ソースコード621の言語と、ソースコード621に含まれる配列及び演算の種類とに応じて変化する。ソースコード621に含まれる演算は、加算、減算、乗算、除算等の複数の演算の組み合わせであってもよい。
図8のハイブリッドAOS形式のデータ定義は一例に過ぎず、ハイブリッドAOS形式のデータ定義は、ソースコード621の言語と、ソースコード621に含まれる配列及び演算の種類とに応じて変化する。図9の処理性能は一例に過ぎず、処理性能は、ソースコード621に応じて変化する。
図13のループ管理テーブル623及び図14の評価値テーブル624は一例に過ぎず、ループ管理テーブル623及び評価値テーブル624は、ソースコード621に含まれる配列の種類及び個数に応じて変化する。コード変換装置401の構成又は条件に応じて、ループ管理テーブル623及び評価値テーブル624の一部の項目を省略又は変更してもよい。
式(1)の評価関数E(Q)は一例に過ぎず、別の評価関数E(Q)を用いて配列の評価値を計算してもよい。
図25は、図4及び図6のコード変換装置401として用いられる情報処理装置(コンピュータ)のハードウェア構成例を示している。図25の情報処理装置は、CPU(Central Processing Unit)2501、メモリ2502、入力装置2503、出力装置2504、補助記憶装置2505、媒体駆動装置2506、及びネットワーク接続装置2507を含む。これらの構成要素はバス2508により互いに接続されている。
メモリ2502は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)、フラッシュメモリ等の半導体メモリであり、処理に用いられるプログラム及びデータを格納する。メモリ2502は、図4及び図6の記憶部411として用いることができる。
CPU2501(プロセッサ)は、例えば、メモリ2502を利用してプログラムを実行することにより、図4及び図6の変換部412及び生成部413として動作する。CPU2501は、メモリ2502を利用してプログラムを実行することにより、図6の解析部611としても動作する。
入力装置2503は、例えば、キーボード、ポインティングデバイス等であり、オペレータ又はユーザからの指示又は情報の入力に用いられる。出力装置2504は、例えば、表示装置、プリンタ、スピーカ等であり、オペレータ又はユーザへの問い合わせ又は指示、及び処理結果の出力に用いられる。
補助記憶装置2505は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置、テープ装置等である。補助記憶装置2505は、ハードディスクドライブであってもよい。情報処理装置は、補助記憶装置2505にプログラム及びデータを格納しておき、それらをメモリ2502にロードして使用することができる。
媒体駆動装置2506は、可搬型記録媒体2509を駆動し、その記録内容にアクセスする。可搬型記録媒体2509は、メモリデバイス、フレキシブルディスク、光ディスク、光磁気ディスク等である。可搬型記録媒体2509は、CD−ROM(Compact Disk Read Only Memory)、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリ等であってもよい。オペレータ又はユーザは、この可搬型記録媒体2509にプログラム及びデータを格納しておき、それらをメモリ2502にロードして使用することができる。
このように、処理に用いられるプログラム及びデータを格納するコンピュータ読み取り可能な記録媒体は、メモリ2502、補助記憶装置2505、又は可搬型記録媒体2509のような、物理的な(非一時的な)記録媒体である。
ネットワーク接続装置2507は、LAN(Local Area Network)、WAN(Wide Area Network)等の通信ネットワークに接続され、通信に伴うデータ変換を行う通信インタフェース回路である。情報処理装置は、プログラム及びデータを外部の装置からネットワーク接続装置2507を介して受信し、それらをメモリ2502にロードして使用することができる。
なお、情報処理装置が図25のすべての構成要素を含む必要はなく、用途又は条件に応じて一部の構成要素を省略することも可能である。例えば、ユーザ又はオペレータとのインタフェースが不要である場合は、入力装置2503及び出力装置2504を省略してもよい。また、可搬型記録媒体2509又は通信ネットワークを使用しない場合は、媒体駆動装置2506又はネットワーク接続装置2507を省略してもよい。
開示の実施形態とその利点について詳しく説明したが、当業者は、特許請求の範囲に明確に記載した本発明の範囲から逸脱することなく、様々な変更、追加、省略をすることができるであろう。
図1乃至図25を参照しながら説明した実施形態に関し、さらに以下の付記を開示する。
(付記1)
複数の配列のデータ定義と、前記複数の配列に対する所定の演算と、前記所定の演算の演算結果を表す配列のデータ定義とを含む、第1コードを記憶する記憶部と、
前記第1コードに含まれる前記複数の配列のデータ定義と前記演算結果を表す配列のデータ定義とを、構造体配列のデータ定義に変換し、前記第1コードに含まれる前記所定の演算を、前記構造体配列に対する演算に変換する変換部と、
前記複数の配列各々の異なるデータに対して、前記構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成する生成部と、
を備えることを特徴とするコード変換装置。
(付記2)
前記所定の命令は、複数のレジスタそれぞれに格納された配列のデータに対して、前記構造体配列に対する演算を実行し、演算結果を表す配列のデータを所定のレジスタに書き込む命令であり、
前記第2コードは、
メモリに連続して格納された複数の構造体配列のデータを読み出して、各構造体配列のデータに含まれる前記複数の配列のデータを、前記複数のレジスタにそれぞれ書き込む命令と、
前記所定のレジスタから前記演算結果を表す配列のデータを読み出して、前記メモリに格納された各構造体配列のデータに含まれる、前記演算結果を表す配列のデータの位置に書き込む命令と、
をさらに含むことを特徴とする付記1記載のコード変換装置。
(付記3)
前記所定の命令は、複数のレジスタそれぞれに格納された配列のデータに対して、前記構造体配列に対する演算を実行し、演算結果を表す配列のデータを所定のレジスタに書き込む命令であり、
前記第2コードは、
メモリに連続して格納された複数の構造体配列のデータを読み出して、第1レジスタに連続して書き込む命令と、
前記第1レジスタから、各構造体配列のデータに含まれる同じ配列のデータの位置を指定して、指定した位置のデータを読み出し、前記複数のレジスタのうち同じレジスタに連続して書き込む命令と、
前記所定のレジスタから前記演算結果を表す配列のデータを読み出し、前記メモリに格納された各構造体配列のデータに含まれる、前記演算結果を表す配列のデータの位置を指定して、前記所定のレジスタから読み出したデータを前記メモリの指定した位置に書き込む命令と、
をさらに含むことを特徴とする付記1記載のコード変換装置。
(付記4)
前記変換部は、データ定義の変換を示すコンパイラオプションに従って、前記第1コードに含まれる配列の中から、前記複数の配列と前記演算結果を表す配列とを選択することを特徴とする付記1乃至3のいずれか1項に記載のコード変換装置。
(付記5)
前記第1コードは、前記複数の配列と前記演算結果を表す配列とを指定する制御文を含み、
前記変換部は、前記制御文に従って、前記第1コードに含まれる配列の中から、前記複数の配列と前記演算結果を表す配列とを選択することを特徴とする付記1乃至3のいずれか1項に記載のコード変換装置。
(付記6)
前記変換部は、前記第1コードに含まれる配列のアクセス頻度を示すプロファイル情報を用いて、前記第1コードに含まれる配列の中から、前記複数の配列と前記演算結果を表す配列とを選択することを特徴とする付記1乃至3のいずれか1項に記載のコード変換装置。
(付記7)
前記変換部は、前記第1コードに含まれるループ内における各配列の出現回数、又は前記ループ内で同じ添え字を有する配列のグループにおける各配列の出現回数のうち、少なくとも一方に基づいて、前記ループに含まれる配列の中から前記複数の配列を選択することを特徴とする付記1乃至6のいずれか1項に記載のコード変換装置。
(付記8)
前記第1コードに含まれる複数の配列のデータ定義は、配列構造体のデータ定義であることを特徴とする付記1乃至7のいずれか1項に記載のコード変換装置。
(付記9)
複数の配列のデータ定義と、前記複数の配列に対する所定の演算と、前記所定の演算の演算結果を表す配列のデータ定義とを含む、第1コードを記憶する記憶部を有するコンピュータが、
前記第1コードに含まれる前記複数の配列のデータ定義と前記演算結果を表す配列のデータ定義とを、構造体配列のデータ定義に変換し、
前記第1コードに含まれる前記所定の演算を、前記構造体配列に対する演算に変換し、
前記複数の配列各々の異なるデータに対して、前記構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成することを特徴とするコード変換方法。
(付記10)
前記所定の命令は、複数のレジスタそれぞれに格納された配列のデータに対して、前記構造体配列に対する演算を実行し、演算結果を表す配列のデータを所定のレジスタに書き込む命令であり、
前記第2コードは、
メモリに連続して格納された複数の構造体配列のデータを読み出して、各構造体配列のデータに含まれる前記複数の配列のデータを、前記複数のレジスタにそれぞれ書き込む命令と、
前記所定のレジスタから前記演算結果を表す配列のデータを読み出して、前記メモリに格納された各構造体配列のデータに含まれる、前記演算結果を表す配列のデータの位置に書き込む命令と、
をさらに含むことを特徴とする付記9記載のコード変換方法。
(付記11)
前記所定の命令は、複数のレジスタそれぞれに格納された配列のデータに対して、前記構造体配列に対する演算を実行し、演算結果を表す配列のデータを所定のレジスタに書き込む命令であり、
前記第2コードは、
メモリに連続して格納された複数の構造体配列のデータを読み出して、第1レジスタに連続して書き込む命令と、
前記第1レジスタから、各構造体配列のデータに含まれる同じ配列のデータの位置を指定して、指定した位置のデータを読み出し、前記複数のレジスタのうち同じレジスタに連続して書き込む命令と、
前記所定のレジスタから前記演算結果を表す配列のデータを読み出し、前記メモリに格納された各構造体配列のデータに含まれる、前記演算結果を表す配列のデータの位置を指定して、前記所定のレジスタから読み出したデータを前記メモリの指定した位置に書き込む命令と、
をさらに含むことを特徴とする付記9記載のコード変換方法。
(付記12)
複数の配列のデータ定義と、前記複数の配列に対する所定の演算と、前記所定の演算の演算結果を表す配列のデータ定義とを含む、第1コードを記憶する記憶部を有するコンピュータに、
前記第1コードに含まれる前記複数の配列のデータ定義と前記演算結果を表す配列のデータ定義とを、構造体配列のデータ定義に変換させ、
前記第1コードに含まれる前記所定の演算を、前記構造体配列に対する演算に変換させ、
前記複数の配列各々の異なるデータに対して、前記構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成させることを特徴とするコード変換プログラム。
(付記13)
前記所定の命令は、複数のレジスタそれぞれに格納された配列のデータに対して、前記構造体配列に対する演算を実行し、演算結果を表す配列のデータを所定のレジスタに書き込む命令であり、
前記第2コードは、
メモリに連続して格納された複数の構造体配列のデータを読み出して、各構造体配列のデータに含まれる前記複数の配列のデータを、前記複数のレジスタにそれぞれ書き込む命令と、
前記所定のレジスタから前記演算結果を表す配列のデータを読み出して、前記メモリに格納された各構造体配列のデータに含まれる、前記演算結果を表す配列のデータの位置に書き込む命令と、
をさらに含むことを特徴とする付記12記載のコード変換プログラム。
(付記14)
前記所定の命令は、複数のレジスタそれぞれに格納された配列のデータに対して、前記構造体配列に対する演算を実行し、演算結果を表す配列のデータを所定のレジスタに書き込む命令であり、
前記第2コードは、
メモリに連続して格納された複数の構造体配列のデータを読み出して、第1レジスタに連続して書き込む命令と、
前記第1レジスタから、各構造体配列のデータに含まれる同じ配列のデータの位置を指定して、指定した位置のデータを読み出し、前記複数のレジスタのうち同じレジスタに連続して書き込む命令と、
前記所定のレジスタから前記演算結果を表す配列のデータを読み出し、前記メモリに格納された各構造体配列のデータに含まれる、前記演算結果を表す配列のデータの位置を指定して、前記所定のレジスタから読み出したデータを前記メモリの指定した位置に書き込む命令と、
をさらに含むことを特徴とする付記12記載のコード変換プログラム。
101〜103、301〜303 領域
401 コード変換装置
411 記憶部
412 変換部
413 生成部
611 解析部
621 ソースコード
622 評価関数
623 ループ管理テーブル
624 評価値テーブル
625 中間コード
626 機械語コード
701、801、1701 メモリ
1201 プロファイル情報
2501 CPU
2502 メモリ
2503 入力装置
2504 出力装置
2505 補助記憶装置
2506 媒体駆動装置
2507 ネットワーク接続装置
2508 バス
2509 可搬型記録媒体

Claims (10)

  1. 複数の配列のデータ定義と、前記複数の配列に対する所定の演算と、前記所定の演算の演算結果を表す配列のデータ定義とを含む、第1コードを記憶する記憶部と、
    前記第1コードに含まれる前記複数の配列のデータ定義と前記演算結果を表す配列のデータ定義とを、構造体配列のデータ定義に変換し、前記第1コードに含まれる前記所定の演算を、前記構造体配列に対する演算に変換する変換部と、
    前記複数の配列各々の異なるデータに対して、前記構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成する生成部と、
    を備えることを特徴とするコード変換装置。
  2. 前記所定の命令は、複数のレジスタそれぞれに格納された配列のデータに対して、前記構造体配列に対する演算を実行し、演算結果を表す配列のデータを所定のレジスタに書き込む命令であり、
    前記第2コードは、
    メモリに連続して格納された複数の構造体配列のデータを読み出して、各構造体配列のデータに含まれる前記複数の配列のデータを、前記複数のレジスタにそれぞれ書き込む命令と、
    前記所定のレジスタから前記演算結果を表す配列のデータを読み出して、前記メモリに格納された各構造体配列のデータに含まれる、前記演算結果を表す配列のデータの位置に書き込む命令と、
    をさらに含むことを特徴とする請求項1記載のコード変換装置。
  3. 前記所定の命令は、複数のレジスタそれぞれに格納された配列のデータに対して、前記構造体配列に対する演算を実行し、演算結果を表す配列のデータを所定のレジスタに書き込む命令であり、
    前記第2コードは、
    メモリに連続して格納された複数の構造体配列のデータを読み出して、第1レジスタに連続して書き込む命令と、
    前記第1レジスタから、各構造体配列のデータに含まれる同じ配列のデータの位置を指定して、指定した位置のデータを読み出し、前記複数のレジスタのうち同じレジスタに連続して書き込む命令と、
    前記所定のレジスタから前記演算結果を表す配列のデータを読み出し、前記メモリに格納された各構造体配列のデータに含まれる、前記演算結果を表す配列のデータの位置を指定して、前記所定のレジスタから読み出したデータを前記メモリの指定した位置に書き込む命令と、
    をさらに含むことを特徴とする請求項1記載のコード変換装置。
  4. 前記変換部は、データ定義の変換を示すコンパイラオプションに従って、前記第1コードに含まれる配列の中から、前記複数の配列と前記演算結果を表す配列とを選択することを特徴とする請求項1乃至3のいずれか1項に記載のコード変換装置。
  5. 前記第1コードは、前記複数の配列と前記演算結果を表す配列とを指定する制御文を含み、
    前記変換部は、前記制御文に従って、前記第1コードに含まれる配列の中から、前記複数の配列と前記演算結果を表す配列とを選択することを特徴とする請求項1乃至3のいずれか1項に記載のコード変換装置。
  6. 前記変換部は、前記第1コードに含まれる配列のアクセス頻度を示すプロファイル情報を用いて、前記第1コードに含まれる配列の中から、前記複数の配列と前記演算結果を表す配列とを選択することを特徴とする請求項1乃至3のいずれか1項に記載のコード変換装置。
  7. 前記変換部は、前記第1コードに含まれるループ内における各配列の出現回数、又は前記ループ内で同じ添え字を有する配列のグループにおける各配列の出現回数のうち、少なくとも一方に基づいて、前記ループに含まれる配列の中から前記複数の配列を選択することを特徴とする請求項1乃至6のいずれか1項に記載のコード変換装置。
  8. 前記第1コードに含まれる複数の配列のデータ定義は、配列構造体のデータ定義であることを特徴とする請求項1乃至7のいずれか1項に記載のコード変換装置。
  9. 複数の配列のデータ定義と、前記複数の配列に対する所定の演算と、前記所定の演算の演算結果を表す配列のデータ定義とを含む、第1コードを記憶する記憶部を有するコンピュータが、
    前記第1コードに含まれる前記複数の配列のデータ定義と前記演算結果を表す配列のデータ定義とを、構造体配列のデータ定義に変換し、
    前記第1コードに含まれる前記所定の演算を、前記構造体配列に対する演算に変換し、
    前記複数の配列各々の異なるデータに対して、前記構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成することを特徴とするコード変換方法。
  10. 複数の配列のデータ定義と、前記複数の配列に対する所定の演算と、前記所定の演算の演算結果を表す配列のデータ定義とを含む、第1コードを記憶する記憶部を有するコンピュータに、
    前記第1コードに含まれる前記複数の配列のデータ定義と前記演算結果を表す配列のデータ定義とを、構造体配列のデータ定義に変換させ、
    前記第1コードに含まれる前記所定の演算を、前記構造体配列に対する演算に変換させ、
    前記複数の配列各々の異なるデータに対して、前記構造体配列に対する演算を並列に実行する所定の命令を含む、第2コードを生成させることを特徴とするコード変換プログラム。
JP2018077108A 2018-04-12 2018-04-12 コード変換装置、コード変換方法、及びコード変換プログラム Active JP7035751B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2018077108A JP7035751B2 (ja) 2018-04-12 2018-04-12 コード変換装置、コード変換方法、及びコード変換プログラム
US16/376,557 US10908899B2 (en) 2018-04-12 2019-04-05 Code conversion apparatus and method for improving performance in computer operations

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2018077108A JP7035751B2 (ja) 2018-04-12 2018-04-12 コード変換装置、コード変換方法、及びコード変換プログラム

Publications (2)

Publication Number Publication Date
JP2019185486A true JP2019185486A (ja) 2019-10-24
JP7035751B2 JP7035751B2 (ja) 2022-03-15

Family

ID=68161579

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2018077108A Active JP7035751B2 (ja) 2018-04-12 2018-04-12 コード変換装置、コード変換方法、及びコード変換プログラム

Country Status (2)

Country Link
US (1) US10908899B2 (ja)
JP (1) JP7035751B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021070844A1 (ja) 2019-10-08 2021-04-15 株式会社ニトムズ 清掃用シート、清掃用シートの積層体、清掃具、及び、清掃用シートの製造方法

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0675987A (ja) * 1992-06-22 1994-03-18 Hitachi Ltd ループ変換方法
JPH0728702A (ja) * 1993-07-14 1995-01-31 Hitachi Ltd プログラムの変換方法
JP2005174292A (ja) * 2003-12-09 2005-06-30 Arm Ltd データシフト操作
US20120089792A1 (en) * 2010-09-29 2012-04-12 Brian Fahs Efficient implementation of arrays of structures on simt and simd architectures
JP2014038624A (ja) * 2012-08-16 2014-02-27 Samsung Electronics Co Ltd 動的データ構成のための方法及び装置
US20150294435A1 (en) * 2014-04-09 2015-10-15 Intel Corporation Banked memory access efficiency by a graphics processor
JP2015225427A (ja) * 2014-05-27 2015-12-14 ルネサスエレクトロニクス株式会社 プロセッサ及びデータ収集方法
JP2016081135A (ja) * 2014-10-10 2016-05-16 富士通株式会社 情報処理プログラム、情報処理装置、情報処理方法
US20170177356A1 (en) * 2015-12-18 2017-06-22 Elmoustapha Ould-Ahmed-Vall Systems, Apparatuses, and Method for Strided Access

Family Cites Families (34)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5734921A (en) * 1990-11-13 1998-03-31 International Business Machines Corporation Advanced parallel array processor computer package
US5752067A (en) * 1990-11-13 1998-05-12 International Business Machines Corporation Fully scalable parallel processing system having asynchronous SIMD processing
US5625836A (en) * 1990-11-13 1997-04-29 International Business Machines Corporation SIMD/MIMD processing memory element (PME)
US5590345A (en) * 1990-11-13 1996-12-31 International Business Machines Corporation Advanced parallel array processor(APAP)
US5966528A (en) * 1990-11-13 1999-10-12 International Business Machines Corporation SIMD/MIMD array processor with vector processing
US5765011A (en) * 1990-11-13 1998-06-09 International Business Machines Corporation Parallel processing system having a synchronous SIMD processing with processing elements emulating SIMD operation using individual instruction streams
JP3261239B2 (ja) * 1993-07-27 2002-02-25 富士通株式会社 データ転送の一括化処理方法
JPH10228382A (ja) * 1997-02-14 1998-08-25 Nec Corp コンパイル方式
US6463582B1 (en) * 1998-10-21 2002-10-08 Fujitsu Limited Dynamic optimizing object code translator for architecture emulation and dynamic optimizing object code translation method
US7657861B2 (en) * 2002-08-07 2010-02-02 Pact Xpp Technologies Ag Method and device for processing data
US8108844B2 (en) * 2006-06-20 2012-01-31 Google Inc. Systems and methods for dynamically choosing a processing element for a compute kernel
EP1975791A3 (en) * 2007-03-26 2009-01-07 Interuniversitair Microelektronica Centrum (IMEC) A method for automated code conversion
US8254455B2 (en) * 2007-06-30 2012-08-28 Microsoft Corporation Computing collocated macroblock information for direct mode macroblocks
US8265144B2 (en) * 2007-06-30 2012-09-11 Microsoft Corporation Innovations in video decoder implementations
US9648325B2 (en) * 2007-06-30 2017-05-09 Microsoft Technology Licensing, Llc Video decoding implementations for a graphics processing unit
US8327344B2 (en) * 2008-10-14 2012-12-04 International Business Machines Corporation Array reference safety analysis in the presence of loops with conditional control flow
WO2011091323A1 (en) * 2010-01-21 2011-07-28 Qst Holdings, Llc A method and apparatus for a general-purpose, multiple-core system for implementing stream-based computations
JP5966509B2 (ja) 2012-03-29 2016-08-10 富士通株式会社 プログラム、コード生成方法および情報処理装置
US20130339649A1 (en) * 2012-06-15 2013-12-19 Intel Corporation Single instruction multiple data (simd) reconfigurable vector register file and permutation unit
JP6164054B2 (ja) * 2013-11-08 2017-07-19 富士通株式会社 情報処理装置、コンパイル方法およびコンパイラプログラム
US9501268B2 (en) * 2013-12-23 2016-11-22 International Business Machines Corporation Generating SIMD code from code statements that include non-isomorphic code statements
US20150243259A1 (en) * 2014-02-26 2015-08-27 National Tsing Hua University Method and apparatus for transferring data in a computer
US10095479B2 (en) * 2015-04-23 2018-10-09 Google Llc Virtual image processor instruction set architecture (ISA) and memory model and exemplary target hardware having a two-dimensional shift array structure
US9785423B2 (en) * 2015-04-23 2017-10-10 Google Inc. Compiler for translating between a virtual image processor instruction set architecture (ISA) and target hardware having a two-dimensional shift array structure
JP2016224812A (ja) * 2015-06-02 2016-12-28 富士通株式会社 並列計算装置、並列処理方法、並列処理プログラムおよびコンパイルプログラム
US20170177355A1 (en) * 2015-12-18 2017-06-22 Intel Corporation Instruction and Logic for Permute Sequence
US10152321B2 (en) * 2015-12-18 2018-12-11 Intel Corporation Instructions and logic for blend and permute operation sequences
US20170177345A1 (en) * 2015-12-18 2017-06-22 Intel Corporation Instruction and Logic for Permute with Out of Order Loading
US20180005346A1 (en) * 2016-07-01 2018-01-04 Google Inc. Core Processes For Block Operations On An Image Processor Having A Two-Dimensional Execution Lane Array and A Two-Dimensional Shift Register
US20180007302A1 (en) * 2016-07-01 2018-01-04 Google Inc. Block Operations For An Image Processor Having A Two-Dimensional Execution Lane Array and A Two-Dimensional Shift Register
US10891131B2 (en) * 2016-09-22 2021-01-12 Intel Corporation Processors, methods, systems, and instructions to consolidate data elements and generate index updates
US10663633B2 (en) * 2017-06-29 2020-05-26 Taiwan Semiconductor Manufacturing Co., Ltd. Aperture design and methods thereof
US10275230B2 (en) * 2017-07-14 2019-04-30 Advanced Micro Devices, Inc. Cache aware self-referential structure peeling
US10678524B2 (en) * 2018-03-15 2020-06-09 Intel Corporation Runtime struct fields size reduction

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0675987A (ja) * 1992-06-22 1994-03-18 Hitachi Ltd ループ変換方法
JPH0728702A (ja) * 1993-07-14 1995-01-31 Hitachi Ltd プログラムの変換方法
JP2005174292A (ja) * 2003-12-09 2005-06-30 Arm Ltd データシフト操作
US20120089792A1 (en) * 2010-09-29 2012-04-12 Brian Fahs Efficient implementation of arrays of structures on simt and simd architectures
JP2014038624A (ja) * 2012-08-16 2014-02-27 Samsung Electronics Co Ltd 動的データ構成のための方法及び装置
US20150294435A1 (en) * 2014-04-09 2015-10-15 Intel Corporation Banked memory access efficiency by a graphics processor
JP2015225427A (ja) * 2014-05-27 2015-12-14 ルネサスエレクトロニクス株式会社 プロセッサ及びデータ収集方法
JP2016081135A (ja) * 2014-10-10 2016-05-16 富士通株式会社 情報処理プログラム、情報処理装置、情報処理方法
US20170177356A1 (en) * 2015-12-18 2017-06-22 Elmoustapha Ould-Ahmed-Vall Systems, Apparatuses, and Method for Strided Access

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021070844A1 (ja) 2019-10-08 2021-04-15 株式会社ニトムズ 清掃用シート、清掃用シートの積層体、清掃具、及び、清掃用シートの製造方法

Also Published As

Publication number Publication date
US10908899B2 (en) 2021-02-02
US20190317767A1 (en) 2019-10-17
JP7035751B2 (ja) 2022-03-15

Similar Documents

Publication Publication Date Title
Farcy et al. Dataflow analysis of branch mispredictions and its application to early resolution of branch outcomes
JP6245031B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
US11656880B2 (en) Function evaluation using multiple values loaded into registers by a single instruction
JP2015201119A (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP2018028777A (ja) エミュレーション装置、エミュレーション方法、及び、エミュレーションプログラム
US11226798B2 (en) Information processing device and information processing method
Wang et al. Design and implementation of a highly efficient dgemm for 64-bit armv8 multi-core processors
US11231917B2 (en) Information processing apparatus, computer-readable recording medium storing therein compiler program, and compiling method
JP7035751B2 (ja) コード変換装置、コード変換方法、及びコード変換プログラム
JP5278538B2 (ja) コンパイルシステム、コンパイル方法およびコンパイルプログラム
JP5251688B2 (ja) コンパイラプログラムおよびコンパイラ装置
JP2018124877A (ja) コード生成装置、コード生成方法、およびコード生成プログラム
JP3638171B2 (ja) 資源割付装置
CN114041116A (zh) 数据移动任务优化的方法和装置
US11321094B2 (en) Non-transitory computer-readable medium, assembly instruction conversion method and information processing apparatus
US11734003B2 (en) Non-transitory computer-readable recording medium, compilation method, and compiler device
US20220405110A1 (en) Non-transitory computer-readable recording medium and compilation method
US11740906B2 (en) Methods and systems for nested stream prefetching for general purpose central processing units
Jin et al. Integer Sum Reduction with OpenMP on an AMD MI100 GPU
JP2017041162A (ja) 最適化装置、方法およびプログラム
WO2020116025A1 (ja) コンパイル装置、コンパイル方法、及び非一時的なコンピュータ可読媒体
Cho A Study on Efficient Use of Dual Data Memory Banks in Flight Control Computers
JP2019128760A (ja) コンパイラプログラム、コンパイル方法及びコンパイルする情報処理装置
JPH07105015A (ja) コンパイル方式

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20210113

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20211216

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20220214

R150 Certificate of patent or registration of utility model

Ref document number: 7035751

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150