JP6443125B2 - コンパイラプログラム、コンピュータプログラム及びコンパイラ装置 - Google Patents

コンパイラプログラム、コンピュータプログラム及びコンパイラ装置 Download PDF

Info

Publication number
JP6443125B2
JP6443125B2 JP2015035777A JP2015035777A JP6443125B2 JP 6443125 B2 JP6443125 B2 JP 6443125B2 JP 2015035777 A JP2015035777 A JP 2015035777A JP 2015035777 A JP2015035777 A JP 2015035777A JP 6443125 B2 JP6443125 B2 JP 6443125B2
Authority
JP
Japan
Prior art keywords
processing
instruction
unit
thread
cpu
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
JP2015035777A
Other languages
English (en)
Other versions
JP2016157339A (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 JP2015035777A priority Critical patent/JP6443125B2/ja
Priority to US14/968,084 priority patent/US9934036B2/en
Publication of JP2016157339A publication Critical patent/JP2016157339A/ja
Application granted granted Critical
Publication of JP6443125B2 publication Critical patent/JP6443125B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • 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/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30058Conditional branch instructions
    • 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
    • G06F9/30087Synchronisation or serialisation instructions
    • 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
    • G06F9/3009Thread control instructions
    • 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/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)
  • Computational Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)

Description

本発明は、並列処理を行うコンピュータプログラム、コンピュータプログラムを生成するコンピュータプログラム及びコンパイラ装置に関する。
従来から、マルチプロセッサ計算機に並列処理を実行させるオブジェクトコードを、ソースコードから生成するコンパイラプログラムが知られている(特許文献1、特許文献2)。
特開平5−12033号公報 特開平5−61899号公報
大量のデータを複数スレッドで並列処理する場合、処理データをスレッド数よりも多くの部分集合に分割しておき、データの各部分集合に対する処理をメモリ上に配置し、各スレッドが割当分を終了したときに次の部分集合を割り当てるようにする。このような処理では、次の部分集合を割り当てる際に、各部分集合が「未処理」、「処理済み」、「他のスレッドに割当済」のいずれの状態であるかを確定するための同期処理が必要となる。この同期処理は、処理全体から見ればオーバヘッドとなる。さらに、同期処理の回数が増えれば、データ処理時間が短縮しても、同期処理のオーバヘッドにより、全体の処理時間が結果的に短縮されない。
1つの側面では、複数スレッドでデータを処理する際の実行時間を短縮させるオブジェクトプログラムを生成するコンパイラプログラム等を提供することを目的とする。
本明細書に開示するコンパイラプログラムは、処理すべきデータ集合の要素数から、スレッド数よりも大きい前記データ集合の分割数を算出し、算出した分割数に、前記データ集合を分割し、分割したデータ集合それぞれの処理を行う複数の実行コードを含み、各実行コードの先頭に、該実行コードに最初に到達したスレッドが処理を行う命令を配してあるオブジェクトコードを生成する処理をコンピュータに行わせる
本発明の一観点によれば、複数スレッドでデータを処理する際の全体の処理時間を短縮することが可能となる。
コンパイラ装置のハードウェア構成の一例を示すブロック図である。 並列処理装置のハードウェア構成の一例を示すブロック図である。 並列処理プログラムの構造の一例を示す説明図である。 並列処理装置の備えるCPUの構成の一例を示すブロック図である。 SA命令の動作内容をフローチャートである。 命令コードTEST&IDAにより実行される処理の例を示すフローチャートである。 SA命令の動作例を示す説明図である。 並列処理プログラムの生成手順を示すフローチャートである。 部分実行部の生成手順を示すフローチャートである。 部分実行部の出力手順を示すフローチャートである。 部分実行部の構成の一例を示す説明図である。 並列処理プログラムの構成の一例を示す説明図である。 部分実行部の内容を示す説明図である。 並列処理プログラムの生成手順を示すフローチャートである。 並列処理プログラムの構成の一例を示す説明図である。 並列処理プログラムの構成の一例を示す説明図である。 コンパイラ装置の機能構成の一例を示す説明図である。
実施の形態1
以下、実施の形態を、図面を参照して説明する。図1はコンパイラ装置1のハードウェア構成の一例を示すブロック図である。コンパイラ装置1は、汎用コンピュータ、ワークステーション、デスクトップ型PC(パーソナルコンピュータ)、ノートブック型PC等である。コンパイラ装置1は、CPU(Central Processing Unit)11、RAM(Random Access Memory)12、ROM(Read Only Memory)13、大容量記憶装置14、入力部15、出力部16、通信部17、読取り部18を含む。各構成はバスで接続されている。
CPU11はROM13に記憶された制御プログラム1Pに従いハードウェア各部を制御する。RAM12は例えばSRAM(Static RAM)、DRAM(Dynamic RAM)、フラッシュメモリである。RAM12はCPU11によるプログラムの実行時に発生するデータを一時的に記憶する。
大容量記憶装置14は、例えばハードディスク、SSD(Solid State Drive)などである。大容量記憶装置14には、各種データが記憶されている。また、制御プログラム1Pを大容量記憶装置14に記憶するようにしておいても良い。
入力部15はコンパイラ装置1にデータを入力するためのキーボート、マウスなどを含む。
出力部16は画像出力を行う表示装置、音声出力を行うスピーカなどを含む。
通信部17はネットワークを介して、他のコンピュータと通信を行う。読取り部18はCD(Compact Disc)−ROM、DVD(Digital Versatile Disc)−ROMを含む可搬型記憶媒体1aを読み取る。CPU11が読取り部18を介して、制御プログラム1Pを可搬型記憶媒体1aより読み取り、大容量記憶装置14に記憶しても良い。また、ネットワークを介して他のコンピュータからCPU11が制御プログラム1Pをダウンロードし、大容量記憶装置14に記憶しても良い。さらにまた、半導体メモリ1bから、CPU11が制御プログラム1Pを読み込んでも良い。
図2は並列処理装置2のハードウェア構成の一例を示すブロック図である。並列処理装置2は、汎用コンピュータ、ワークステーション、デスクトップ型PC、ノートブック型PC等である。並列処理装置2は、CPU21、RAM22、ROM23、大容量記憶装置24、入力部25、出力部26、通信部27、読取り部28を含む。各構成はバスで接続されている。並列処理装置2のハードウェアの各構成は、コンパイラ装置1と同様であるので、説明を省略する。
コンパイラ装置1はコンパイラプログラムを実行し、ソースコードから並列処理装置2で実行可能な並列処理プログラム(オブジェクトコード)を生成する。並列処理装置2でコンパイラプログラムを実行し、並列処理プログラムを生成してもよい。
本実施の形態における並列処理プログラムは、処理すべきデータの集合を所定数に分割し、分割された部分集合毎に処理ブロックが設けられていることを特徴とする。図3は並列処理プログラムの構造の一例を示す説明図である。並列処理プログラムは、処理すべきデータを部分集合に分割し、分割した各部分集合を処理する処理ブロック(実行コード)を含む。図3では、部分集合1に対する処理を行う処理ブロック1、部分集合2に対する処理を行う処理ブロック2、部分集合3に対する処理を行う処理ブロック3、部分集合4に対する処理を行う処理ブロック4が示されている。各処理ブロックの先頭には、条件分岐命令(以下「SA命令」と呼ぶ)が埋め込まれている。SA命令については、後述する。
図4は、並列処理装置2の備えるCPU21の構成の一例を示すブロック図である。CPU21は、複数のコアC(C0、C1、C2、C3)、キャッシュメモリCMおよびレジスタ部REGUを有する。コアCは、互いに同一または同様の構成であるため、図3では、コアC0の構成を示し、以下では、コアC0の構成を説明する。なお、コアCの数は、4つに限定されない。CPU21は、RAM22に接続される。
コアC0は、演算部OPU、データレジスタ部DREG、アドレスレジスタ部AREG、プログラムカウンタPC、インクリメンタINC、命令レジスタ部IREG、デコーダ部DECおよびセレクタS1、S2を有する。演算部OPUは、レジスタファイルREG、演算器EXおよびフラグレジスタSF、ZFを有する。
プログラムカウンタPCは、セレクタS1から受けるアドレスをインクリメンタINCおよびセレクタS2に出力する。インクリメンタINCは、プログラムカウンタPCから受けるアドレスをインクリメントし、インクリメントしたアドレスをセレクタS1に出力する。
セレクタS1は、命令コードを順次にフェッチする場合、インクリメンタINCからの
アドレスを選択し、分岐命令またはジャンプ命令等が実行される場合、演算部OPUからのアドレスを選択する。そして、セレクタS1は、選択したアドレスをプログラムカウンタPCに出力する。セレクタS2は、命令コードをフェッチする場合、プログラムカウンタPCから出力されるアドレスを選択し、ロード命令またはストア命令を実行する場合、アドレスレジスタ部AREGから出力されるアドレスを選択する。そして、セレクタS2は、選択したアドレスを、アドレスバスAD0を介してキャッシュメモリCMに出力する。
コアC0が命令をフェッチする場合、アドレスAD0に応じて、キャッシュメモリCMから命令コードが読み出され、読み出された命令コードがデータバスDINを介して命令レジスタ部IREGに格納される。キャッシュメモリCMが命令コードを保持していない場合、キャッシュメモリCMは、アドレスバスAD1を介してRAM12にアドレスを出力し、データバスDTを介してRAM12から命令コードを受ける。例えば、アドレスAD1は、アドレスAD0の上位アドレスであり、キャッシュメモリCMの1キャッシュライン分の命令コード(プログラム)がRAM12から読み出される。そして、キャッシュメモリCMは、RAM12から読み出した命令コードを保持するとともに、保持した命令コードのうち読み出し対象の命令コードを、データバスDINを介して命令レジスタ部IREGに出力する。
コアC0がロード命令を実行する場合、アドレスAD0に応じて、キャッシュメモリCMからデータが読み出され、読み出されたデータがデータバスDINを介してレジスタファイルREGに格納される。キャッシュメモリCMがロード命令の対象のデータを保持していない場合、命令コードの読み出しと同様に、キャッシュメモリCMは、RAM22から1キャッシュライン分のデータを読み出す。そして、キャッシュメモリCMは、RAM22から読み出したデータを保持するとともに、保持したデータのうちロード対象のデータを、データバスDINを介してレジスタファイルREGに出力する。
コアC0がストア命令を実行する場合、アドレスバスAD0に出力されたアドレスに応じて、データレジスタ部DREGからデータバスDOUTに出力されたデータがキャッシュメモリCMに書き込まれる。
命令レジスタ部IREGは、キャッシュメモリCMから受ける命令コードを保持する複数の領域を有し、保持している命令コードをデコーダ部DECに順次に出力する。デコーダ部DECは、命令レジスタ部IREGから受ける命令コードをデコードし、デコード結果に基づいて、演算部OPUおよびセレクタS1、S2等の動作を制御する制御信号を生成する。
データレジスタ部DREGは、ストア命令の実行時に演算部OPUから出力されるデータを保持する複数の領域を有する。アドレスレジスタ部AREGは、ロード命令またはストア命令の実行時に演算部OPUから出力されるアドレスを保持する複数の領域を有する。
レジスタファイルREGは、キャッシュメモリCMから読み出されるデータまたは演算器EXから出力されるデータを保持する複数のレジスタを有する。レジスタファイルREGは、デコーダ部DECからの制御信号に基づいて、レジスタファイルREGの複数のレジスタの少なくともいずれかに保持しているデータを演算器EXに出力する。
演算器EXは、デコーダ部DECがデコードした命令コードにしたがって演算を実行し、演算結果をレジスタファイルREG、データレジスタ部DREG、アドレスレジスタ部AREGまたはセレクタS1に出力する。また、演算器EXは、演算結果に基づいてフラグレジスタSF、ZFをセットまたはリセットし、論理演算命令または分岐命令等を実行する場合にフラグレジスタSF、ZFの値を参照する。なお、演算部OPUは、フラグレジスタSF、ZF以外のフラグレジスタを有してもよい。
レジスタ部REGUは、複数のレジスタREGi(iは0、1、2、3、4のいずれか)と、レジスタREGjとを有する。なお、レジスタREGiの記憶領域の数Iは、”5”に限定されず、”1”以上であればよい。レジスタ部REGUは、コアC0−C3の各々が実行する処理が、各処理ブロックの入口へ到達したことを示す到達情報を保持する。
図3では、各レジスタREGiに保持される値は、符号Xi(X0からX4のいずれか)で示される。例えば、各レジスタREGiのビット幅とレジスタREGjのビット幅とは、互いに等しい。
レジスタREGiは、並列処理の進行とともに、巡回的に使用される。各レジスタREGiには、各部分集合の処理を行う各処理ブロックの入口に到達していないスレッドTHの数である未到達数Xiが格納される。なお、コアC0−C3の数(=4)から未到達数Xiを減じた値は、各処理ブロックの入口に到達したスレッドTHの数を示す。すなわち、未到達数Xiは、各処理ブロックの入口に処理が到達したコアC0−C3の数を示す到達数情報の一例である。なお、各レジスタREGiには、各処理ブロックの入口に到達したスレッドTHの数が格納されてもよい。
レジスタREGjには、全てのスレッドTHが通過したシングル処理ブロックSIBの総数である総通過数jが格納される。総通過数jは、全てのコアC0−C3の処理が通過したシングル処理ブロックSIBの数を示す総通過数情報の一例である。レジスタREGjは、総通過数情報を保持する総通過数領域の一例である。
命令コードTEST&IDAは、加算命令、乗算命令、ロード命令、ストア命令などと同様に、演算器EXがマイクロプログラムを実行することで処理される。なお、命令コードTEST&IDAを実行する演算器EXの動作は、ワイヤードロジックで実現されてもよい。しかしながら、マイクロプログラム方式を採用することで、命令コードTEST&IDAを、ワイヤードロジック方式に比べて容易に追加することができ、ハードウェア機能(命令セットのアーキテクチャ)を容易に変更することができる。
キャッシュメモリCMは、命令キャッシュおよびデータキャッシュとして動作する。なお、キャッシュメモリCMは、コアC毎に設けられてもよく、一次キャッシュおよび二次キャッシュを含んでもよい。RAM22には、コアCにより実行されるスレッド数数nを保持する記憶領域と、コアC0−C3のそれぞれが各処理ブロックを通過した数を示す通過数m(m0、m1、m2、m3)を保持する記憶領域とを設ける。スレッド数nおよび通過数mは、キャッシュメモリCMにも保持される。キャッシュメモリCMがスレッド数nおよび通過数mを保持する場合、各コアは、RAM22にアクセスすることなく、キャッシュメモリCMにアクセスすることで、スレッド数nおよび通過数mを参照することができ、また、通過数mを書き替えることができる。
次に、SA命令について説明する。SA命令は、レジスタ部REGUに保持された未到達数Xiおよび総通過数jに基づき、NOP命令又はJump命令として動作する。SA命令は2つの引数n、adrを取る。nはスレッド数である。adrはJump命令として動作するときのジャンプ先アドレスである。
図5はSA命令の動作内容をフローチャートである。コアCはスレッド数nおよび通過数mをRAM12からロードする(ステップS11)。RAM12がスレッド数nおよび通過数mを保持している場合、スレッド数nおよび通過数mは、キャッシュメモリCMから読み出される。
次に、コアCは、RAM12からロードしたスレッド数nおよび通過数mを変数として、命令コードTEST&IDAを実行する(ステップS12)。コアCはフラグレジスタSFの値が1であるか否かを判定する(ステップS13)。コアCはフラグレジスタSFの値が1と判定した場合(ステップS13でYES)、レジスタREGiに空きがあると判断し、フラグレジスタZFの値が1であるか否かを判定する(ステップS15)。コアCはフラグレジスタSFの値が1でないと判定した場合(ステップS13でNO)、レジスタREGiに空きがないと判断し、処理をステップS14に移す。コアCは所定時間を待った後、処理をステップS12に戻す。なお、ステップS14において、コアCは、所定時間を待つ間、他の処理を実行してもよい。
コアCはフラグレジスタZFの値が1であると判定した場合(ステップS15でYES)、PC(プログラムカウンタ)をSA命令の次のアドレスに設定する(ステップS16)。コアCはフラグレジスタZFの値が1でないと判定した場合(ステップS15でNO)、PC(プログラムカウンタ)をadrに設定する(ステップS17)。
コアCはRAM12からロードした通過数mを1増加させる(ステップS18)。コアCは通過数mをRAM12にストアする(ステップS19)。キャッシュメモリCMが通過数mを保持している場合、通過数mは、キャッシュメモリCMに保持された後、RAM12に格納される。そして、コアCはSA命令の実行を終了する。
図6は命令コードTEST&IDAにより実行される処理の例を示す。図6に示す処理は、図4に示す演算器EXが、命令コードTEST&IDAに対応するマイクロプログラムを実行することで実現される。
演算器EXは、通過数mと総通過数jとの差がレジスタREGiの数Iより小さいか否かを判定する(ステップS21)。演算器EXは、通過数mと総通過数jとの差がレジスタREGiの数Iより小さいと判定した場合(ステップS21でYES)、各処理ブロックの入口へ処理が到達したことを示すために、フラグレジスタSFを1にセットする(ステップS22)。
演算器EXは、通過数mをレジスタREGiの数Iで除した余りiを算出し、算出した余りiを、使用するレジスタREGiの番号iとする(ステップS23)。
演算器EXは、ステップS23で求めたレジスタREGiに格納された未到達数Xiが0であるか否か、すなわち、最初に処理ブロックの入口へ処理が到達したか否かを判定する(ステップS24)。演算器EXは、最初に処理ブロックの入口へ処理が到達した判定した場合、すなわち、Xiが0であると判定した場合(ステップS24でYES)、スレッド数nから1を引いた値を、未到達数XiとしてレジスタREGiに格納する(ステップS25)。演算器EXは、処理ブロックの入口へ処理が最初に到達したことを示すために、フラグレジスタZFを1にセットし(ステップS26)、処理を終了する。
一方、演算器EXは、未到達数Xiが0でないと判定した場合(ステップS24でNO)、他のコアCの処理が処理ブロックの入口へ到達済みであるので、未到達数Xiを1減らす(ステップS27)。演算器EXは、処理ブロックの入口へ処理が最初に到達していないことを示すために、フラグレジスタZFを0にリセットする(ステップS28)。演算器EXは、未到達数Xiが0であるか否かを判定する(ステップS29)。演算器EXは、未到達数Xiが0の場合(ステップS29でYES)、処理ブロックの入口への処理の到達が最後であるので、総通過数jを1増加させ(ステップS30)、処理を終了する。
演算器EXは、未到達数Xiが0でない場合(ステップS29でNO)、処理ブロックの入口へ処理が到達していない他のコアCがあるので、処理を終了する。
一方、演算器EXは、通過数mと総通過数jとの差がレジスタREGiの数I以上であると判定した場合(ステップS21でNO)、すなわち、使用可能なレジスタREGiがない場合、フラグレジスタSFを0にセットし(ステップS31)、処理を終了する。フラグレジスタSFを0にセットするのは、処理ブロックの入口へ処理が実際には到達しているが、到達していないことを擬似的に示すためである。
以上のように、SA命令により、各処理ブロックの入口へ処理が最初に到達したスレッドが、処理ブロックの処理を実行し、各処理ブロックの入口へ処理が2番目以降に到達したスレッドは、次の処理ブロックの入口へジャンプする。それにより、各処理ブロックの入口へ処理が最初に到達したスレッドが、各処理ブロックを実行する。各処理ブロックの入口へ処理が2番目以降に到達したスレッドは、次の処理ブロックの入口へジャンプする。したがって、同期処理をせずに、各スレッドは未処理の部分集合に関する処理を連続して実行することが可能となる。
次に、SA命令の動作例を示す。図7はSA命令の動作例を示す説明図である。図7に示す例では簡単のために2つのスレッド1、2が動作する場合を示している。スレッド1、2は、図7の上部から下部に向かって処理を行う。時刻T1において、スレッド1は処理ブロック1の入口に到達し、SA命令を実行する。スレッド2は時刻T1の時点では、処理ブロックの入口へ到達はしていないので、スレッド1の実行したSA命令はNOPと同様な処理を行い、スレッド1が処理ブロック1の処理を行う。
時刻T2にスレッド2が処理ブロック2の入口に到達する。スレッド2がSA命令を実行すると、2番目以降の到達であるからジャンプ命令の動作となり、処理ブロック2の入口へジャンプする。スレッド2は再び、SA命令を実行する。スレッド1は時刻T2では処理ブロック1の実行を行っている。したがって、スレッド2が処理ブロック2の入口へ到達したスレッドであるから、SA命令はNOPと同様な処理となり、スレッド2が処理ブロック2の処理を行う。
時刻T3にスレッド1が処理ブロック2の入口へ到達するが、すでにスレッド2が到達済みであるから、SA命令の実行により、スレッド1は処理ブロック3の入口へジャンプする。再び、スレッド1はSA命令を実行する。時刻T3において、スレッド2は処理ブロック2を実行中であるから、スレッド1が処理ブロック3の入口へ最初に到達したスレッドである。したがってSA命令はNOPと同様な処理となり、スレッド1が処理ブロック3の処理を行う。
時刻T4にスレッド1が処理ブロック4の入口へ到達する。スレッド1がSA命令を実行する。スレッド2は処理ブロック2の処理を行っているため、スレッド1が処理ブロック4の入口に最初に到達したスレッドである。したがってSA命令はNOPと同様な処理となり、スレッド1が処理ブロック4の処理を行う。
次に、SA命令を用いた並列処理プログラムを生成するコンパイラについて説明する。コンパイラ装置1のCPU11がコンパライラプログラムを実行することにより、CPU11はコンパイラとして動作する。ここでは一例として、以下に示す処理対象コードDに含まれる処理対象データの集合Sを、k個のスレッドで並列処理させるオブジェクトプログラム(並列処理プログラム)を生成するものとする。
<Sの宣言部>
thread_parallel_start
<Sに対する並列処理実行部>
thread_parallel_end
図8は並列処理プログラムの生成手順を示すフローチャートである。CPU11は、集合(データ集合)Sを0からn−1の指標で指定されるn個の部分集合に分割するために、n≧kの条件を満たす分割数nを、次のように定める。CPU11は、集合Sの要素数|S|をkで除した値が閾値Aより大きいか否かを、判定する(ステップS41)。なお、閾値Aは、並列処理プログラムを生成するのに先立ち、すなわち、コンパイル実行時に与えられるものとする。CPU11は、要素数|S|をkで除した値が閾値Aより大きいと判定した場合(ステップS41でYES)、分割数nを、スレッドの個数kを3倍にした値とする(ステップS42)。CPU11は、要素数|S|をkで除した値が閾値A以下であると判定した場合(ステップS41でNO)、分割数nをステップの個数kとする(ステップS43)。CPU11は、分割数nの数だけ、部分実行部(実行コード、処理ブロック)を生成する(ステップS44)。部分実行部とは、並列処理実行部の処理内容と、n分割された集合Sの部分集合の1つとが対応付けられたものである。CPU11は、生成した部分実行部を出力する(ステップS45)。CPU11は並列処理プログラムの生成を終了する。
図9は部分実行部の生成手順を示すフローチャートである。CPU11はループ変数iを0に設定する(ステップS51)。CPU11は集合Sの要素数|S|をnで割った余り(|S|%n)がiより大きいか否かを判定する(ステップS52)。CPU11は要素数|S|をnで割った余り(|S|%n)がiより大きいと判定した場合(ステップS52でYES)、要素数|s|をnで除した値に1足したものをiter[i]に設定する(ステップS53)。CPU11は要素数|S|をnで割った余り(|S|%n)がiより大きくないと判定した場合(ステップS52でNO)、要素数|s|をnで除した値に設定する(ステップS54)。iter[i]は、i番目の部分実行部での処理の繰り返し数を示す。
CPU11はループ変数iを1増加させる(ステップS55)。CPU11はループ変数iがn以上となったか否かを判定する(ステップS56)。CPU11はループ変数iがn以上ではないと判定した場合(ステップS56でNO)、処理をステップS52へ戻す。CPU11はループ変数iがn以上であると判定した場合(ステップS56でYES)、ステップS57以下の処理を行う。S57以下の処理は、集合Sのうち各部分集合が処理を行う箇所の先頭要素番号add[i]を設定する処理である。
CPU11は変数tmpの値を0に設定する(ステップS57)。CPU11はadd[0]の値をtmpとする(ステップS58)。CPU11はループ変数iを1に設定する(ステップS59)。CPU11は変数tmpの値に、iter[i−1]の値を、新たな変数tmpの値とする(ステップS60)。CPU11はadd[i]の値を変数tmpの値とする(ステップS61)。CPU11はループ変数iの値を1増加させる(ステップS62)。CPU11はループ変数iがnより大きいか否かを判定する(ステップS63)。CPU11はループ変数iがnより大きくないと判定した場合(ステップS63でNO)、処理をステップS60に戻す。CPU11はループ変数iがnより大きいと判定した場合(ステップS63でYES)、処理を呼び出し元に戻す。なお、説明の都合上、図9では、ステップS52からS54までの処理と、ステップS60からステップS61までの処理とを別のループとして示したが、1つのループ処理することが可能である。
図10は部分実行部の出力手順を示すフローチャートである。CPU11はループ変数iを0に設定する(ステップS71)。CPU11はSA命令を出力する(ステップS72)。SA命令の第1引数には、スレッド数であるkを設定する。第2引数には、i番目の部分実行部を格納するメモリアドレスの次のメモリアドレス(出口アドレス)を設定する。CPU11はi番目の部分実行部の命令群Q(i)を出力する(ステップS73)。CPU11はループ変数iを1増加させる(ステップS74)。CPU11はループ変数iがn以上であるか否かを判定する(ステップS75)。CPU11はループ変数iがn以上ではないと判定した場合(ステップS75でNO)、処理をステップS72に戻す。CPU11はループ変数iがn以上であると判定した場合(ステップS75でYES)、処理を呼び出し元に戻す。なお、部分実行部の出力は、図9に示す部分実行部の生成と一体の処理として、1つのループ処理として行うことも可能である。
図11は部分実行部の構成の一例を示す説明図である。図11に示すのはi番目の部分実行部である。上述したように、部分実行部の冒頭には、SA命令が設けられている。第1引数には、スレッド数であるkが設定されている。第2引数には、次の(i+1)番目の部分実行部の先頭アドレスである0xbbbbbbbbが設定されている。
図12は並列処理プログラムの構成の一例を示す説明図である。並列処理プログラムは、部分実行部0からn−1までのn個の部分実行部を含む。各部分実行部は処理Q(i)(i=0〜n−1)を行う。集合Sはn個に分割され、部分集合0の処理は部分実行部0が行う。同様に、部分集合1の処理は部分実行部1が、…部分集合n−1の処理は部分実行部n−1が行う。
各処理Q(i)の冒頭には、図11に示したようにSA命令が設けてある。最初にi番目の部分実行部に到達したスレッドがSA命令を実行すると、NOP命令と同様な動作となるので、i番目の部分実行部の処理Q(i)の実行を行う。2番目以降に、i番目の部分実行部に到達したスレッドがSA命令を実行すると、Jump命令と同様な動作となり、(i+1)番目の部分実行部の先頭にJumpし、再びSA命令が実行される。(i+1)番目の部分実行部に最初に到達したスレッドがSA命令を実行したのであれば、SA命令はNOP命令と同様な操作となり、2番目以降に到達したスレッドがSA命令を実行したのであれば、Jump命令と同様な動作となる。したがって、(i+1)番目の部分実行部についても、最初に到達したスレッドが、(i+1)番目の部分実行部の処理Q(i+1)を実行することになる。
次に、コンパイラ装置1の動作について、以下のC言語のソースプログラムを例にして、再度、説明する。
int num = 100000000;
double a[N];

thread_para_start
for(i=0;i<num;i++)
a[i] = a[i] * 2;
thread_para_end
ここで、thread_para_startとthread_para_endは、スレッド並列処理の開始位置と終了位置とを示す。
このプログラムを3個のスレッドで並列処理する場合の並列処理プログラムを生成する。上述のソースプログラムは要素数がnum=100,000,000個の配列を処理するから、集合Sの要素数|S|は、numである。ここで、分割数nを決定の際に使用する閾値Aは20,000,000であるとする。num/3>Aが成立するため(図8のステップS41でYES)、n=3*k=3*3より、n=9となる(同ステップS42)。
集合Sの要素数|S|をnで除した余りは、1である。図9のステップS52において、i=0のときYES、i=1から8のときは、NOと判定される。よって、繰り返し数は、図9のステップS53及びS54により、
iter[0]=11111112
iter[i]=11111111 (i=1〜8)
となる。
各部分実行部の処理を行う部分集合の先頭要素番号add[i]は、図9のステップS57からステップS63の処理により、
add[0]=0
add[i]=11111112+11111111*(i−1) (i=1〜8)
となる。
以上の結果から、コンパイラ装置1は、部分実行部0から部分実行部8を生成する。図13は部分実行部の内容を示す説明図である。図13Aが0番目の部分実行部を、図13bが8番目の部分実行部を示している。8番目の部分実行部の後は、全てのスレッドが同期をとり、並列実行区間の演算を終えるようになっている。
実施の形態1においては、以下の様な効果を奏する。コンパイラ装置1が生成し、並列処理装置2で動作する並列処理プログラムは、処理データをスレッド数よりも多くの部分集合に分割しておき、データの各部分集合に対する処理を行う部分実行部を生成する。部分実行部の冒頭には、SA命令を設けることにより、各部分実行部に最初に到達したスレッドが、部分実行部の処理を実行し、それ以降に到達したスレッドは次の部分実行部にジャンプする。ジャンプ先の部分実行部の冒頭にもSA命令が冒頭に設けられており、同様な動作を行う。それにより、各スレッドの同期処理を行わずとも、各スレッドは未処理の部分集合についての処理を行うことが可能となり、全体の処理時間を短縮することが可能となる。
実施の形態2
実施の形態2では、リダクション指示節を持つ並列処理プログラムを対象とする。リダクション指示節は、リダクション演算をおこなう部分を並列処理したい場合に用いる指示説である。リダクション演算は、複数のプロセスが持つデータを対象とした演算である。代表的なリダクション演算としては、例えば、データの総和を求める演算、最大値、最小値を求める演算等が知られている。
リダクション演算では、最終的に、複数のスレッドの結果をまとめて、共有メモリ領域に書き込む必要がある。各スレッドが共有メモリ領域に書き込む際には、プロセッサのロック機能を使用して書き込みを行う。スレッド数が大きいとき、書き込みの競合が起き、ロック動作によって、待ち時間が発生する。実施の形態2では、当該待ち時間がより短くなるように構造を持つ並列処理プログラムを生成する。
図14は並列処理プログラムの生成手順を示すフローチャートである。コンパイラ装置1のCPU11は、ソースプログラムに書かれたリダクション指示節を持つ並列処理部分を分割する場合の分割数nを設定する(ステップS81)。nはスレッド数kよりも大きな値とする。CPU11は並列処理部分をn個に分割し、図12と同様な部分実行部{Q(0),…,Q(n−1)}を生成する(ステップS82)。
CPU11は変数tを1に設定する(ステップS83)。変数tは演算結果を格納するための部分実行部を何回生成したかを示す変数である。CPU11は分割数mを算出する(ステップS84)。mはn>mとなる自然数である。mは先行する部分実行部の個数などを用いて適宜設定する。
CPU11は分割数mが所定数より小さいか否かを判定する(ステップS85)。CPU11は、分割数mが所定数より小さくはないと判定した場合(ステップS85でNO)、{Q(0),…,Q(n−1)}の結果を格納するための部分実行部{Q(0),…,Q(m−1)}(格納コード)を生成し、部分実行部{Q(0),…,Q(n−1)}の後に配置する(ステップS86)。CPU11はtを1増加させる(ステップS87)。CPU11は処理をステップS84に戻す。
CPU11分割数mが所定数より小さいと判定した場合(ステップS85でYES)、部分実行部{Q(0),…,Q(m−1)}の演算結果を、例えば、アトミック演算命令を用いる従来の方法などを用いて、リダクション指示節に沿って、共有領域メモリに対して格納する命令を配置する(ステップS88)。CPU11は処理を終了する。
図15は並列処理プログラムの構成の一例を示す説明図である。上述したように、処理Q(0)を行う部分実行部0から、処理Q(n−1)を行う部分実行部n−1までのn個の部分実行部が配置されている。その後に、結果格納のための処理Q(0)を行う部分実行部0(2回目)から、処理Q(m−1)を行う部分実行部m(2回目)が配されている。さらに、その後に、演算結果を共有領域メモリに対して格納する命令を含む処理Q(0)を行う部分実行部0(3回目)などが配置されている。並列実行区間の最後には、全スレッドの同期処理が配置されている。
図15に記載されているQ(0)、Q(1)からQ(0)に向かう矢印 は、Q(0)、Q(1)に対するリダクション指示節を考慮した演算結果を、Q(0)からアクセスの可能な領域に格納することを意味している。Q(0)からQ(0)に向かう矢印も、同様な内容を示す。
図15に示した構成の並列処理プログラムの動作について説明する。並列処理装置2のCPU21は、k個のスレッドで並列処理を行う。部分実行部{Q(0)、…,Q(n−)}に対する実行は、実施の形態1での処理と同様である。また、CPU21により実現される各スレッドは、リダクション指示節の内容に沿った演算結果を対応する次の部分実行部{Q(0),…,Q(m−1)}がアクセス可能な領域に格納する。すなわち、Q(n−1)の次の処理に到達したスレッドは、次の部分実行部{Q(0),…,Q(m−1)}の先頭にあるQ(0)に対する処理を行う。同様に、処理の行われていない部分実行部に対して、各スレッドが次々に処理を行う。
図16は、並列処理プログラムの構成の一例を示す説明図である。図16に示すのは、並列処理プログラムの並列実行区間の後半に実行される部分実行部の配置例を示している。図16の例では、部分実行部{Qt-1(1),…,Qt-1(j)}が配置されている。当該部分実行部{Qt-1(1),…,Qt-1(j)}では、リダクション指示節にしたがって、演算結果を共有領域のメモリに対して格納する命令を、スレッドが実行する。最後の部分実行部の出口アドレスまで到達したスレッドは、他の全てのスレッドが当該並列実行区間の処理を終えるまで待つ。最後まで処理を行っていたスレッドが最後の部分実行部の出口アドレスに到達したら、他のスレッドと同期を取り、当該並列実行区間の処理を完了する。
実施の形態2では以下の効果を奏する。演算結果を格納するための処理を行う部分実行部の数が所定数以下になるまでは、SA命令が配置された部分実行部を生成し実行するので、メモリロックによる待ち時間を短縮することが可能となる。
図17はコンパイラ装置1の機能構成の一例を示す説明図である。コンパイラ装置1は、算出部11a、分割部11b、生成部11c、出力部11dを含む。CPU11が制御プログラム1Pを実行することにより、コンパイラ装置1は以下のように動作する。
算出部11aは処理すべきデータ集合の要素数から、スレッド数よりも大きい前記データ集合の分割数を算出する。分割部11bは算出した分割数に、データ集合を分割する。生成部11cは分割したデータ集合の処理を行う複数の実行部、及び各実行部に最初に到達したスレッドが行うようにしてある命令を、各実行部の先頭に配してあるオブジェクトコードを生成する。出力部11dは生成したオブジェクトを出力する。
各実施例で記載されている技術的特徴(構成要件)はお互いに組合せ可能であり、組み合わせすることにより、新しい技術的特徴を形成することができる。
今回開示された実施の形態はすべての点で例示であって、制限的なものでは無いと考えられるべきである。本発明の範囲は、上記した意味では無く、特許請求の範囲によって示され、特許請求の範囲と均等の意味及び範囲内でのすべての変更が含まれることが意図される。
以上の実施の形態に関し、さらに以下の付記を開示する。
(付記1)
処理すべきデータ集合の要素数から、スレッド数よりも大きい前記データ集合の分割数を算出し、
算出した分割数に、前記データ集合を分割し、
分割したデータ集合それぞれの処理を行う複数の実行コードを含み、各実行コードの先頭に、該実行コードに最初に到達したスレッドが処理を行う命令を配してあるオブジェクトコードを生成する
コンパイラプログラム。
(付記2)
処理すべきデータ集合の要素数から算出した、スレッド数よりも大きい分割数で前記データ集合を分割した部分集合それぞれを処理する複数の実行コードを含み、各実行コードの先頭に、該実行コードに最初に到達したスレッドが処理を行う命令が配してあり、
前記スレッド数のスレッドで、前記複数の実行コードの処理を並列的にコンピュータに行わせる
コンピュータプログラム。
(付記3)
処理すべきデータ集合の要素数から、スレッド数よりも大きい前記データ集合の分割数を算出する算出部と、
算出した分割数に、前記データ集合を分割する分割部と、
分割したデータ集合の処理を行う複数の実行部、及び各実行部に最初に到達したスレッドが行う命令を、各実行部の先頭に配してあるオブジェクトコードを生成する生成部とを備える
コンパイラ装置。
(付記4)
前記分割したデータ集合の処理結果を格納する複数の第1格納コードを含み、各第1格納コードの先頭には、該第1格納コードに最初に到達したスレッドが処理を行う命令を配してあるオブジェクトコードを出力する
付記1に記載のコンパイラプログラム。
(付記5)
前記複数の第n格納コード(ただし、nは1以上の自然数)の処理結果を格納する第n+1格納コードを複数含み、
各第n+1格納コードの先頭には、該第n+1格納コードに最初に到達したスレッドが処理を行う命令を配してあるオブジェクトコードの出力を、前記第n格納コードの個数が所定値よりも小さくなるまで、再帰的に行う
付記4に記載のコンパイラプログラム。
1 コンパイラ装置
11 CPU
11a 算出部
11b 分割部
11c 生成部
11d 出力部
12 RAM
13 ROM
14 大容量記憶装置
15 入力部
16 出力部
17 通信部
18 読取り部
1a 可搬型記憶媒体
1b 半導体メモリ
1P 制御プログラム
2 並列処理装置
21 CPU
22 RAM
23 ROM
24 大容量記憶装置
25 入力部
26 出力部
27 通信部
28 読取り部
2a 可搬型記憶媒体
2b 半導体メモリ
2P 制御プログラム

Claims (3)

  1. 処理すべきデータ集合の要素数から、スレッド数よりも大きい前記データ集合の分割数を算出し、
    算出した分割数に、前記データ集合を分割し、
    分割したデータ集合それぞれの処理を行う複数の実行コードを含み、各実行コードの先頭に、該実行コードに最初に到達したスレッドが処理を行う命令を配してあるオブジェクトコードを生成する処理をコンピュータに行わせる
    コンパイラプログラム。
  2. 処理すべきデータ集合の要素数から算出した、スレッド数よりも大きい分割数で前記データ集合を分割した部分集合それぞれを処理する複数の実行コードを含み、各実行コードの先頭に、該実行コードに最初に到達したスレッドが処理を行う命令が配してあり、
    前記スレッド数のスレッドで、前記複数の実行コードの処理を並列的にコンピュータに行わせる
    コンピュータプログラム。
  3. 処理すべきデータ集合の要素数から、スレッド数よりも大きい前記データ集合の分割数を算出する算出部と、
    算出した分割数に、前記データ集合を分割する分割部と、
    分割したデータ集合の処理を行う複数の実行部、及び各実行部に最初に到達したスレッドが行う命令を、各実行部の先頭に配してあるオブジェクトコードを生成する生成部とを備える
    コンパイラ装置。
