[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

JP5293609B2 - マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム - Google Patents

マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム Download PDF

Info

Publication number
JP5293609B2
JP5293609B2 JP2009539132A JP2009539132A JP5293609B2 JP 5293609 B2 JP5293609 B2 JP 5293609B2 JP 2009539132 A JP2009539132 A JP 2009539132A JP 2009539132 A JP2009539132 A JP 2009539132A JP 5293609 B2 JP5293609 B2 JP 5293609B2
Authority
JP
Japan
Prior art keywords
task
cache
data
processor
storage device
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.)
Expired - Fee Related
Application number
JP2009539132A
Other languages
English (en)
Other versions
JPWO2009057762A1 (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.)
NEC Corp
Original Assignee
NEC Corp
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 NEC Corp filed Critical NEC Corp
Priority to JP2009539132A priority Critical patent/JP5293609B2/ja
Publication of JPWO2009057762A1 publication Critical patent/JPWO2009057762A1/ja
Application granted granted Critical
Publication of JP5293609B2 publication Critical patent/JP5293609B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0806Multiuser, multiprocessor or multiprocessing cache systems
    • G06F12/0842Multiuser, multiprocessor or multiprocessing cache systems for multiprocessing or multitasking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0806Multiuser, multiprocessor or multiprocessing cache systems
    • G06F12/0815Cache consistency protocols
    • G06F12/0837Cache consistency protocols with software control, e.g. non-cacheable data
    • 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/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Description

