JP6477216B2 - 演算装置、スレッド切替方法、及びマルチスレッドプログラム - Google Patents

演算装置、スレッド切替方法、及びマルチスレッドプログラム Download PDF

Info

Publication number
JP6477216B2
JP6477216B2 JP2015095939A JP2015095939A JP6477216B2 JP 6477216 B2 JP6477216 B2 JP 6477216B2 JP 2015095939 A JP2015095939 A JP 2015095939A JP 2015095939 A JP2015095939 A JP 2015095939A JP 6477216 B2 JP6477216 B2 JP 6477216B2
Authority
JP
Japan
Prior art keywords
thread
instruction
program
executed
function
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2015095939A
Other languages
English (en)
Other versions
JP2016212639A (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 JP2015095939A priority Critical patent/JP6477216B2/ja
Priority to US15/139,991 priority patent/US10387190B2/en
Publication of JP2016212639A publication Critical patent/JP2016212639A/ja
Application granted granted Critical
Publication of JP6477216B2 publication Critical patent/JP6477216B2/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/46Multiprogramming arrangements
    • 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/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
    • 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/461Saving or restoring of program or task context
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Debugging And Monitoring (AREA)

Description

開示の技術は、演算装置、スレッド切替方法、及びマルチスレッドプログラムに関する。
従来、複数のスレッドを切り替えながらプログラムを実行するマルチスレッディングに関する技術として、タイムアウトレジスタを有するマルチスレッド式プロセッサが提案されている。このマルチスレッド式プロセッサでは、アクティブ・スレッドの実行がプログラム可能な時間期間を超える時にスレッド切り替えが強制される。
特表2001−521216号公報 特表2001−521215号公報
マルチスレッディングにおいて、I/O処理などにより暇になるCPU資源を最大限活用するための手法であり、各スレッドあたりの処理が比較的少ない軽量スレッド(LWT:Light Weight Thread)を実行させる方法がある。LWTでは、ハードウェアで同時に実行可能なスレッド数よりも遥かに多いスレッドを生成し、実行されるスレッドを切り換えながら高多重に処理を進めるため、スレッドの切り替え頻度が高い。
従来技術のように、タイムアウト時に割り込みを発生させる手法は、スレッドの切り替えに時間がかかる。特に、スレッドの切り替え頻度が高いLWTでは、プログラムの実行時間全体に対して、スレッドの切り替え時間が重い負荷となる。
開示の技術は、一つの側面として、マルチスレッディングにおけるスレッドの切り替え時間を短縮することを目的とする。
開示の技術は、一つの態様として、マルチコアCPUが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理に関する。開示の技術は、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出する検出部を備える。また、開示の技術は、前記検出部により検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定する特定部を備える。さらに、開示の技術は、前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える書換部を備える。
一つの側面として、マルチスレッディングにおけるスレッドの切り替え時間を短縮することができる、という効果を有する。
マルチスレッディングにおけるスレッドの切り替えを説明するための図である。 割り込み処理を利用したスレッドの切り替えを説明するための図である。 第1実施形態に係るマルチスレッド処理装置の概略構成を示すブロック図である。 第1実施形態に係るマルチスレッド処理装置として機能するコンピュータの概略構成を示すブロック図である。 監視処理の一例を示すフローチャートである。 検出部での処理を説明するための図である。 特定部での処理を説明するための図である。 書換部での処理を説明するための図である。 スケジューラの呼び出しを説明するための図である。 切替処理の一例を示すフローチャートである。 ディスパッチ部での処理を説明するための図である。 第2実施形態に係るマルチスレッド処理装置の概略構成を示すブロック図である。 第2実施形態の変形例に係るマルチスレッド処理装置の概略構成を示すブロッ
以下、図面を参照して、開示の技術に関する実施形態の一例を詳細に説明する。
まず、実施形態の詳細を説明する前に、軽量スレッド(LWT:Light Weight Thread)によるプログラムの実行、及びLWTにおけるスレッド切り替えの問題点について説明する。
例えば、マルチコアCPUによりLWTを実行させる場合、LWTでは、コア数よりも遥かに多いスレッドを生成し、各コアで実行されるスレッドを切り替えながらプログラムを実行する。例えば、図1に示すように、あるコアでスレッドAが実行されており、スレッドB、スレッドC、・・・が実行待ちであるとする。スレッドAにおいて、I/O処理が発生するなどして、コアがメモリやディスクでの処理待ち状態となる場合がある。この場合、このコアを有効活用するために、そのコアにおけるスレッドAの実行を停止し、そのコアを実行待ちのスレッドのいずれか(図1の例では、スレッドB)に割り当てる。
ここで、例えば、スレッドAがあるコアを長時間占有して実行されている場合には、他の実行待ちのスレッドの実行が滞ってしまうため、強制的にスレッドを切り替える必要がある。このような場合のスレッドの切り替え方法としては、図2に示すように、タイマで設定された所定タイミングなどで割り込み信号を発生させ、強制的にスレッドを切り替える方法が考えられる。この方法では、例えば、以下の手順により、スレッドの切り替えが実現される。
1.割り込み信号を受信したコアが、割り込みハンドラを呼び出し
2.割り込みハンドラが、スレッドAのコンテキストをコンテキスト保存領域に保存
3.割り込みハンドラが、スケジューラを呼び出すためのシグナルを生成
4.割り込みハンドラが、生成したシグナルを送出して、スケジューラを呼び出し
5.スケジューラが、次に実行するスレッドを決定し(スレッドB)、ディスパッチャが、スレッドBのコンテキストをコンテキスト保存領域から読み出し
6.ディスパッチャが、読み出したコンテキストをコアに設定
これにより、対象のコアにおいて、スレッドBが実行される。すなわち、対象のコアにおいて実行されるスレッドが、スレッドAからスレッドBに切り替わる。
しかし、割り込み処理によるスレッドの切り替えは、上記のように手順が多く、時間がかかる。LWTは、スレッド切り替え頻度が高いため、スレッドの切り替えに多くの時間を要すると、LWTにより実行されるプログラム全体の性能が低下する。
そこで、以下の各実施形態では、コアを長時間占有して実行されているスレッドで今後実行される命令箇所を、スケジューラ呼出命令に書き換えることで、スレッド切り替えの手順を少なくし、スレッド切り替え時間の短縮を図る。以下、各実施形態について詳述する。以下の各実施形態では、マルチコアCPUを実装したコンピュータにおいて、LWTによるマルチスレッディングでアプリケーションプログラムを実行する場合に、開示の技術を適用した例について説明する。
<第1実施形態>
図3に示すように、第1実施形態に係るマルチスレッド処理装置10は、監視部20と、スケジューラ30とを含む。
スケジューラ30は、LWT用に最適化されたスケジューラであり、実行されるスレッドと同じプロセス内でメモリを切り替えることなく呼び出せるユーザレベルのスケジューラである。スケジューラ30は、コンテキスト保存部31と、実行スレッド決定部32と、ディスパッチ部33とを含む。
コンテキスト保存部31は、スケジューラ30を呼び出した対象のコアで実行されているスレッド(実行中スレッド51)のコンテキストを保存する。具体的には、コンテキスト保存部31は、対象のコアのレジスタに記憶されたデータをスタック領域に保存する。また、コンテキスト保存部31は、対象のコアのスタックポインタレジスタに記憶されたスタックポインタを専用の保存領域に保存する。
実行スレッド決定部32は、コンテキスト保存領域に保存された実行待ちのスレッドのコンテキスト52を参照して、次に実行するスレッドを決定する。具体的な決定方法は、実行されるアプリケーションプログラムによる。なお、コンテキスト保存領域とは、上記のスタック領域及びスタックポインタが保存された専用の保存領域である。
ディスパッチ部33は、実行スレッド決定部32で決定されたスレッドに対象のコアをディスパッチする。具体的には、ディスパッチ部33は、決定されたスレッドのコンテキストをコンテキスト保存領域から読み出し、対象のコアにセットする。より具体的には、ディスパッチ部33は、決定されたスレッドについて、専用の保存領域に記憶されたスタックポインタを読み出し、対象のコアのスタックポインタレジスタにセットする。また、ディスパッチ部33は、決定されたスレッドについてスタック領域に記憶されたデータを読み出して、対象のコアのレジスタにセットする。
また、ディスパッチ部33は、現在実行中のスレッドに対してコアがディスパッチされた時刻を記録するディスパッチ時刻テーブル41に、決定されたスレッドに対象のコアをディスパッチした時刻を記録する。ディスパッチ時刻テーブル41は、メモリ領域の所定の記憶領域(第3の記憶領域)に保存される。
監視部20は、アプリケーションプログラムを実行するコアとは別に、専用のコアで実行される機能部である。監視部20は、検出部21と、特定部22と、書換部23とを含む。なお、監視部20は、開示の技術の演算装置の一例である。
検出部21は、ディスパッチ時刻テーブル41を常時又は十分短い周期で繰り返し参照し、ディスパッチ時刻テーブル41に記録された時刻と現在時刻との差が、規定時間以上となるスレッドを、長時間コアを占有しているスレッドとして検出する。検出部21は、検出したスレッドを、実行待ちの他のスレッドへ切り替える対象となる切り替え対象スレッドとして、特定部22に通知する。
特定部22は、検出部21から通知された切り替え対象スレッドで実行中又は過去に実行された命令に基づいて、切り替え対象スレッドで今後実行される命令を推定し、推定した命令が保存されているメモリ領域のアドレスを特定する。
ここで、実行中のアプリケーションプログラムでは、アプリケーションプログラムに含まれる関数の呼び出し命令の実行前又は実行後に、実行中関数アドレス42を第1の記憶領域に保存する。実行中関数アドレス42とは、実行中のスレッドにおいて直近で呼び出された関数が保存されているメモリ領域のアドレスである。アプリケーションプログラムのコンパイル時に、実行中関数アドレス42を第1の記憶領域に保存するように設定することができる。また、アプリケーションプログラムのコンパイル時に、アプリケーションプログラムに含まれる各関数に含まれる分岐命令が保存されているメモリ領域のアドレスが取得される。取得された分岐命令のアドレスは、その分岐命令を含む関数のアドレスに対応付けて、分岐命令アドレステーブル43として、メモリ領域の第2の記憶領域に保存される。
そこで、特定部22は、第1の記憶領域に保存された実行中関数アドレス42を参照して、切り替え対象スレッドで呼び出された関数のアドレスを特定する。また、特定部22は、第2の記憶領域に保存された分岐命令アドレステーブル43を参照して、特定した関数に含まれる分岐命令のアドレスを特定する。特定部22は、特定した分岐命令のアドレスを、書換部23に通知する。
なお、切り替え対象スレッドで今後実行される命令として分岐命令を特定するのは、分岐命令により処理がループしていることにより、切り替え対象スレッドがコアを長時間占有する結果になっているとの考えに基づく。分岐命令により処理がループしている場合には、再びその分岐命令が実行される可能性が高いため、今後実行される命令として、分岐命令を推定するものである。ただし、特定した関数に含まれる命令であれば、切り替え対象スレッドで今後実行される可能性はあるため、分岐命令以外の命令を切り替え対象スレッドで今後実行される命令として特定してもよい。また、上記のように、処理のループを想定して切り替え対象スレッドで今後実行される命令を推定するため、分岐命令の中でもループエンドに限定して特定するようにしてもよい。
書換部23は、特定部22により特定された分岐命令のアドレスに基づいて、メモリ領域において特定された分岐命令が保存されている箇所を、スケジューラ30の呼び出し命令に書き換える。特定部22で複数の分岐命令のアドレスが特定されている場合には、書換部23は、特定された全ての分岐命令を書き換えてもよいし、特定された一部の分岐命令を書き換えてもよい。一部の分岐命令を書き換える場合は、例えば、特定された分岐命令のうち、実行順が後ろの方から順に所定個の分岐命令を書き換えることができる。実行順が前の方の分岐命令は、既に実行中のスレッドにおいて実行済みである可能性があり、実行順が後ろの方が、今後実行される分岐命令である可能性が高いからである。
マルチスレッド処理装置10は、例えば、図4に示すコンピュータ60で実現することができる。コンピュータ60は、複数のコア610、611、・・・を有するCPU61、一時記憶領域としてのメモリ62、及び不揮発性の記憶部63を備える。また、コンピュータ60は、表示装置及び入力装置等の入出力装置68が接続される入出力インターフェース(I/F)64を備える。また、コンピュータ60は、記録媒体69に対するデータの読み込みと書き込みとを制御するread/write(R/W)部65、及びインターネット等のネットワークに接続されるネットワークI/F66を備える。CPU61、メモリ62、記憶部63、入出力I/F64、R/W部65、及びネットワークI/F66は、バス67を介して互いに接続される。
記憶部63は、HDD(Hard Disk Drive)、SSD(solid state drive)、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部63には、コンピュータ60をマルチスレッド処理装置10として機能させるためのマルチスレッドプログラム70が記憶される。
マルチスレッドプログラム70は、CPU61のいずれかのコアを監視部20として機能させるための監視プログラム71を含む。また、マルチスレッドプログラム70は、CPU61のいずれかのコアをスケジューラ30として機能させるための切替プログラム72と、アプリケーションプログラム73とを含む。本実施形態では、監視部20として機能するコアをコア610、アプリケーションプログラムを実行し、かつスケジューラ30として機能するコアを611とする。
コア610は、監視プログラム71を記憶部63から読み出してメモリ62に展開し、監視プログラム71が有するプロセスを順次実行する。また、コア611は、アプリケーションプログラム73を記憶部63から読み出してメモリ62に展開し、アプリケーションプログラム73が有するプロセスを順次実行する。また、コア611は、切替プログラム72を記憶部63から読み出してメモリ62に展開し、アプリケーションプログラム73が有するプロセスを順次実行する。
監視プログラム71は、検出プロセス71Aと、特定プロセス71Bと、書換プロセス71Cとを有する。コア610は、検出プロセス71Aを実行することで、図3に示す検出部21として動作する。また、コア610は、特定プロセス71Bを実行することで、図3に示す特定部22として動作する。また、コア610は、書換プロセス71Cを実行することで、図3に示す書換部23として動作する。
切替プログラム72は、コンテキスト保存プロセス72Aと、実行スレッド決定プロセス72Bと、ディスパッチプロセス72Cとを有する。コア611は、コンテキスト保存プロセス72Aを実行することで、図3に示すコンテキスト保存部31として動作する。また、コア611は、実行スレッド決定プロセス72Bを実行することで、図3に示す実行スレッド決定部32として動作する。また、コア611は、ディスパッチプロセス72Cを実行することで、図3に示すディスパッチ部33として動作する。
また、上述した実行待ちスレッドのコンテキスト52を保存するコンテキスト保存領域がメモリ62に設けられる。また、ディスパッチ時刻テーブル41が保存される第3の記憶領域、実行中関数アドレス42が保存される第1の記憶領域、及び分岐命令アドレステーブル43が保存される第2の記憶領域もメモリ62に設けられる。
これにより、マルチスレッドプログラム70を実行したコンピュータ60が、マルチスレッド処理装置10として機能することになる。
なお、マルチスレッドプログラム70により実現される機能は、例えば半導体集積回路、より詳しくはASIC(Application Specific Integrated Circuit)等で実現することも可能である。
次に、第1実施形態に係るマルチスレッド処理装置10の作用について説明する。マルチスレッド処理装置10において、アプリケーションプログラム73の実行が開始されると、監視部20が図5に示す監視処理を実行する。なお、監視処理は、開示の技術のスレッド切替方法の一例である。
図5に示す監視処理のステップS11で、検出部21は、図6に示すように、第3の記憶領域623に記憶されたディスパッチ時刻テーブル41を常時又は十分短い周期で繰り返し参照する。なお、ディスパッチ時刻テーブル41には、後述する切替処理において、スケジューラ30のディスパッチ部33により、実行中のスレッドにコアがディスパッチされた時刻が保存されている。また、図6に示すディスパッチ時刻テーブル41では、「コア」、「スレッド」、及び「ディスパッチ時刻」の項目を含む例を示しているが、この例に限定されず、実行中のスレッドにコアがディスパッチされてからの時間を把握可能な形態であればよい。検出部21は、ディスパッチ時刻テーブル41に記録されたディスパッチ時刻と現在時刻との差、すなわち、各スレッドにコアがディスパッチされてからの時間を取得する。
次に、ステップS12で、検出部21が、コアを長時間占有しているスレッドが存在するか否かを判定する。上記ステップS11で取得した時間が予め定めた規定時間以上となるスレッドが存在する場合には、検出部21が、該当のスレッドを切り替え対象スレッドとして検出し、特定部22に通知して、処理はステップS13へ移行する。コアを長時間占有しているスレッドが存在しない場合には、処理はステップS11に戻る。
ステップS13では、特定部22が、図7に示すように、第1の記憶領域621に保存された実行中関数アドレス42を参照して、検出部21から通知された切り替え対象スレッドで呼び出された関数のアドレスを取得する。第1の記憶領域621には、アプリケーションプログラム73のコンパイル時に、実行中のスレッドにおいて直近で呼び出された関数のアドレスが保存されるよう設定されている。
次に、ステップS14で、特定部22が、第2の記憶領域622に保存された分岐命令アドレステーブル43において、上記ステップS13で取得した関数のアドレスに対応付けられている分岐命令のアドレスを全て取得する。特定部22は、取得した分岐命令のアドレスを、書換部23に通知する。
次に、ステップS15で、書換部23が、図8に示すように、特定部22から通知された分岐命令のアドレスに基づいて、メモリ領域において特定された分岐命令が保存されている箇所を、スケジューラ30の呼び出し命令に書き換える。そして、監視処理はステップS11に戻る。
切り替え対象スレッドにおいて、上記監視処理のステップS15で書き換えられたスケジューラ30の呼び出し命令が実行されると、図9に示すように、実行中のスレッドから、直接スケジューラ30が呼び出される。そして、スケジューラ30が、図10に示す切替処理を実行する。
図10に示す切替処理のステップS21で、コンテキスト保存部31が、切り替え対象スレッドを実行している対象のコアのレジスタに記憶されたデータをスタック領域に保存する。次に、ステップS22で、コンテキスト保存部31が、対象のコアのスタックポインタレジスタに記憶されたスタックポインタを専用の保存領域に保存する。
次に、ステップS23で、実行スレッド決定部32が、コンテキスト保存領域に保存された実行待ちのスレッドのコンテキスト52を参照して、次に実行するスレッドを決定する。
次に、ステップS24で、ディスパッチ部33が、実行スレッド決定部32で決定されたスレッドについて、専用の保存領域に記憶されたスタックポインタを読み出し、対象のコアのスタックポインタレジスタにセットする。次に、ステップS25で、ディスパッチ部33が、決定されたスレッドについてスタック領域に記憶されたデータを読み出して、対象のコアのレジスタにセットする。
次に、ステップS26で、ディスパッチ部33が、図11に示すように、第3の記憶領域623に記憶されたディスパッチ時刻テーブル41に、決定されたスレッドに対象のコアをディスパッチした時刻として、現在時刻を記録する。そして、切替処理は終了する。
以上説明したように、第1実施形態に係るマルチスレッド処理装置10によれば、長時間コアを占有しているスレッドで今後実行される命令箇所を、スケジューラ呼び出し命令に書き換える。そして、書き換えられた命令が実行されることにより、切り替え対象のスレッドから直接スケジューラを呼び出すことができる。これにより、割り込み処理によりスレッドの切り替えを実行する場合に比べ、スレッド切り替えのための処理が少ないため、マルチスレッディングにおけるスレッド切り替え時間を短縮することができる。
<第2実施形態>
次に、第2実施形態について説明する。第2実施形態では、切り替え対象スレッドで今後実行される命令の特定方法が、第1実施形態と異なる。なお、第2実施形態に係るマルチスレッド処理装置について、第1実施形態に係るマルチスレッド処理装置10と同様の部分については、同一符号を付して、詳細な説明を省略する。
図12に示すように、第2実施形態に係るマルチスレッド処理装置210は、監視部220と、スケジューラ30とを含む。監視部220は、検出部21と、特定部222と、書換部23とを含む。
ここで、第2実施形態におけるマルチスレッド処理装置210では、マルチコアCPUが有する各コアは、図12に示すように、ハードウェア構成として、LBR(Last Branch Record)用レジスタ91と、PEBS(Precise Event Based Sampling)機能部92と、PEBS用カウンタ93とを含む。LBR用レジスタ91には、該当のコアで実行中のスレッドで直近に実行された分岐命令のアドレスが、LBR機能により取得され、保存される。PEBS機能部92は、ハードウェア領域に記憶された情報を取り出し、ソフトウェア領域で参照可能にする機能部である。PEBS用カウンタ93は、PEBS機能部92で取り出すデータを指定する情報(ここでは、LBR用レジスタ91を指定する情報)が保存される。このLBR機能とPEBS機能との連携により、該当のコアで実行中のスレッドで直近に実行された分岐命令のアドレスが定期的に取得され、LBR情報44として、メモリ領域の所定領域(第4の記憶領域)に保存される。
そこで、特定部222は、第4の記憶領域に保存されたLBR情報44を参照して、LBR情報が示すアドレスを、切り替え対象スレッドで今後実行される命令のアドレスとして特定する。
マルチスレッド処理装置210は、例えば、図4に示すコンピュータ260で実現することができる。コンピュータ260は、複数のコア2610、2611、・・・を有するCPU261、メモリ62、及び記憶部63を備える。また、コンピュータ260は、入出力装置68が接続される入出力I/F64、記録媒体69に対するデータの読み込みと書き込みとを制御するR/W部65、及びネットワークI/F66を備える。CPU261、メモリ62、記憶部63、入出力I/F64、R/W部65、及びネットワークI/F66は、バス67を介して互いに接続される。なお、コア2610、2611、・・・の各々は、上述したように、LBR用レジスタ91と、PEBS機能部92と、PEBS用カウンタ93とを含む。本実施形態では、監視部220として機能するコアをコア2610、アプリケーションプログラムを実行し、かつスケジューラ30として機能するコアを2611とする。
記憶部63には、コンピュータ260をマルチスレッド処理装置210として機能させるためのマルチスレッドプログラム270が記憶される。マルチスレッドプログラム270は、監視プログラム271と、切替プログラム72と、アプリケーションプログラム73とを含む。監視プログラム271は、検出プロセス71Aと、特定プロセス271Bと、書換プロセス71Cとを有する。コア2610は、特定プロセス271Bを実行することで、図12に示す特定部222として動作する。その他のプロセスについては、第1実施形態におけるマルチスレッドプログラム70と同様である。
また、上述したLBR情報44が保存される第4の記憶領域がメモリ62に設けられる。これにより、マルチスレッドプログラム270を実行したコンピュータ260が、マルチスレッド処理装置210として機能することになる。
なお、マルチスレッドプログラム270により実現される機能は、例えば半導体集積回路、より詳しくはASIC等で実現することも可能である。
第2実施形態に係るマルチスレッド処理装置210の作用は、切り替え対象スレッドで今後実行される命令の特定方法が第1実施形態と異なるだけである。具体的には、第2実施形態では、第1実施形態における監視処理(図5)のステップS13及びS14において、特定部222が、第4の記憶領域に保存されたLBR情報44を参照して、LBR情報が示すアドレスを、切り替え対象スレッドで今後実行される命令のアドレスとして特定する。
以上説明したように、第2実施形態に係るマルチスレッド処理装置210では、ハードウェア構成が有する既存の機能を利用して、切り替え対象スレッドで今後実行される命令を特定することで、第1実施形態と同様の効果を得られる。
第2実施形態の変形例として、図13に、ハードウェア構成が有する機能を利用した他の例を示す。
図13に示すマルチスレッド処理装置210Aの監視部220Aは、検出部21と、特定部222Aと、書換部23とを含む。
また、スレッドを実行するコア2661Aは、ハードウェア構成として、LBR用レジスタ91を含む。また、監視部220Aとして機能するコア2660Aは、ハードウェア構成として、他のコアが有するレジスタに保存されたデータを参照する参照部95を含む。参照部95は、本変形例では、スレッドを実行中のコア2661A内のLBR用レジスタ91を参照する。
特定部222Aは、検出部21から切り替え対象スレッドを通知されると、参照部95を機能させ、切り替え対象スレッドを実行しているコア2661A内のLBR用レジスタ91を参照し、LBR情報44を取得する。他の処理については、第2実施形態と同様である。
この変形例によれば、切り替え対象スレッドを実行しているコア2661A内のLBR用レジスタ91を直接参照して、今後実行される命令を特定することができるため、LBR情報44を保存するための記憶領域をメモリ領域に確保する必要がない。
なお、上記では、マルチスレッドプログラム70、270が記憶部63に予め記憶(インストール)されている態様を説明したが、これに限定されない。開示の技術に係るプログラムは、CD−ROM、DVD−ROM、USBメモリ等の記録媒体に記録された形態で提供することも可能である。
以上の各実施形態に関し、更に以下の付記を開示する。
(付記1)
マルチコアCPUが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出する検出部と、
前記検出部により検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定する特定部と、
前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える書換部と、
を含む演算装置。
(付記2)
前記特定部は、前記切り替え対象のスレッドで呼び出された関数に含まれる命令を、前記今後実行される命令として推定する付記1記載の演算装置。
(付記3)
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように設定された第1の記憶領域と、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報が記憶された第2の記憶領域と、をさらに含み、
前記特定部は、前記第1の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定すると共に、前記第2の記憶領域を参照して、特定した前記関数に含まれる命令の位置情報を特定する
付記2記載の演算装置。
(付記4)
前記第2の記憶領域には、前記各関数に含まれる命令のうち、分岐命令の位置情報が記憶される付記3記載の演算装置。
(付記5)
前記特定部は、前記切り替え対象のスレッドで直近に実行された分岐命令の位置情報であって、前記切り替え対象のスレッドに割り当てられているコアで取得された分岐命令の位置情報を、前記今後実行されることが推定される命令の位置情報として特定する付記1記載の演算装置。
(付記6)
前記特定部は、前記切り替え対象のスレッドに割り当てられているコアにおいて、Last Branch Record、及びPrecise Event Based Sampling機能を利用して取得された分岐命令の位置情報が記憶された第4の記憶領域を参照して、前記今後実行されることが推定される命令の位置情報を特定する付記5記載の演算装置。
(付記7)
前記検出部は、前記スレッドの各々の実行状態として、該スレッドがコアを占有している時間を取得し、前記コアを占有している時間が予め定めた閾値以上となるスレッドを、前記切り替え対象となるスレッドとして検出する付記1〜付記6のいずれか1項記載の演算装置。
(付記8)
実行されているスレッドの各々に対してコアが割り当てられた時刻が記憶された第3の記憶領域をさらに含み、
前記検出部は、前記第3の記憶領域に記憶された時刻を参照して、前記スレッドがコアを占有している時間を取得する
付記7記載の演算装置。
(付記9)
前記書換部は、前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるためのスケジューラを呼び出す命令に書き換える付記1〜付記8のいずれか1項記載の演算装置。
(付記10)
付記1〜付記9のいずれか1項記載の演算装置と、
前記書換部により書き換えられた命令により呼び出される前記スケジューラと、
を含むマルチスレッド処理装置。
(付記11)
前記スケジューラは、実行されているスレッドの各々に対してコアが割り当てられた時刻を、前記第3の記憶領域に記録する記録部を含む付記10記載のマルチスレッド処理装置。
(付記12)
マルチコアCPUが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定し、
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
ことを含む処理を演算装置に実行させるスレッド切替方法。
(付記13)
前記切り替え対象のスレッドで呼び出された関数に含まれる命令を、前記今後実行される命令として推定する付記12記載のスレッド切替方法。
(付記14)
前記今後実行されることが推定される命令の位置情報を特定する際に、
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように設定された第1の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定し、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報が記憶された第2の記憶領域を参照して、特定した前記関数に含まれる命令の位置情報を特定する
付記13記載のスレッド切替方法。
(付記15)
前記第2の記憶領域には、前記各関数に含まれる命令のうち、分岐命令の位置情報が記憶される付記14記載のスレッド切替方法。
(付記16)
前記切り替え対象のスレッドで直近に実行された分岐命令の位置情報であって、前記切り替え対象のスレッドに割り当てられているコアで取得された分岐命令の位置情報を、前記今後実行されることが推定される命令の位置情報として特定する付記12記載のスレッド切替方法。
(付記17)
前記今後実行されることが推定される命令の位置情報を特定する際、前記切り替え対象のスレッドに割り当てられているコアにおいて、Last Branch Record、及びPrecise Event Based Sampling機能を利用して取得された分岐命令の位置情報が記憶された第4の記憶領域を参照して、前記今後実行されることが推定される命令の位置情報を特定する付記16記載のスレッド切替方法。
(付記18)
前記スレッドの各々の実行状態として、該スレッドがコアを占有している時間を取得し、前記コアを占有している時間が予め定めた閾値以上となるスレッドを、前記切り替え対象となるスレッドとして検出する付記12〜付記17のいずれか1項記載のスレッド切替方法。
(付記19)
前記切り替え対象となるスレッドを検出する際、実行されているスレッドの各々に対してコアが割り当てられた時刻が記憶された第3の記憶領域に記憶された時刻を参照して、前記スレッドがコアを占有している時間を取得する付記18記載のスレッド切替方法。
(付記20)
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるためのスケジューラを呼び出す命令に書き換える付記12〜付記19のいずれか1項記載のスレッド切替方法。
(付記21)
マルチコアCPUが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定し、
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
ことを含む処理を演算装置に実行させるためのマルチスレッドプログラム。
(付記22)
前記切り替え対象のスレッドで呼び出された関数に含まれる命令を、前記今後実行される命令として推定する付記21記載のマルチスレッドプログラム。
(付記23)
前記今後実行されることが推定される命令の位置情報を特定する際に、
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように設定された第1の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定し、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報が記憶された第2の記憶領域を参照して、特定した前記関数に含まれる命令の位置情報を特定する
付記22記載のマルチスレッドプログラム。
(付記24)
前記第2の記憶領域には、前記各関数に含まれる命令のうち、分岐命令の位置情報が記憶される付記23記載のマルチスレッドプログラム。
(付記25)
前記切り替え対象のスレッドで直近に実行された分岐命令の位置情報であって、前記切り替え対象のスレッドに割り当てられているコアで取得された分岐命令の位置情報を、前記今後実行されることが推定される命令の位置情報として特定する付記21記載のマルチスレッドプログラム。
(付記26)
前記今後実行されることが推定される命令の位置情報を特定する際、前記切り替え対象のスレッドに割り当てられているコアにおいて、Last Branch Record、及びPrecise Event Based Sampling機能を利用して取得された分岐命令の位置情報が記憶された第4の記憶領域を参照して、前記今後実行されることが推定される命令の位置情報を特定する付記25記載のマルチスレッドプログラム。
(付記27)
前記スレッドの各々の実行状態として、該スレッドがコアを占有している時間を取得し、前記コアを占有している時間が予め定めた閾値以上となるスレッドを、前記切り替え対象となるスレッドとして検出する付記21〜付記26のいずれか1項記載のマルチスレッドプログラム。
(付記28)
前記切り替え対象となるスレッドを検出する際、実行されているスレッドの各々に対してコアが割り当てられた時刻が記憶された第3の記憶領域に記憶された時刻を参照して、前記スレッドがコアを占有している時間を取得する付記27記載のマルチスレッドプログラム。
(付記29)
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるためのスケジューラを呼び出す命令に書き換える付記21〜付記28のいずれか1項記載のマルチスレッドプログラム。
(付記30)
マルチコアCPUが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定し、
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
ことを含む処理を演算装置に実行させるためのマルチスレッドプログラムを記憶した記憶媒体。
10、210、210A マルチスレッド処理装置
20、220、220A 監視部
21 検出部
22、222、222A 特定部
23 書換部
30 スケジューラ
31 コンテキスト保存部
32 実行スレッド決定部
33 ディスパッチ部
41 ディスパッチ時刻テーブル
42 実行中関数アドレス
43 分岐命令アドレステーブル
44 LBR情報
51 実行中スレッド
52 実行待ちスレッドのコンテキスト
60、260 コンピュータ
61、261 CPU
610、611、2660、2661、2660A、2661A コア
62 メモリ
63 記憶部
70、270 マルチスレッドプログラム
71、271 監視プログラム
72 切替プログラム
73 アプリケーションプログラム
91 LBR用レジスタ
92 PEBS機能部
93 PEBS用カウンタ
95 参照部
621 第1の記憶領域
622 第2の記憶領域
623 第3の記憶領域

Claims (7)

  1. マルチコアCPUが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出する検出部と、
    前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように設定された第1の記憶領域と、
    前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報が記憶された第2の記憶領域と、
    前記検出部により検出された切り替え対象となるスレッドで呼び出された関数に含まれる命令を、該切り替え対象となるスレッドで今後実行されることが推定される命令として推定し、前記第1の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定すると共に、前記第2の記憶領域を参照して、特定した前記関数に含まれる前記命令の位置情報を特定する、特定部と、
    前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える書換部と、
    を含む演算装置。
  2. 前記第2の記憶領域には、前記各関数に含まれる命令のうち、分岐命令の位置情報が記憶される請求項記載の演算装置。
  3. 前記検出部は、前記スレッドの各々の実行状態として、該スレッドがコアを占有している時間を取得し、前記コアを占有している時間が予め定めた閾値以上となるスレッドを、前記切り替え対象となるスレッドとして検出する請求項1または請求項記載の演算装置。
  4. 実行されているスレッドの各々に対してコアが割り当てられた時刻が記憶された第3の記憶領域をさらに含み、
    前記検出部は、前記第3の記憶領域に記憶された時刻を参照して、前記スレッドがコアを占有している時間を取得する
    請求項記載の演算装置。
  5. 前記書換部は、前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるためのスケジューラを呼び出す命令に書き換える請求項1〜請求項のいずれか1項記載の演算装置。
  6. マルチコアCPUが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
    前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように第1の記憶領域を設定し、
    前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報を第2の記憶領域に記憶し、
    検出された切り替え対象となるスレッドで呼び出された関数に含まれる命令を、該切り替え対象となるスレッドで今後実行されることが推定される命令として推定し、前記第1の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定すると共に、前記第2の記憶領域を参照して、特定した前記関数に含まれる前記命令の位置情報を特定し、
    特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
    ことを含む処理を演算装置に実行させるスレッド切替方法。
  7. マルチコアCPUが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
    前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように第1の記憶領域を設定し、
    前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報を第2の記憶領域に記憶し、
    検出された切り替え対象となるスレッドで呼び出された関数に含まれる命令を、該切り替え対象となるスレッドで今後実行されることが推定される命令として推定し、前記第1の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定すると共に、前記第2の記憶領域を参照して、特定した前記関数に含まれる前記命令の位置情報を特定し、
    特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
    ことを含む処理を演算装置に実行させるためのマルチスレッドプログラム。
JP2015095939A 2015-05-08 2015-05-08 演算装置、スレッド切替方法、及びマルチスレッドプログラム Active JP6477216B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2015095939A JP6477216B2 (ja) 2015-05-08 2015-05-08 演算装置、スレッド切替方法、及びマルチスレッドプログラム
US15/139,991 US10387190B2 (en) 2015-05-08 2016-04-27 System and method of executing a plurality of threads using thread switching on execution time-out using instruction re-write

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015095939A JP6477216B2 (ja) 2015-05-08 2015-05-08 演算装置、スレッド切替方法、及びマルチスレッドプログラム

Publications (2)

Publication Number Publication Date
JP2016212639A JP2016212639A (ja) 2016-12-15
JP6477216B2 true JP6477216B2 (ja) 2019-03-06

Family

ID=57223319

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015095939A Active JP6477216B2 (ja) 2015-05-08 2015-05-08 演算装置、スレッド切替方法、及びマルチスレッドプログラム

Country Status (2)

Country Link
US (1) US10387190B2 (ja)
JP (1) JP6477216B2 (ja)

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6567839B1 (en) 1997-10-23 2003-05-20 International Business Machines Corporation Thread switch control in a multithreaded processor system
US6697935B1 (en) 1997-10-23 2004-02-24 International Business Machines Corporation Method and apparatus for selecting thread switch events in a multithreaded processor
US6535905B1 (en) * 1999-04-29 2003-03-18 Intel Corporation Method and apparatus for thread switching within a multithreaded processor
US6662297B1 (en) * 1999-12-30 2003-12-09 Intel Corporation Allocation of processor bandwidth by inserting interrupt servicing instructions to intervene main program in instruction queue mechanism
US7200846B2 (en) * 2002-08-05 2007-04-03 Sun Microsystems, Inc. System and method for maintaining data synchronization
US7496921B2 (en) * 2003-08-29 2009-02-24 Intel Corporation Processing block with integrated light weight multi-threading support
US7631307B2 (en) * 2003-12-05 2009-12-08 Intel Corporation User-programmable low-overhead multithreading
JP4287799B2 (ja) * 2004-07-29 2009-07-01 富士通株式会社 プロセッサシステムおよびスレッド切り替え制御方法
JP2006172229A (ja) * 2004-12-16 2006-06-29 Nec Corp タスクの動作制御方法、タスクの動作制御システムおよびプログラム
US7581085B1 (en) * 2005-09-08 2009-08-25 Parallels Software International, Inc. Fast stub and frame technology for virtual machine optimization
US7577826B2 (en) * 2006-01-30 2009-08-18 Sony Computer Entertainment Inc. Stall prediction thread management
US7941646B2 (en) * 2007-12-31 2011-05-10 Freescale Semicondoctor, Inc. Completion continue on thread switch based on instruction progress metric mechanism for a microprocessor

Also Published As

Publication number Publication date
JP2016212639A (ja) 2016-12-15
US20160328232A1 (en) 2016-11-10
US10387190B2 (en) 2019-08-20

Similar Documents

Publication Publication Date Title
JP3871458B2 (ja) コンピュータ・システム
US7992042B2 (en) Debug support device, and program for directing computer to perform debugging method
US9336055B2 (en) Apparatus and method for predicting processing performance
JP5548037B2 (ja) 命令発行制御装置及び方法
TWI498820B (zh) 具有用於分支錯誤預測之第二跳躍執行單元的處理器
JP2017037370A (ja) 計算機、プロセス制御方法およびプロセス制御プログラム
JP2008522277A (ja) 優先度の付けられたタスク間の効率的な切り換え
JP4170364B2 (ja) プロセッサ
JP4992740B2 (ja) マルチプロセッサシステム、障害検出方法および障害検出プログラム
JP5195408B2 (ja) マルチコアシステム
JP4253796B2 (ja) コンピュータ及び制御方法
JP6477216B2 (ja) 演算装置、スレッド切替方法、及びマルチスレッドプログラム
JP2009175960A (ja) 仮想マルチプロセッサシステム
US7603673B2 (en) Method and system for reducing context switch times
JP6645348B2 (ja) 情報処理装置、情報処理プログラム、及び情報処理方法
JP2005215816A (ja) ハードウェアモニタを用いた性能プロファイリング方法
JP5376042B2 (ja) マルチコアプロセッサシステム、スレッド切り替え制御方法、およびスレッド切り替え制御プログラム
JP2008204011A (ja) マルチスレッドシステム、スレッド動作異常検知方法
US20090217014A1 (en) Processor, memory device, processing device, and method for processing instruction
JP2010044699A (ja) 情報処理装置
JP4878050B2 (ja) コンピュータ及び制御方法
JP2009223841A (ja) 命令ログ取得プログラム及び仮想計算機システム
JP7131005B2 (ja) 情報処理装置、情報処理方法、及び情報処理プログラム
JP5582241B2 (ja) マルチコアプロセッサシステム、マルチコアプロセッサシステムの制御方法、およびマルチコアプロセッサシステムの制御プログラム
JP2009251681A (ja) スタック領域の拡張方法及びプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180206

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20181024

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20181106

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20181227

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190121

R150 Certificate of patent or registration of utility model

Ref document number: 6477216

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150