JP2015035777A 2015-02-25 2015-02-25 コンパイラプログラム、コンピュータプログラム及びコンパイラ装置 Active JP6443125B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2015035777A JP6443125B2 (ja) 2015-02-25 2015-02-25 コンパイラプログラム、コンピュータプログラム及びコンパイラ装置
US14/968,084 US9934036B2 (en) 2015-02-25 2015-12-14 Compiler method, parallel processing method, and compiler apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015035777A JP6443125B2 (ja) 2015-02-25 2015-02-25 コンパイラプログラム、コンピュータプログラム及びコンパイラ装置

Publications (2)

Publication Number Publication Date
JP2016157339A JP2016157339A (ja) 2016-09-01
JP6443125B2 true JP6443125B2 (ja) 2018-12-26

Family

ID=56689894

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015035777A Active JP6443125B2 (ja) 2015-02-25 2015-02-25 コンパイラプログラム、コンピュータプログラム及びコンパイラ装置

Country Status (2)

Country Link
US (1) US9934036B2 (ja)
JP (1) JP6443125B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10558464B2 (en) 2017-02-09 2020-02-11 International Business Machines Corporation Infinite processor thread balancing
CN113190466A (zh) * 2021-06-08 2021-07-30 科东(广州)软件科技有限公司 自动化测试方法、装置、设备及介质

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH03172958A (ja) * 1989-11-30 1991-07-26 Hitachi Ltd 同期処理方法および並列処理システムおよび並列処理方法および並列化プログラム生成装置
JPH0512033A (ja) 1991-07-03 1993-01-22 Hitachi Ltd 並列化コンパイル方式
JPH0561899A (ja) 1991-09-03 1993-03-12 Nec Software Ltd プログラムの自動並列化処理方式
JP2866241B2 (ja) * 1992-01-30 1999-03-08 株式会社東芝 コンピュータシステムおよびスケジューリング方法
US5724565A (en) * 1995-02-03 1998-03-03 International Business Machines Corporation Method and system for processing first and second sets of instructions by first and second types of processing systems
GB2321546B (en) * 1996-12-16 2001-03-28 Ibm Constructing a multiscalar program including a plurality of thread descriptors that each reference a next thread descriptor to be processed
JP3456443B2 (ja) * 1999-04-21 2003-10-14 日本電気株式会社 並列ソート装置及び該装置のプログラムを記録した記録媒体
JP3702813B2 (ja) * 2001-07-12 2005-10-05 日本電気株式会社 マルチスレッド実行方法及び並列プロセッサシステム
JP4556554B2 (ja) * 2004-08-25 2010-10-06 セイコーエプソン株式会社 画像処理を並列処理で実行する際の負荷の割り付け
KR101572879B1 (ko) * 2009-04-29 2015-12-01 삼성전자주식회사 병렬 응용 프로그램을 동적으로 병렬처리 하는 시스템 및 방법
JP5463076B2 (ja) * 2009-05-28 2014-04-09 パナソニック株式会社 マルチスレッドプロセッサ
JP5504879B2 (ja) * 2009-12-25 2014-05-28 富士通株式会社 マルチスレッド処理方法及びマルチスレッド処理装置
US9563424B2 (en) * 2012-08-17 2017-02-07 Google Inc. Native code instruction selection

Also Published As

Publication number Publication date
US9934036B2 (en) 2018-04-03
US20160246579A1 (en) 2016-08-25
JP2016157339A (ja) 2016-09-01

Similar Documents

Publication Publication Date Title
US20150067662A1 (en) Computer system and a method for generating an optimized program code
JP6245031B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP5834997B2 (ja) ベクトルプロセッサ、ベクトルプロセッサの処理方法
JP2016508640A (ja) ハードウェアポインタを使用したsimdコア内での分岐ブランチに対するソリューション
US20090106730A1 (en) Predictive cost based scheduling in a distributed software build
US8954946B2 (en) Static branch prediction method and code execution method for pipeline processor, and code compiling method for static branch prediction
TW201721410A (zh) 用於執行疊接操作的裝置和方法
US8786617B2 (en) Parallelization of random number generation processing by employing GPU
EP2951682B1 (en) Hardware and software solutions to divergent branches in a parallel pipeline
EP3106982A1 (en) Determination of branch convergence in a sequence of program instructions
KR20180137521A (ko) 벡터 연산들 수행시의 어드레스 충돌 관리 장치 및 방법
JPWO2012105593A1 (ja) データフローグラフ処理装置、データフローグラフ処理方法およびデータフローグラフ処理プログラム
JP2008052684A (ja) 分岐履歴長の表示器、分岐予測システム及び分岐予測方法
KR102704028B1 (ko) True/false 벡터 인덱스 레지스터
JP6443125B2 (ja) コンパイラプログラム、コンピュータプログラム及びコンパイラ装置
JP7225859B2 (ja) 情報処理装置、情報処理プログラム、及び情報処理方法
Hart First experiences porting a parallel application to a hybrid supercomputer with OpenMP4. 0 device constructs
Lobeiras et al. Designing efficient index-digit algorithms for CUDA GPU architectures
JP5278538B2 (ja) コンパイルシステム、コンパイル方法およびコンパイルプログラム
US20140052960A1 (en) Apparatus and method for generating vliw, and processor and method for processing vliw
US20110125805A1 (en) Grouping mechanism for multiple processor core execution
JP2013101563A (ja) プログラム変換装置、プログラム変換方法、および変換プログラム
US20120089823A1 (en) Processing apparatus, compiling apparatus, and dynamic conditional branch processing method
JP6911544B2 (ja) プログラム、情報処理装置及び情報処理方法
JP2019067117A (ja) コード生成装置、コード生成方法及びコード生成プログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20171215

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180717

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180828

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20181012

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20181112

R150 Certificate of patent or registration of utility model

Ref document number: 6443125

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150