[関連出願の記載]
本発明は、日本国特許出願:特願2007−285299号(2007年11月 1日出願)の優先権主張に基づくものであり、同出願の全記載内容は引用をもって本書に組み込み記載されているものとする。
本発明は、マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラムに関する。
マルチプロセッサにおいて、各プロセッサがキャッシュを有する場合には、キャッシュの一貫性(キャッシュコヒーレンス)を維持する機構が必要である。これまでに、キャッシュの一貫性を維持するためのさまざまな機構(キャッシュ同期機構)が考えられている(非特許文献1)。
キャッシュ同期機構の一つとしてバリア同期方式がある。バリア同期方式においては、複雑なハードウェアが必要とされない。特許文献1において、バリア同期方式の具体例が開示されている。特許文献1に開示されたバリア同期方式においては、プロセッサのプログラムカウンタが同期ポイントと呼ばれる位置に到達した時に、その時点で変更されているキャッシュブロックを全て主記憶へ書き戻す。
特許文献2において開示されたバリア同期方式は、特許文献1のバリア同期方式を改良したものである。特許文献2のバリア同期方式においては、キャッシュブロックに対して共有データか否かという情報が付加され、この情報を利用することによって、同期ポイントにおいて主記憶へ書き戻されるキャッシュブロックの数を減らすことができる。
特開平09−62576号公報 特開平09−62580号公報 特開2001−175619号公報 特開2000−285084号公報 Per Stenstroem、"A Survey of Cache Coherence Schemes for Multiprocessors" IEEE Computer、(米国)、1990年、Vol.23、No.6、p.12−24
以上の特許文献1から4及び非特許文献1の全開示内容は、本書に引用をもって繰り込み記載されているものとする。以下に本発明による関連技術の分析を与える。
以下の分析は、本発明者によってなされたものである。
特許文献1及び特許文献2のバリア同期方式は、以下の問題を抱えている。
第1の問題は、同期ポイントを適切に設定するのはプログラマであるという点である。第2の問題は、どのキャッシュブロックを主記憶へ書き戻すかを判定するために、キャッシュブロックの全てをスキャンする必要があるという点である。これらのいずれの問題も、一般的なバリア同期方式において共通に現れる問題である。
第1の問題によって、プログラムの開発が困難となる。プログラマが同期ポイントを適切に設定すれば、不必要な同期処理を排除することができる。しかし、同期ポイントが適切に設定されていない場合は、プログラムが誤動作してしまう。同期ポイントを適切に設定するには、データの共有方法並びにデータを処理する順序及びタイミングをプログラマが十分に把握している必要がある。データ処理のタイミングを正しく理解するのは特に面倒であるため、同期ポイントの適切な設定はプログラマにとって煩雑な作業となる。
第2の問題によって、バリア同期に要する時間が増大する。例えば、ブロックサイズを32バイトとすると、容量8Kバイトのキャッシュには256個のキャッシュブロックが存在する。一つのキャッシュブロックのスキャンに1サイクルかかる場合、全てのキャッシュブロックをスキャンするのに256サイクルを要する。
そこで、プログラマが同期ポイントを明示的に設定することなく複数のキャッシュの内容を同期させることができ、全キャッシュブロックをスキャンすることなくキャッシュの内容を同期させることができる、キャッシュの同期制御方法を提供することが課題となる。
本発明の第1の視点に係るキャッシュ同期制御方法は、キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御方法であって、タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除する第1の工程と、前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除する第2の工程と、を含む。
第1の展開形態のキャッシュ同期制御方法は、前記第1の工程において、前記タスクを管理するプロセッサはそれ以外のプロセッサに自己のキャッシュから前記入力データに相当するデータを削除するように通知し、前記第2の工程において、前記タスクを実行したプロセッサはそれ以外のプロセッサに自己のキャッシュから前記出力データに相当するデータを削除するように通知することが好ましい。
本発明の第2の視点に係るキャッシュ同期制御方法は、複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるマルチプロセッサにおいて、プログラムをタスクと呼ばれる複数の小プログラムに分割し、タスクへ他タスクから与えられたデータを入力データとし、タスクが他タスクへ受け渡すデータを出力データとし、前記タスクを前記マルチプロセッサにおいて実行する場合に前記キャッシュの同期を制御する方法であって、タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データをキャッシュから記憶装置に書き戻し、タスクの入力データの古いコピーを他のプロセッサのキャッシュから削除する第1の工程と、タスクの実行後に、タスクの出力データをキャッシュから記憶装置に書き戻し、タスクの出力データの古いコピーを他のプロセッサのキャッシュから削除する第2の工程と、を含む。
本発明の一展開形態においてキャッシュ同期制御方法は、前記第1の工程において、どの入力データを記憶装置に書き戻すべきかという情報が与えられており、その情報において指定された入力データのみをキャッシュから記憶装置に書き戻すことが好ましい。
本発明の第3の視点に係るマルチプロセッサは、キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備え、タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除し、前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除するように構成される。
第3の展開形態のマルチプロセッサにおいて、前記複数のプロセッサはマスタプロセッサとスレーブプロセッサとを含み、前記スレーブプロセッサは前記タスクを実行し、前記マスタプロセッサは前記タスクを前記スレーブプロセッサに割り当てることが好ましい。
第4の展開形態のマルチプロセッサは、前記複数のプロセッサ及び前記記憶装置が結合されたバスを備えることが好ましい。
本発明の第4の視点に係るマルチプロセッサは、複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるとともに、プログラムをタスクと呼ばれる複数の小プログラムに分割し、各タスクを前記プロセッサのいずれかにおいて実行するように構成されたマルチプロセッサであって、前記プロセッサはデータ書き戻し部とデータ削除部とを備え、前記データ書き戻し部は各タスクの実行前にそのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻し、さらに、各タスクの実行後にそのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻すように構成されるとともに、前記データ削除部は各タスクの実行前に前記データ書き戻し部によって記憶装置に書き戻された入力データの古いコピーを保持するキャッシュからその古いコピーを削除し、さらに、各タスクの実行後に前記データ書き戻し部によって記憶装置に書き戻された出力データの古いコピーを保持するキャッシュからその古いコピーを削除するように構成される。
本発明の第5の視点に係るマルチプロセッサは、プログラムをタスクと呼ばれる複数の小プログラムに分割し、タスクへ他タスクから与えられたデータを入力データとし、タスクが他タスクへ受け渡すデータを出力データとしたときに、タスクの入力データと出力データとにもとづいてタスクの実行順序を制御するように構成されたマスタプロセッサと、タスクを実行するように構成された1個以上のスレーブプロセッサと、タスクの入力データ及び出力データを記録するように構成された記憶装置と、前記両プロセッサと記憶装置とを接続するように構成された結合網と、を備えたマルチプロセッサであって、前記両プロセッサはキャッシュとデータ書き戻し部とデータ削除部とを備え、前記データ書き戻し部は各タスクの実行前にそのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻し、さらに、各タスクの実行後にそのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻すように構成されるとともに、前記データ削除部は各タスクの実行前に前記データ書き戻し部によって記憶装置に書き戻された入力データの古いコピーを保持するキャッシュからその古いコピーを削除し、さらに、各タスクの実行後に前記データ書き戻し部によって記憶装置に書き戻された出力データの古いコピーを保持するキャッシュからその古いコピーを削除するように構成される。
本発明の第6の視点に係るキャッシュ同期制御プログラムは、キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御プログラムであって、タスクの実行前に、該タスクを管理するプロセッサに対して該タスクの入力データを前記記憶装置に書き戻す処理を実行させるとともに、それ以外のプロセッサに対して自己のキャッシュから該入力データに相当するデータを削除する処理を実行させ、前記タスクの実行後に、前記タスクを実行したプロセッサに対して前記タスクの出力データを前記記憶装置に書き戻す処理をさせるとともに、それ以外のプロセッサに対して自己のキャッシュから該出力データに相当するデータを削除する処理を実行させる。
本発明の第7の視点に係るキャッシュ同期制御プログラムは、複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるマルチプロセッサにおいて、プログラムをタスクと呼ばれる複数の小プログラムに分割し、各タスクを前記プロセッサのいずれかにおいて実行する場合に前記キャッシュの同期制御を前記プロセッサに実行させるキャッシュ同期制御プログラムであって、各タスクの実行前に、そのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻す処理と、その入力データの古いコピーを保持するキャッシュからその古いコピーを削除する処理と、を前記プロセッサに実行させるとともに、各タスクの実行後に、そのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻す処理と、その出力データの古いコピーを保持するキャッシュからその古いコピーを削除する処理と、を前記プロセッサに実行させる。
本発明に係るキャッシュ同期制御方法によって、プログラマが同期ポイントを明示的に設定することなく複数のキャッシュの内容を同期させることができる。また、本発明に係るキャッシュ同期制御方法によって、全キャッシュブロックをスキャンすることなくキャッシュの内容を同期させることができる。
タスクの概念図である。 タスクのデータフローグラフの一例を表す図である。 本発明の実施形態に係るマルチプロセッサの構成図である。 本発明の実施形態に係るキャッシュ同期制御方法のフローチャートである。 本発明の実施形態に係るキャッシュ同期制御方法におけるタスク生成のフローチャートである。 本発明の実施形態に係るキャッシュ同期制御方法におけるタスク実行のフローチャートである。 本発明の実施形態に係るキャッシュ同期制御方法におけるキャッシュ同期処理のフローチャートである。 4個のベクトルと1個のスカラ値を加算するC言語の関数を表す図である。 図8と等価なC言語の関数であって、本発明の実施形態に係るキャッシュ同期制御方法を使うように変形された関数を表す図である。 二つのデータが記憶装置上で同じアドレスを共有する状態を表す図である。 二つのデータが記憶装置上で全く同じアドレスを共有しない状態を表す図である。 二つのデータが記憶装置上で同じLバイトのメモリブロックに格納されていることを表す図である。 二つのデータが記憶装置上で異なるLバイトのメモリブロックに格納されていることを表す図である。 ダイレクトマップ方式のキャッシュのタグ計算方法を示す図である。 本発明の実施形態に係るマルチプロセッサのメモリ配置を表す図である。
符号の説明
10 マスタプロセッサ
11 命令キャッシュ
12 データキャッシュ
13 データ書き戻し部
14 データ削除部
21〜24 スレーブプロセッサ
30 記憶装置
40 バス
本発明の実施形態に係るマルチプロセッサのキャッシュ同期制御方法について、図面を参照して詳細に説明する。
図4は本実施形態に係るキャッシュ同期制御方法のフローチャートである。
キャッシュ同期制御方法は、タスクを生成する工程(ステップS100)と、タスクを実行する工程(ステップS200)とを含む。
図5は、タスク生成工程(ステップS100)における具体的な手順を示す。
タスク生成工程(ステップS100)は、図5を参照すると、入力データに関するタスク実行可能性判定(ステップS10)と、出力データに関するタスク実行可能性判定(ステップS11)、入力データのキャッシュ同期処理(ステップS12)、タスク割り当て(ステップS13)、タスクのパラメータ受け渡し(ステップS14)の工程を含む。
図6は、タスク実行工程(ステップS200)における具体的な手順を示す。
タスク実行工程(ステップS200)は、図6を参照すると、タスクのパラメータ受け取り(ステップS20)、タスクの実行(ステップS21)、出力データのキャッシュ同期処理(ステップS22)、タスクの完了通知(ステップS23)の工程を含む。
図7は、入力データのキャッシュ同期処理(ステップS12)又は出力データのキャッシュ同期処理(ステップS22)の詳細な手順を示す。これらのキャッシュ同期処理の工程は、アドレス変数ADDRの初期化(ステップS30)、アドレス変数ADDR_ENDの初期化(ステップS31)、データの書き戻し(ステップS32)、データの古いコピーの削除(ステップS33)、終了判定(ステップS34)、アドレス変数ADDRの更新(ステップS35)の工程を含む。
以上の手順によって、タスクと呼ばれる小プログラムごとに複数キャッシュの内容の一貫性が保持される。したがって、プログラマが同期ポイントを明示的に設定することなく、複数のデータキャッシュの内容を同期させることができる。さらに、キャッシュ同期処理が必要なデータがタスクの入力データと出力データとに限定されるため、キャッシュの全てのキャッシュブロックをスキャンすることなく、特定のデータについてだけキャッシュの内容を同期させることができる。
本発明のタスク実行にもとづいたキャッシュ同期制御方法の全てのステップあるいは一部のステップをプロセッサ上で動作するプログラムとして実現してもよい。
図面を参照して、本発明のタスク実行にもとづいたキャッシュ同期制御方法の実施例について説明する。
本発明の実施例におけるタスクについて説明する。本発明におけるタスクとはC言語における関数と同様のものである。すなわち、タスクは小規模のプログラムであって、入力データと出力データをもつ。入力データは外部からタスクへ与えられるデータであって、タスクが参照する外部のデータの全てが、入力データに含まれる。出力データはタスクが外部へ受け渡す全てのデータである。図1はタスクの概念図を示す。
タスクに対する入力データや出力データは無くてもよいし、複数個あってもよい。ある入力データが出力データに含まれてもよい。タスクの中だけで生成されて消滅するようなデータ(ローカルデータ)は、上記の入力データや出力データには含まれない。
入力データや出力データは開始アドレスとデータサイズで指定される。開始アドレスは入力データや出力データが記憶装置のどの位置に格納されているかを表す。データサイズは入力データや出力データの大きさを表す。
本発明の実施例におけるタスクは、外部から与えられる入力データと外部へ受け渡す出力データをもつ。この入力データと出力データの情報を使って複数のタスクの依存関係をグラフに表現することができる。このグラフは一般にデータフローグラフと呼ばれる。データフローグラフはタスクの依存関係を示す。また、その依存関係はタスクの実行順序やタスクの並列実行可能性を示す。データフローグラフの例を図2に示す。
タスクやデータフローグラフの概念は従来から知られているものである。例えば、特許文献3で説明されているマクロタスクは本発明のタスクと同じようなものである。特許文献3は、一つのプログラムを複数のマクロタスクに分割して、そのマクロタスクを並列処理するマルチプロセッサについて説明している。さらに、特許文献4は、データフローにもとづいたプログラムの実行方法や開発方法について説明している。
タスクとデータフローグラフを使うことにより、どのデータがタスク間で共有されるデータであるのかを知ることができる。本発明はタスクとデータフローグラフのこのような特徴を利用して、複数のキャッシュの一貫性を維持する。
本発明の実施例においては、入力データや出力データに関するタスクの依存関係にもとづいてタスクの実行順序を決定する。そして、タスクの実行開始時点と実行完了時点とを特許文献1及び2に開示されたバリア同期方式における同期ポイントとみなす。さらに、二つ以上のタスクが記憶装置上の同一のアドレスへ異なる値を書き込むことがないように、本発明の実施例においては、タスクの実行を制御する。タスクの実行開始時点と実行完了時点という暗黙的な同期ポイントにおいては、タスクの入力データと出力データだけについてキャッシュの一貫性を維持すれば良い。どのデータについてのキャッシュの一貫性をいつ維持すれば良いのかを明示的に知ることができるので、本発明の実施例においては、キャッシュ一貫性維持のための複雑な回路を必要としない。
本発明の実施例に係るマルチプロセッサの構成について説明する。本発明の実施例におけるマルチプロセッサの構成を図3に示す。
本発明の実施例におけるマルチプロセッサは、一つのマスタプロセッサ10と複数のスレーブプロセッサ21〜24を備える。マスタプロセッサ10はプログラム全体の進行とタスクの実行を管理する。スレーブプロセッサ21〜24はタスクを実行する。図3は、4個のスレーブプロセッサ21〜24を示している。しかし、本発明の実施例におけるマルチプロセッサは、1個以上の任意個数のスレーブプロセッサを備えることができる。マスタプロセッサ10とスレーブプロセッサ21〜24はそれぞれ命令キャッシュ11とデータキャッシュ12を備える。マスタプロセッサ10とスレーブプロセッサ21〜24はバス40に接続されている。記憶装置30も、バス40に接続されている。記憶装置30は、マスタプロセッサ10やスレーブプロセッサ21〜24のためのプログラムやデータを保持する。記憶装置30は、主記憶だけで構成されても良いし、2次キャッシュと主記憶の組み合わせで構成されてもよい。2次キャッシュと主記憶との組合せからなる記憶装置30においては、主記憶は2次キャッシュを経由してアクセスされる。2次キャッシュは、最近アクセスされた主記憶のデータのコピーを保持する。プロセッサが2次キャッシュを経由して主記憶からデータを読み出そうとするときに、そのデータのコピーが2次キャッシュの中に存在する場合には、2次キャッシュはそのデータのコピーをプロセッサへ返す。一方、そのデータのコピーが2次キャッシュの中に存在しない場合には、2次キャッシュは主記憶からそのデータを読み出して、そのデータを2次キャッシュの中にコピーし、そのデータをプロセッサへ返す。
各プロセッサのデータ書き戻し部13は、タスク実行前のタスクの入力データもしくはタスク実行後のタスクの出力データをデータキャッシュ12から記憶装置30に書き戻す。データ書き戻し部13は、データキャッシュ12から記憶装置30にデータを書き戻す際に、cache−sync信号を他のプロセッサに送信する。データ書き戻し部13はソフトウェア又は回路として、プロセッサに組み込んでも良い。本実施例では、データ書き戻し部はソフトウェアとしてプロセッサに組み込まれているものと仮定する。
各プロセッサのデータ削除部14は、他プロセッサのデータ書き戻し部13によって記憶装置30に書き戻されたデータを自身のデータキャッシュ12から削除する。あるプロセッサのデータ書き戻し部13から他のプロセッサにcache−sync信号が送信されると、その信号を受けとった他のプロセッサのデータ削除部14はデータ書き戻し部13によって記憶装置30に書き戻されるデータを自身のデータキャッシュ12から削除する。
データ削除部14はソフトウェアとしてあるいは回路としてプロセッサに組み込んでも良い。本実施例においては、データ削除部14は回路としてプロセッサに組み込まれているものと仮定する。
命令キャッシュ11は、プログラムを格納するためのキャッシュである。各プロセッサは命令キャッシュ11を経由してプログラムを記憶装置30から読み込む。データキャッシュ12はデータを格納するためのキャッシュである。各プロセッサはデータキャッシュ12を経由してデータを記憶装置30から読み込んだり、記憶装置30に書き込んだりする。命令キャッシュ11とデータキャッシュ12のキャッシュブロックサイズは、一例として、それぞれ32バイトとする。
データキャッシュ12は、一般的なライトバック方式のキャッシュとする。つまり、データキャッシュ12の各キャッシュブロックはvalidフラグとdirtyフラグとタグという情報をもつ。validフラグは、記憶装置30上のデータのコピーがキャッシュブロックに存在することを表す1ビットの情報である。dirtyフラグは、そのコピーの内容が変更されていることを表す1ビットの情報である。タグはキャッシュブロックに格納されるデータのアドレスを表す情報である。タグは、アドレスに基づいて一意に計算することができる情報である。
図14は、タグの構成の一例を示す。図14は、ダイレクトマップ方式のキャッシュにおけるタグ計算方法を示す図である。図14によると、32ビットのアドレスをLSB側から順番にoffsetフィールド、indexフィールド、tagフィールドの三つに分割することによって、アドレスからタグを得る。offsetフィールドは、キャッシュブロック内のデータの位置を表す。indexフィールドは、キャッシュブロックの番号を表す。tagフィールドは、そのアドレスのタグを表す。offsetフィールドの幅Pは、キャッシュブロックのサイズによって決まる。indexフィールドの幅Bは、キャッシュブロックのサイズとキャッシュの容量によって決まる。tagフィールドの幅は、(32−B−P)ビットである。図14のタグ計算方法は一つの例であり、どのようにタグを計算するかはキャッシュのブロックサイズや連想セット数に依存する。
キャッシュブロックにデータが格納されていない状態では、そのキャッシュブロックのvalidフラグとdirtyフラグはいずれも0である。キャッシュブロックにデータを格納した場合には、そのキャッシュブロックのvalidフラグを1にする。キャッシュブロックのデータを変更した場合には、そのキャッシュブロックのdirtyフラグを1にする。
あるキャッシュブロックのvalidフラグを0にすると、そのキャッシュブロックのデータをキャッシュから削除したことになる。dirtyフラグが1のキャッシュブロックのデータをデータキャッシュから記憶装置30へ書き戻した場合、そのキャッシュブロックのデータは記憶装置30のデータと一致することになる。したがって、そのキャッシュブロックのdirtyフラグを0にする。
dirtyフラグが0のキャッシュブロックへ記憶装置30上のデータのコピーを格納する場合、そのキャッシュブロックへそのデータのアドレスのタグとデータとを格納するとともにそのキャッシュブロックのvalidフラグを1にする。一方、validフラグが1であり、dirtyフラグが1であるキャッシュブロックへ記憶装置30上の新たなデータのコピーを格納する場合には、そのキャッシュブロックの古いデータを記憶装置30に書き戻してdirtyフラグを0にしてから、そのキャッシュブロックにそのデータのアドレスのタグとデータとを格納するとともにそのキャッシュブロックのvalidフラグを1とする。
命令キャッシュ11は命令の読み込みのためだけに使われ、プロセッサが命令キャッシュ11に格納されたプログラムの断片を記憶装置とは異なる内容に変更してしまうことはない。したがって、複数のキャッシュの内容の一貫性を維持するには、データキャッシュ12のみを対象とすればよい。以降の説明では、図3における複数のデータキャッシュ12の内容の一貫性を維持する方法について説明する。
本発明の実施例に係るタスクの生成と実行の手順について、図4を参照して説明する。ステップS100においてタスクを生成し、ステップS200においてタスクを実行する。ステップS100を実行するのはマスタプロセッサ10である。ステップS200を実行するのはいずれかのスレーブプロセッサである。ステップS100においては、タスク生成パラメータが必要である。ステップS200においては、タスク実行パラメータが必要である。タスク生成パラメータは以下の4つからなる。
「タスク処理内容task_X」は、タスクの処理内容を表すパラメータである。このパラメータは例えばC言語における関数ポインタとして表される。
「入力データ(a#1、a#2、...、a#P)」は、タスクに対するP個の入力データである。Pは1以上の任意の整数である。入力データは記憶装置30上の開始アドレスとデータサイズによって表される。
「出力データ(b#1、b#2、...、b#Q)」は、タスクのQ個の出力データである。Qは1以上の任意の整数である。出力データは、記憶装置30上の開始アドレスとデータサイズによって表される。
「キャッシュ同期処理が必要な入力データの情報」は、どの入力データに関してキャッシュ同期処理が必要かを表す情報である。タスクを生成する際に、この情報にもとづいてキャッシュ同期処理を行う。キャッシュ同期処理については後述する。
タスク実行パラメータは、タスク処理内容(task_X)、入力データ(a#1、a#2、...、a#P)、出力データ(b#1、b#2、...、b#Q)の3つからなる。キャッシュ同期処理が必要な入力データの情報がタスク実行パラメータには含まれない。
ステップS100やステップS200については、以下において詳しく説明する。
タスク生成工程(ステップS100)の手順について説明する。図4に示すようにステップS100においては、四つのパラメータを受けとる。ステップS100におけるタスクの生成手順を図5に示す。図5の手順にもとづいて、マスタプロセッサ10はそのタスクを生成し、そのタスクをあるスレーブプロセッサに実行させる。図5の各ステップの処理内容は以下のとおりである。
入力データに関するタスク実行可能性判定(ステップS10)において、マスタプロセッサ10は、タスクの入力データが既に準備できているかを調べる。タスクの入力データが現在実行中のタスクの出力データに含まれる場合には、マスタプロセッサ10はその入力データの準備がまだできていないものと判断する。それ以外の場合には、マスタプロセッサ10は、その入力データの準備ができているものと判断する。
「含まれる」という言葉の意味について、図10と図11とを使って説明する。もしタスクの入力データと現在実行中のタスクの出力データの一部とが図10に示すように記憶装置30上で同じアドレスを共有する場合には、タスクの入力データは別のタスクの出力データに含まれているものとマスタプロセッサ10は判断する。それ以外の場合には(図11を参照)、タスクの入力データは別のタスクの出力データに含まれていないものとマスタプロセッサ10は判断する。
マスタプロセッサ10は、タスクの全ての入力データが準備できるまで、このステップS10を繰り返す。マスタプロセッサ10がステップS10を何度も繰り返している間に、やがて実行中のタスクが完了し、その完了は割り込み信号によってマスタプロセッサ10に通知され、現在実行中のタスクの数は減少していく。したがって、いずれはステップS10は終了し、次のステップS11に遷移することができる。
次に、出力データに関するタスク実行可能性判定(ステップS11)において、マスタプロセッサ10は、タスクの出力データが現在実行中の他のタスクの出力データと重なっているか否かを調べる。
「重なっている」という言葉の意味について、図12と図13とを使って説明する。もしタスクの出力データの一部と現在実行中の別のタスクのいずれかの出力データの一部とが、図12に示すように記憶装置30上で同じLバイトのメモリブロックに格納されるならば、マスタプロセッサ10は、タスクの出力データが別の出力データと重なっているものと判断する。ここで、Lバイトのメモリブロックはスレーブプロセッサのキャッシュブロックと等しいサイズのメモリブロックであり、Lバイトのメモリブロックの開始アドレスはLバイトにアラインされているものとする。
一方、タスクの出力データの一部と現在実行中の別のタスクのいずれかの出力データの一部とが、図13に示すように記憶装置30上で異なるLバイトのメモリブロックに格納されている場合には、タスクの出力データは別の出力データと重なっていないものと、マスタプロセッサ10は判断する。マスタプロセッサ10は、タスクの出力データが別の出力データと重なっていないものと判断できるまで、このステップS11を繰り返す。
マスタプロセッサ10がステップS11を何度も繰り返している間に、やがて実行中のタスクが完了し、その完了は割り込み信号によってマスタプロセッサ10に通知され、現在実行中のタスクの数は減少していく。したがって、いずれはステップS11が終了し、次のステップS12に遷移することができる。
入力データのキャッシュ同期処理(ステップS12)において、タスクへの入力データの中にマスタプロセッサ10が書き込んだデータがある場合には、マスタプロセッサ10はその入力データを記憶装置30に書き戻すためにデータ書き戻し部を使ってキャッシュ同期処理を行う。キャッシュ同期処理の対象となる入力データは、ステップS100においてタスクに渡されるタスク生成パラメータに示されている。キャッシュ同期処理については後述する。
タスク割り当て工程(ステップS13)において、マスタプロセッサ10は、タスクを実行させるスレーブプロセッサをどれか一つ選択する。選択されたスレーブプロセッサをp_nとする。
タスクのパラメータ受渡し工程(ステップS14)において、マスタプロセッサ10は、タスクの実行に必要なパラメータをスレーブプロセッサp_nに受け渡す。パラメータの格納場所は記憶装置30でも良いし、パラメータ格納専用のメモリやレジスタでも良い。本実施例では記憶装置30にパラメータを格納する。そして、マスタプロセッサ10は、スレーブプロセッサp_nにタスクの実行開始を指示する。タスクの実行に必要なパラメータは、タスクの処理内容を表す関数の先頭アドレス、タスクの出力データ、タスクへの入力データの3つである。
次に、タスク実行工程(ステップS200)の手順について説明する。図4に示すように、ステップS200においては、3つのパラメータを受けとる。既に説明したステップS10からステップS14までの手順によってタスクが生成され、生成されたそのタスクをいずれかのスレーブプロセッサが実行する。ここでは、タスクを実行するスレーブプロセッサをp_nとする。ステップS200におけるタスクの実行手順を図6に示す。図6を参照すると、スレーブプロセッサがタスクを実行する各ステップの処理内容は以下のとおりである。
タスクのパラメータ受け取り工程(ステップS20)において、スレーブプロセッサp_nは、ステップS14において渡されたタスクのパラメータを受けとる。
タスクの実行工程(ステップS21)において、スレーブプロセッサp_nは、タスクのパラメータにもとづいてタスクを実行する。
出力データのキャッシュ同期処理工程(ステップS22)において、タスクの実行が完了した後、スレーブプロセッサp_nは、タスクの全ての出力データを記憶装置30に書き戻すためにデータ書き戻し部13を使ってキャッシュ同期処理を実行する。キャッシュ同期処理の対象となるデータはタスクの全ての出力データである。キャッシュ同期処理については後述する。
タスクの完了通知工程(ステップS23)において、スレーブプロセッサp_nは、マスタプロセッサ10にタスクの実行完了を通知する。
次に、上記の説明のステップS12とステップS22に登場したキャッシュ同期処理について説明する。キャッシュ同期処理は、マスタプロセッサ10あるいはスレーブプロセッサのデータ書き戻し部13とデータ削除部14とによって実行される処理である。キャッシュ同期処理を実行するプロセッサをp_ccとする。キャッシュ同期処理の手順を図7に示す。キャッシュ同期処理の対象となるデータが複数個ある場合には、その一つ一つのデータについて図7の手順を繰り返す。図7の各ステップの処理内容は以下のとおりである。
ADDRの初期化工程(ステップS30)において、キャッシュ同期処理の対象となるデータの開始アドレスを変数ADDRへ代入する。
ADDR_ENDの初期化工程(ステップS31)において、キャッシュ同期処理の対象となるデータの開始アドレスとデータサイズの和から1を減算した値を変数ADDR_ENDに代入する。変数ADDR_ENDは、キャッシュ同期処理の対象となるデータの終了アドレスを表す。
データの書き戻し工程(ステップS32)において、プロセッサp_ccは、変数ADDRが示すアドレスのデータをデータキャッシュから記憶装置30に書き戻す。この書き戻しはプロセッサp_ccのデータ書き戻し部13によって、次のように行なわれる。まず、データ書き戻し部13は、変数ADDRのタグと同じタグをもつキャッシュブロックがデータキャッシュ内に存在するか否かを調べる。そのようなキャッシュブロックが存在し、かつ、そのキャッシュブロックのvalidフラグとdirtyフラグがともに1である場合には、データ書き戻し部13は、そのキャッシュブロックのデータを記憶装置30に書き戻してからそのキャッシュブロックのdirtyフラグを0にする。プロセッサp_ccは、キャッシュブロックのデータを記憶装置30に書き戻したことを他のプロセッサに知らせるため、この書き戻しの実行中に、データ書き戻し部13は、他のプロセッサにcache−sync信号を送信する。
データの古いコピーの削除工程(ステップS33)において、プロセッサp_cc以外のプロセッサのデータキャッシュから変数ADDRが示すアドレスのデータのコピーを削除する。この削除は、プロセッサ内のデータ削除部14によって次のように行なわれる。プロセッサp_ccのデータ書き戻し部13によって送信されたcache−sync信号を受信した他の全てのプロセッサのデータ削除部14は、バス40上を流れているデータのアドレスを読みとる。そして、データ削除部14は、そのアドレスのタグと同じタグをもつキャッシュブロックが自身のデータキャッシュ内に存在するか否かを調べる。そのようなキャッシュブロックが存在し、かつ、そのキャッシュブロックのvalidフラグが1である場合には、データ削除部14はそのキャッシュブロックのvalidフラグを0にする。
終了判定工程(ステップS34)において、もし変数ADDRと変数ADDR_ENDとが示すアドレスが同一のキャッシュブロックに含まれる場合には、キャッシュ同期処理を終了する。
ADDRの更新工程(ステップS35)において、データキャッシュのキャッシュブロックの大きさを変数ADDRに加算し、ステップS32へ戻る。
本発明の実施例の動作を具体的な例にもとづいて説明する。4個のベクトルと1個のスカラ値の加算を実行するC言語の関数add_vectors_4()を図8に示す。本発明の実施例のタスク実行にもとづいたキャッシュ同期制御方法を使うために、図8を変形したものが図9である。図9においては、4個のベクトルを2個ずつにわけてそれぞれの和を求めてから、求めた和の合計を計算する。関数add_vec_2_scalar()は2個のベクトルと1個のスカラ値の和を計算する関数である。関数add_vec_2_scalar()は関数exec_task()を経由して関数add_vectors_4()から呼び出される。関数exec_task()は、タスクを実行する関数である。
関数add_vectors_4()は、タスクの入力データや出力データを表すためにoperandという構造体を使用する。この構造体は、開始アドレスとデータサイズを表す二つのメンバ変数をもつ。構造体operandを使うことによって、入力データや出力データの開始アドレスとデータサイズをタスクへ伝えることができる。タスクは、構造体operandの配列から入力データや出力データを取り出し、何らかの計算を実行する。
図9の関数add_vectors_4()について説明する。関数add_vectors_4()は以下の4つの処理に分類される。それぞれの処理の内容を以下に述べる。
まず、一時データ格納用メモリを確保する。ベクトルw[]とx[]の和を格納するベクトルsum_wx[]と、ベクトルy[]とz[]の和を格納するベクトルsum_yz[]とのためのメモリ領域を関数malloc()を使って確保する。
次に、タスクのパラメータを作成する。4個のベクトルw[]、x[]、y[]、z[]とスカラ値kの加算を以下の3つのタスクで実行するにあたって、3つのタスクへ与えるパラメータを作成する。operandという構造体の配列にパラメータを格納する。配列の最後には終端を表す0を格納する。
タスク#1は、ベクトルw[]とx[]とスカラ値valueの和をsum_wx[]に代入するタスクとする(ここでvalue==kとする)。
タスク#2は、ベクトルy[]とz[]とスカラ値valueの和をsum_yz[]に代入するタスクとする(ここでvalue==0とする)。
タスク#3は、ベクトルsum_wx[]とsum_yz[]とスカラ値valueの和をout[]に代入するタスクとする(ここでvalue==0とする)。
次に、タスクの生成と実行を行う。上記の三つのタスクを順番に呼び出す。上記の三つのタスクの動作はいずれも同じであって入力データと出力データが異なる。三つのタスクに共通する動作は関数add_vec_2_scalar()である。タスクの生成には関数exec_task()を使う。この関数exec_task()は、ステップS10からステップS14までを実行する。そして、いずれかのスレーブプロセッサが、ステップS20からステップS23にもとづいて生成されたタスクを実行する。関数add_vectors_4()は3つのタスクを生成することから、関数exec_task()が3回呼び出される。
次に、一時データ格納用メモリを解放する。ベクトルsum_wx[]とsum_yz[]とスカラ値valueのためのメモリ領域を解放する。
関数add_vectors_4()におけるタスク生成とタスク実行について詳しく説明する。
本発明の実施例におけるマルチプロセッサのメモリ配置を図15に示す。マスタプロセッサ10とスレーブプロセッサ21、22、23、24のスタック領域をそれぞれ64Kバイトずつ記憶装置30上に配置する。そして、関数add_vectors_4()の引数として与えられる配列out[]、w[]、x[]、y[]、z[]、の大きさをそれぞれ4Kバイトとして、アドレス0x10000から順番に配置する。さらに、関数malloc()が使用するヒープ領域をアドレス0x900000以降に配置する。つまり、関数malloc()によって割り当てられる配列sum_wx[]とsum_yz[]とスカラ値valueはアドレス0x900000以降に配置されることになる。このようなメモリ配置のもとで、関数add_vectors_4()を実行するものと仮定する。さらに、関数add_vectors_4()の実行開示時点においては、タスクは全く実行されていないと仮定する。
以上のような仮定のもとで、関数add_vectors_4()における第一回目の関数exec_task()について説明する。関数exec_task()は指定されたタスクを生成する関数であり、その処理内容はステップS10からステップS14までである。関数exec_task()は4つの引数をもつ。すなわち、4つの引数は、タスクの処理内容を表す関数ポインタ、出力データに関する構造体operandのポインタ、入力データに関する構造体operandのポインタ、キャッシュ同期処理が必要な入力データに関する構造体operandのポインタ、である。
関数add_vectors_4()の第1回目のexec_task()においては、タスクの動作は関数add_vec_2_scalar()である。また、出力データの情報は配列op_out0[]に、入力データの情報は配列op_in0[]に、キャッシュ同期処理が必要な入力データの情報は配列op_sync0[]に、それぞれ格納されている。関数add_vectors_4()の第1回目のexec_task()によって生成されるタスクをタスク#1と呼ぶことにする。
まず、関数exec_task()はステップS10を実行する。ステップS10は、入力データに関してタスク#1が実行可能であるかを判定する処理である。関数add_vectors_4()の第1回目のexec_task()における入力データは配列w[]とx[]とスカラ値valueである。関数add_vectors_4()の実行開示時点では全くタスクは実行されていないと仮定しているので、この時点では配列w[]やx[]やスカラ値valueを出力データとする別のタスクは実行されていない。したがって、関数add_vectors_4()の第1回目のexec_task()では、タスク#1は入力データに関して実行可能である。
次に、関数exec_task()はステップS11を実行する。ステップS11は、出力データに関してタスク#1が実行可能か否かを判定する処理である。関数add_vectors_4()の第1回目のexec_task()における出力データは配列sum_wx[]である。ステップS11において、関数exec_task()はこの配列が現在実行中の他のタスクの出力データと重なっているかを調べる。関数add_vectors_4()の実行開示時点では全くタスクは実行されていないと仮定していることから、配列sum_wx[]は現在実行中の他のタスクの出力データと重なっていないことになる。したがって、関数add_vectors_4()の第一回目のexec_task()においては、タスク#1は出力データに関して実行可能である。
次に、関数exec_task()はステップS12を実行する。ステップS12は、入力データに関するキャッシュ同期処理を行う処理である。第1回目のexec_task()の直前でスカラ値valueに変数kが代入されている。スカラ値valueは、第1回目のexec_task()の入力データの一つである。したがって、このスカラ値valueの新しい値を記憶装置30へ格納するためにスカラ値valueに対するキャッシュ同期処理が必要となる。このような理由によってキャッシュ同期処理が必要な入力データの情報は配列op_sync0[]に格納されていて、それはスカラ値valueのアドレスとデータサイズである。そこで、スカラ値valueについてステップS30からステップS35までの処理を実行する。
次に、スカラ値valueに関するキャッシュ同期処理について説明する。まず、スカラ値valueの開始アドレス0x902000を変数ADDRに代入する(ステップS30)。次に、スカラ値valueの終了アドレス(0x902000+4−1)=0x902003を変数ADDR_ENDに代入する(ステップS31)。次に、マスタプロセッサ10のデータ書き戻し部は、変数ADDRが示すアドレス0x902000のタグと同じタグをもつキャッシュブロックをマスタプロセッサ10のデータキャッシュから記憶装置30に書き戻す(ステップS32)。マスタプロセッサ10のデータキャッシュにそのようなタグをもつキャッシュブロックがある場合には、マスタプロセッサ10のデータ書き戻し部は、そのキャッシュブロックのデータを記憶装置30に書き戻し、そのキャッシュブロックのdirtyフラグを0にし、さらに他の全てのプロセッサへcache−sync信号を送信する。次に、スカラ値valueの古いコピーを他のプロセッサから削除するために、変数ADDRが示すアドレス0x902000のタグと同じタグをもつキャッシュブロックをマスタプロセッサ10以外のデータキャッシュから削除する(ステップS33)。マスタプロセッサ10から送信されたcache−sync信号を受信したプロセッサのデータキャッシュに、そのようなキャッシュブロックが存在し、かつそのキャッシュブロックのvalidフラグが1であるならば、マスタプロセッサ10以外の全てのプロセッサのデータ削除部は自身のデータキャッシュに存在するそのキャッシュブロックのvalidフラグを0にする。次に、変数ADDRと変数ADDR_ENDとが示すアドレスが同じキャッシュブロックに存在する場合には、キャッシュ同期処理を終了する(ステップS34)。この時点においては、ADDR=0x902000であり、ADDR_END=0x902003であり、キャッシュブロックのサイズは32バイトであることから、変数ADDRと変数ADDR_ENDとが示すアドレスは同じキャッシュブロックに存在する。したがって、キャッシュ同期処理を終了する(ステップS34)。
次に、関数exec_task()は、ステップS13を実行する。ステップS13はいずれかのスレーブプロセッサにタスクを割り当てる処理である。どのスレーブプロセッサを選ぶかについてはさまざまな方法が考えられる。どのような基準でスレーブプロセッサを選択しても良いが、できるだけタスクを早期に実行完了できるようなスレーブプロセッサを選択することができる方法が望ましい。本実施例においては、ラウンドロビンアルゴリズムを使用する。ラウンドロビンアルゴリズムは、21、22、23、24、21、22、...、というように、番号順にスレーブプロセッサにタスクを割り当てるアルゴリズムである。選択されたスレーブプロセッサがタスクを実行している場合には、その次の番号のスレーブプロセッサにタスクを割り当てる。関数add_vectors_4()の第1回目のexec_task()においては、スレーブプロセッサ21にタスク#1を割り当てることにする。マスタプロセッサ10はどのタスクをどのスレーブプロセッサへ割り当てたかという情報やどのスレーブプロセッサが空いているかという情報を記憶する。これらの情報は新たなタスクのためのステップS10やステップS11において参照される。
次に、関数exec_task()はステップS14を実行する。ステップS14はタスクの実行に必要なパラメータをスレーブプロセッサに受け渡す処理である。タスクの実行に必要なパラメータは、(1)タスクの処理内容を表す関数の先頭アドレス、(2)タスクの出力データ、(3)タスクへの入力データ、である。関数add_vectors_4()の第1回目のexec_task()においては、(1)は関数add_vec_2_scalar()の先頭アドレスであり、(2)は配列op_out0[]の各要素であり、(3)は配列op_in0[]の各要素である。
パラメータの受渡しには記憶装置30を使用する。スレーブプロセッサごとにタスクのパラメータを格納するメモリ領域を決めておく。例えば、アドレス0x880000から0x8800FFのメモリ領域はスレーブプロセッサ21のためのタスクのパラメータを格納する領域である。関数exec_task()はスレーブプロセッサ21へ渡すべきパラメータを記憶装置30へ書き込み、スレーブプロセッサ21はそのパラメータを記憶装置30から読み込む。パラメータを渡す際に、関数exec_task()はこれらのパラメータをキャッシュ経由ではなく直接記憶装置30へ格納する。キャッシュを経由しない理由は、パラメータを即座に記憶装置30へ書き込むためである。
ステップS14の最後に、関数exec_task()は選択したスレーブプロセッサ21にタスク#1の実行開始を指示する。この指示は、割り込み信号としてスレーブプロセッサ21に伝達される。この後、マスタプロセッサ10は、第2回目のexec_task()を実行する。
次に、スレーブプロセッサにおけるタスクの実行について詳しく説明する。スレーブプロセッサにおいてタスクはステップS20からステップS23の手順で実行される。ここでは、関数add_vectors_4()の第1回目のexec_task()によって生成されたタスク#1を例として説明する。既に説明したように、タスク#1はスレーブプロセッサ21に割り当てられている。
まず、スレーブプロセッサ21はステップS20を実行する。ステップS20は、タスクのパラメータを受けとる処理である。スレーブプロセッサ21は自身のデータキャッシュ経由ではなく直接記憶装置30からパラメータを読み込む(ステップS20)。データキャッシュを経由しない理由は、古いパラメータのコピーをデータキャッシュに残さないためである。
次に、スレーブプロセッサ21はタスクの実行(ステップS21)を行う。スレーブプロセッサ21は記憶装置30から読み出したパラメータから配列op_out0[]と配列op_in0[]のそれぞれの先頭アドレスを取り出し、それらを引数として関数add_vec_2_scalar()を呼び出す。そして、スレーブプロセッサ21は、関数add_vec_2_scalar()を実行する。
次に、スレーブプロセッサ21はステップS22を実行する。ステップS22はタスクの出力データに関するキャッシュ同期処理である。スレーブプロセッサ21は、配列op_out0[]に格納された出力データの開始アドレスとサイズにもとづいて、キャッシュ同期処理を行う。スレーブプロセッサ21のデータキャッシュから記憶装置30に出力データを書き戻し、他のプロセッサのデータキャッシュから出力データの古いコピーを削除する。この書き戻しと削除はステップS30からステップS35までの処理である。配列op_out0[]には1個の出力データsum_wx[]の開始アドレスとサイズが格納されている。そこで、配列sum_wx[]について、ステップS30からステップS35までの処理を実行する。
次に、配列sum_wx[]に関するキャッシュ同期処理について説明する。まず、配列sum_wx[]の開始アドレス0x900000を変数ADDRに代入する(ステップS30)。次に、配列sum_wx[]の終了アドレス(0x900000+0x1000−1)=0x900FFFを変数ADDR_ENDに代入する(ステップS31)。次に、変数ADDRが示すアドレス0x900000と同じタグをもつキャッシュブロックをスレーブプロセッサ21のデータキャッシュから記憶装置30へ書き戻す(ステップS32)。スレーブプロセッサ21のデータキャッシュにそのようなタグをもつキャッシュブロックがある場合には、スレーブプロセッサ21のデータ書き戻し部は、そのキャッシュブロックのデータを記憶装置30に書き戻し、そのキャッシュブロックのdirtyフラグを0とし、さらに他の全てのプロセッサにcache−sync信号を送信する。次に、配列sum_wx[]の古いコピーを他のプロセッサから削除するために、変数ADDRが示すアドレス0x900000のタグと同じタグをもつキャッシュブロックをスレーブプロセッサ21以外のデータキャッシュから削除する(ステップS33)。スレーブプロセッサ21から送信されたcache−sync信号を受信したプロセッサのデータキャッシュにそのようなキャッシュブロックが存在し、かつそのキャッシュブロックのvalidフラグが1である場合には、スレーブプロセッサ21以外の全てのプロセッサのデータ削除部は、自身のデータキャッシュに存在するそのキャッシュブロックのvalidフラグを0にする。次に、変数ADDRと変数ADDR_ENDとが示すアドレスが同じキャッシュブロックに存在する場合には、キャッシュ同期処理を終了する(ステップS34)。この時点においては、ADDR=0x900000、ADDR_END=0x900FFFであり、キャッシュブロックのサイズは32バイトであることから、変数ADDRと変数ADDR_ENDとが示すアドレスは異なるキャッシュブロックに存在する。したがって、キャッシュ同期処理を継続する。次に、変数ADDRにキャッシュブロックのサイズ32バイトを加算し(ステップS35)、ステップS32に戻る。そして、終了判定(ステップS34)が下されるまでステップS32からステップS35までを繰り返す。終了判定が下される時の変数ADDRは0x900FE0である。変数ADDRがこの値になった場合には、変数ADDRと変数ADDR_ENDとが示すアドレスは同じキャッシュブロックに存在することから、キャッシュ同期処理は終了する(ステップS34)。
次に、スレーブプロセッサ21は、ステップS23を実行する。ステップS23は、タスクの完了をマスタプロセッサ10へ通知する処理である。スレーブプロセッサ21は、割り込み信号を使ってマスタプロセッサ10へタスクの完了を通知する。
次に、関数add_vectors_4()の第2回目のexec_task()について説明する。関数add_vectors_4()の第2回目のexec_task()においては、タスクの動作が関数add_vec_2_scalar()であるまた、出力データの情報は配列op_out1[]に、入力データの情報は配列op_in1[]に、キャッシュ同期処理が必要な入力データの情報は配列op_sync0[]に、それぞれ格納されている。関数add_vectors_4()の第2回目のexec_task()によって生成されるタスクをタスク#2と呼ぶ。
まず、ステップS10において、入力データに関してタスク#2が実行可能か否かを判定する。二回目のexec_task()における入力データは、配列y[]とz[]とスカラ値valueである。この時点においては、配列y[]やz[]やスカラ値valueを出力データとする別のタスクは存在しないことから、二回目のexec_task()においては、タスク#2は入力データに関して実行可能である。
次に、出力データに関してタスク#2が実行可能か否かを判定する(ステップS11)。2回目のexec_task()における出力データは配列sum_yz[]である。この時点において、実行中のタスクは一回目のexec_task()で生成されたタスク#1であって、その出力データは配列sum_wx[]である。図15によると、配列sum_wx[]とsum_yz[]は、記憶装置30上において重なっていない。したがって、2回目のexec_task()においては、タスク#2は出力データに関して実行可能である。
次に、入力データに関するキャッシュ同期処理を行う(ステップS12)。2回目のexec_task()の直前でスカラ値valueへ0が代入されている。スカラ値valueは、2回目のexec_task()の入力データの一つである。したがって、このスカラ値valueの新しい値を記憶装置30に格納するためにスカラ値valueに対するキャッシュ同期処理が必要となる。このような理由によって、キャッシュ同期処理が必要な入力データの情報は、配列op_sync0[]に格納されている。その情報は、スカラ値valueのアドレスとデータサイズである。そこで、一回目のexec_task()と同じように、スカラ値valueについてステップS30からステップS35までの処理を実行する。
次に、タスク#2をいずれかのスレーブプロセッサに割り当てる(ステップS13)。1回目のexec_task()においてはスレーブプロセッサ21を選択したことから、ラウンドロビンアルゴリズムにもとづいて、次のスレーブプロセッサ22にタスク#2を割り当てることにする。
次に、タスク#2の実行に必要なパラメータをスレーブプロセッサ22に渡す(ステップS14)。必要なパラメータは、(1)関数add_vec_2_scalar()の先頭アドレス、(2)配列op_out1[]の各要素、(3)配列op_in1[]の各要素、である。パラメータを渡す際に、これらのパラメータをキャッシュ経由ではなく、記憶装置30に直接格納する。アドレス0x880100から0x8801FFまでの領域がスレーブプロセッサ22のためのパラメータの格納領域である。
ステップS14の最後に、関数exec_task()は、選択したスレーブプロセッサ22にタスク#2の実行開始を指示する。この指示は割り込み信号としてスレーブプロセッサ22に伝達される。この後、マスタプロセッサ10は第3回目のexec_task()を実行する。
1回目のexec_task()によって生成されたタスク#1をスレーブプロセッサ21が実行したのと同様にして、ステップS20からステップS23にもとづいて、スレーブプロセッサ22は2回目のexec_task()によって生成されたタスク#2を実行する。スレーブプロセッサ22は、データキャッシュ経由ではなく直接記憶装置30からタスク#2のパラメータを読み出し、配列op_out1[]と配列op_in1[]のそれぞれの先頭アドレスを取り出し、それらを引数として関数add_vec_2_scalar()を実行する。そして、タスク#2の実行後に、スレーブプロセッサ22は、タスク#2の出力データである配列sum_yz[]に関するキャッシュ同期処理を行ってから、マスタプロセッサ10にタスク#2の完了を通知する。
次に、関数add_vectors_4()の第3回目のexec_task()について説明する。関数add_vectors_4()の第3回目のexec_task()においては、タスクの動作は関数add_vec_2_scalar()である。また、出力データの情報は配列op_out2[]に、入力データの情報は配列op_in2[]に、それぞれ格納されている。第三回目のexec_task()においては、キャッシュ同期処理が必要な入力データはない。関数add_vectors_4()の第三回目のexec_task()によって生成されるタスクをタスク#3と呼ぶ。
まず、入力データに関してタスク#3が実行可能か否かを判定する(ステップS10)。3回目のexec_task()における入力データは、配列sum_wx[]とsum_yz[]とスカラ値valueである。この時点においては、配列sum_wx[]を出力データとするタスク#1と配列sum_yz[]を出力データとするタスク#2が存在している。配列sum_wx[]を出力データとするタスク#1とは第1回目のexec_task()によって起動されたタスクであり、配列sum_yz[]を出力データとするタスク#2とは第2回目のexec_task()によって起動されたタスクである。これらのタスクが完了するまで、3回目のexec_task()の入力データは利用可能とならない。したがって、3回目のexec_task()は、タスク#1とタスク#2とが完了するまでステップS10を繰り返す。やがてタスク#1とタスク#2の実行完了が割り込み信号によってマスタプロセッサ10に通知される。両方のタスクが完了した後に、三回目のexec_task()は、タスク#3が入力データに関して実行可能であると判定する。
次に、出力データに関してタスク#3が実行可能か否かを判定する(ステップS11)。3回目のexec_task()における出力データは配列out[]である。この時点において実行中のタスクは一つもない。なぜなら、ステップS10において、タスク#1とタスク#2とが完了してから、ステップS11に遷移しているからである。したがって、配列out[]は現在実行中の他のタスクの出力データと重なっていないことから、3回目のexec_task()においては、タスク#3は出力データに関して実行可能であると判定される。
次に、ステップS12においては、入力データに関するキャッシュ同期処理が行われるはずである。しかし、3回目のexec_task()においては、キャッシュ同期処理が必要な入力データは与えられていない。したがって、キャッシュ同期処理を行うことなく、次のステップS13に遷移する。
次に、タスク#3をいずれかのスレーブプロセッサに割り当てる(ステップS13)。2回目のexec_task()はスレーブプロセッサ22を選択したので、ラウンドロビンアルゴリズムにもとづいて、次のスレーブプロセッサ23にタスク#3を割り当てることとする。
次に、タスク#3の実行に必要なパラメータをスレーブプロセッサ23に渡す(ステップS14)。必要なパラメータは、(1)関数add_vec_2_scalar()の先頭アドレス、(2)配列op_out2[]の各要素、(3)配列op_in2[]の各要素、である。パラメータを渡す際に、これらのパラメータをキャッシュ経由ではなく、記憶装置30に直接格納する。図15を参照すると、アドレス0x880200から0x8802FFまでの領域は、スレーブプロセッサ23のためのパラメータの格納領域である。
ステップS14の最後において、関数exec_task()は、選択したスレーブプロセッサ23にタスク#3の実行開始を指示する。この指示は割り込み信号としてスレーブプロセッサ23に伝達される。この後、マスタプロセッサ10は、残りのプログラムを実行する。
1回目のexec_task()によって生成されたタスク#1をスレーブプロセッサ21が実行したのと同様にして、ステップS20からステップS23にもとづいて、スレーブプロセッサ23は、3回目のexec_task()によって生成されたタスク#3を実行する。スレーブプロセッサ23は、データキャッシュ経由ではなく直接記憶装置30からタスク#3のパラメータを読み出し、配列op_out2[]と配列op_in2[]のそれぞれの先頭アドレスを取り出し、それらを引数として関数add_vec_2_scalar()を実行する。そして、タスク#3の実行後に、スレーブプロセッサ23は、タスク#3の出力データである配列out[]に関するキャッシュ同期処理を行った後、マスタプロセッサ10にタスクの完了を通知する(ステップS23)。
以上の記載は実施例に基づいて行ったが、本発明は、上記実施例に限定されるものではない。
本発明は、キャッシュをもつ複数のプロセッサから成るマルチプロセッサに適用することができる。さらに、そのようなマルチプロセッサ向けのコードを生成するコンパイラにも応用可能である。マルチプロセッサと呼ばれるものには、組み込み用途からスーパーコンピュータまで幅広く存在する。本発明は、その規模に依らず適用することができる。
本発明の全開示(請求の範囲を含む)の枠内において、さらにその基本的技術思想に基づいて、実施形態ないし実施例の変更・調整が可能である。また、本発明の請求の範囲の枠内において種々の開示要素の多様な組み合わせないし選択が可能である。

Claims (11)

  1. キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御方法であって、
    タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除する第1の工程と、
    前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除する第2の工程と、を含むことを特徴とする、キャッシュ同期制御方法。
  2. 前記第1の工程において、前記タスクを管理するプロセッサはそれ以外のプロセッサに自己のキャッシュから前記入力データに相当するデータを削除するように通知し、
    前記第2の工程において、前記タスクを実行したプロセッサはそれ以外のプロセッサに自己のキャッシュから前記出力データに相当するデータを削除するように通知することを特徴とする、請求項1に記載のキャッシュ同期制御方法。
  3. 複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるマルチプロセッサにおいて、プログラムをタスクと呼ばれる複数の小プログラムに分割し、タスクへ他タスクから与えられたデータを入力データとし、タスクが他タスクへ受け渡すデータを出力データとし、前記タスクを前記マルチプロセッサにおいて実行する場合に前記キャッシュの同期を制御する方法であって、
    タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを記憶装置に書き戻し、該タスクの入力データの古いコピーを他のプロセッサのキャッシュから削除する第1の工程と、
    タスクの実行後に、タスクの出力データをキャッシュから記憶装置に書き戻し、タスクの出力データの古いコピーを他のプロセッサのキャッシュから削除する第2の工程と、を含むことを特徴とするキャッシュ同期制御方法。
  4. 前記第1の工程において、どの入力データを記憶装置に書き戻すべきかという情報が与えられており、その情報において指定された入力データのみをキャッシュから記憶装置に書き戻すことを特徴とする、請求項3に記載のキャッシュ同期制御方法。
  5. キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備え、
    タスクの実行前に、該タスクを管理するプロセッサは該タスクの入力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該入力データに相当するデータを削除し、
    前記タスクの実行後に、前記タスクを実行したプロセッサは前記タスクの出力データを前記記憶装置に書き戻すとともに、それ以外のプロセッサは自己のキャッシュから該出力データに相当するデータを削除するように構成されたことを特徴とするマルチプロセッサ。
  6. 前記複数のプロセッサはマスタプロセッサとスレーブプロセッサとを含み、
    前記スレーブプロセッサは前記タスクを実行し、
    前記マスタプロセッサは前記タスクを前記スレーブプロセッサに割り当てることを特徴とする、請求項5に記載のマルチプロセッサ。
  7. 前記複数のプロセッサ及び前記記憶装置が結合されたバスを備えることを特徴とする、請求項5又は6に記載のマルチプロセッサ。
  8. 複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるとともに、プログラムをタスクと呼ばれる複数の小プログラムに分割し、各タスクを前記プロセッサのいずれかにおいて実行するように構成されたマルチプロセッサであって、
    前記プロセッサはデータ書き戻し部とデータ削除部とを備え、
    前記データ書き戻し部は各タスクの実行前にそのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻し、さらに、各タスクの実行後にそのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻すように構成されるとともに、
    前記データ削除部は各タスクの実行前に前記データ書き戻し部によって記憶装置に書き戻された入力データの古いコピーを保持するキャッシュからその古いコピーを削除し、さらに、各タスクの実行後に前記データ書き戻し部によって記憶装置に書き戻された出力データの古いコピーを保持するキャッシュからその古いコピーを削除するように構成されることを特徴とするマルチプロセッサ。
  9. プログラムをタスクと呼ばれる複数の小プログラムに分割し、タスクへ他タスクから与えられたデータを入力データとし、タスクが他タスクへ受け渡すデータを出力データとしたときに、タスクの入力データと出力データとにもとづいてタスクの実行順序を制御するように構成されたマスタプロセッサと、
    タスクを実行するように構成された1個以上のスレーブプロセッサと、
    タスクの入力データ及び出力データを記録するように構成された記憶装置と、
    前記両プロセッサと記憶装置とを接続するように構成された結合網と、を備えたマルチプロセッサであって、
    前記両プロセッサはキャッシュとデータ書き戻し部とデータ削除部とを備え、
    前記データ書き戻し部は各タスクの実行前にそのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻し、さらに、各タスクの実行後にそのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻すように構成されるとともに、
    前記データ削除部は各タスクの実行前に前記データ書き戻し部によって記憶装置に書き戻された入力データの古いコピーを保持するキャッシュからその古いコピーを削除し、さらに、各タスクの実行後に前記データ書き戻し部によって記憶装置に書き戻された出力データの古いコピーを保持するキャッシュからその古いコピーを削除するように構成されることを特徴とするマルチプロセッサ。
  10. キャッシュを有する複数のプロセッサと、該複数のプロセッサによって共有される記憶装置とを備えたマルチプロセッサにおけるキャッシュ同期制御プログラムであって、
    タスクの実行前に、該タスクを管理するプロセッサに対して該タスクの入力データを前記記憶装置に書き戻す処理を実行させるとともに、それ以外のプロセッサに対して自己のキャッシュから該入力データに相当するデータを削除する処理を実行させ、
    前記タスクの実行後に、前記タスクを実行したプロセッサに対して前記タスクの出力データを前記記憶装置に書き戻す処理をさせるとともに、それ以外のプロセッサに対して自己のキャッシュから該出力データに相当するデータを削除する処理を実行させることを特徴とする、キャッシュ同期制御プログラム。
  11. 複数のプロセッサと、各プロセッサに付随するキャッシュと、記憶装置と、これらを接続する結合網とを含んで構成されるマルチプロセッサにおいて、プログラムをタスクと呼ばれる複数の小プログラムに分割し、各タスクを前記プロセッサのいずれかにおいて実行する場合に前記キャッシュの同期制御を前記プロセッサに実行させるキャッシュ同期制御プログラムであって、
    各タスクの実行前に、そのタスクの入力データを保持するキャッシュから記憶装置に入力データを書き戻す処理と、
    その入力データの古いコピーを保持するキャッシュからその古いコピーを削除する処理と、を前記プロセッサに実行させるとともに、
    各タスクの実行後に、そのタスクの出力データを保持するキャッシュから記憶装置に出力データを書き戻す処理と、
    その出力データの古いコピーを保持するキャッシュからその古いコピーを削除する処理と、を前記プロセッサに実行させることを特徴とするキャッシュ同期制御プログラム。
JP2009539132A 2007-11-01 2008-10-31 マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム Expired - Fee Related JP5293609B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009539132A JP5293609B2 (ja) 2007-11-01 2008-10-31 マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
JP2007285299 2007-11-01
JP2007285299 2007-11-01
PCT/JP2008/069918 WO2009057762A1 (ja) 2007-11-01 2008-10-31 マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム
JP2009539132A JP5293609B2 (ja) 2007-11-01 2008-10-31 マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム

Publications (2)

Publication Number Publication Date
JPWO2009057762A1 JPWO2009057762A1 (ja) 2011-03-10
JP5293609B2 true JP5293609B2 (ja) 2013-09-18

Family

ID=40591142

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009539132A Expired - Fee Related JP5293609B2 (ja) 2007-11-01 2008-10-31 マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム

Country Status (3)

Country Link
US (1) US8990511B2 (ja)
JP (1) JP5293609B2 (ja)
WO (1) WO2009057762A1 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10423424B2 (en) * 2012-09-28 2019-09-24 Nvidia Corporation Replicated stateless copy engine
US9244629B2 (en) * 2013-06-25 2016-01-26 Advanced Micro Devices, Inc. Method and system for asymmetrical processing with managed data affinity
KR20220072357A (ko) * 2020-11-25 2022-06-02 에스케이하이닉스 주식회사 컨트롤러, 및 이를 포함하는 메모리 시스템 및 데이터 처리 시스템

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008204292A (ja) * 2007-02-21 2008-09-04 Toshiba Corp メモリ管理システム

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0962576A (ja) 1995-08-21 1997-03-07 Canon Inc 情報処理装置及びその制御方法
JPH0962580A (ja) 1995-08-30 1997-03-07 Canon Inc マルチプロセッサ装置
US6378066B1 (en) 1999-02-04 2002-04-23 Sun Microsystems, Inc. Method, apparatus, and article of manufacture for developing and executing data flow programs, and optimizing user input specifications
JP4784792B2 (ja) 1999-12-22 2011-10-05 学校法人早稲田大学 マルチプロセッサ
US6829665B2 (en) * 2001-09-28 2004-12-07 Hewlett-Packard Development Company, L.P. Next snoop predictor in a host controller
US7530066B2 (en) * 2002-06-24 2009-05-05 Chang Stephen S Controlling snoop activities using task table in multiprocessor system

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008204292A (ja) * 2007-02-21 2008-09-04 Toshiba Corp メモリ管理システム

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JPN6013021614; 岩田英次 他: '統合型並列化コンパイラ・システム -コンパイラ支援型キャッシュ・コヒーレンス制御-' 情報処理学会研究報告 第90巻、第60号, 19900718, p.121-126, 社団法人情報処理学会 *

Also Published As

Publication number Publication date
US20110047335A1 (en) 2011-02-24
US8990511B2 (en) 2015-03-24
WO2009057762A1 (ja) 2009-05-07
JPWO2009057762A1 (ja) 2011-03-10

Similar Documents

Publication Publication Date Title
JP5488697B2 (ja) マルチコアプロセッサシステム、同期制御方法、および同期制御プログラム
US10324694B2 (en) Arranging binary code based on call graph partitioning
US7533246B2 (en) Application program execution enhancing instruction set generation for coprocessor and code conversion with marking for function call translation
JP4339371B2 (ja) 情報処理装置および情報処理方法
US9928057B2 (en) Method of providing a non-cacheable area in memory
JP2003029985A (ja) マルチスレッド実行方法及び並列プロセッサシステム
JP2003029986A (ja) プロセッサ間レジスタ継承方法及びその装置
JP2011118743A (ja) ベクトル型計算機及びベクトル型計算機の命令制御方法
US10031697B2 (en) Random-access disjoint concurrent sparse writes to heterogeneous buffers
JP5843801B2 (ja) 情報処理装置およびデバッグ方法
US20140019710A1 (en) Endian conversion method and system
JP4294059B2 (ja) 情報処理装置および情報処理方法
JP4130465B2 (ja) メモリ転送処理サイズが異なるプロセッサに関してアトミックな処理を実行するための技術
US9606923B2 (en) Information processing device with shared memory, memory order guarantee method using counters fence instructions in relation to cache-oriented requests, and recording medium storing program
JP5293609B2 (ja) マルチプロセッサ並びにそのキャッシュ同期制御方法及びプログラム
KR102458467B1 (ko) 벡터 생성 명령
Saporito et al. Design of the IBM z15 microprocessor
US6298355B1 (en) Computer system
JP2012103923A (ja) コンパイラ装置、コンパイル方法及びコンパイラプログラム
JP6740719B2 (ja) 情報処理装置、情報処理方法、およびプログラム
JP3670646B2 (ja) レジスタ転送オペレーション
JP5811211B2 (ja) マルチコアプロセッサシステム、マルチコアプロセッサシステムの制御方法、およびマルチコアプロセッサシステムの制御プログラム
US20200409746A1 (en) Information processing apparatus and recording medium
Wong et al. Integrating software distributed shared memory and message passing programming
Börger et al. Modeling an operating system kernel

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110905

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130527

R150 Certificate of patent or registration of utility model

Ref document number: 5293609

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees