本発明にかかるマルチプロセッサシステム、制御プログラム、および制御方法の好適な実施の形態を詳細に説明する。なお、本実施の形態のマルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
図1は、本実施の形態の一例を示す説明図である。図1のスレッド1{・・・}とスレッド2{・・・}とのそれぞれの{・・・}内には、それぞれのコーディング例が記述されている。
スレッド1では、変数zへ5が代入され、変数xに10が代入される。その後、スレッド1では変数zと10との加算結果が変数wへ代入される。よって、スレッド1において変数xと変数zと変数wとが出力データであり、スレッド1において変数zが入力データである。
スレッド2では、変数yへ変数xが代入され、変数zと100との乗算結果が変数aに代入される。よって、スレッド2において変数yと変数aとが出力データであり、変数xと変数zとが入力データである。
変数xの入力先スレッドはスレッド2であり、変数zの入力先スレッドはスレッド1とスレッド2である。テーブルは、出力データの項目と入力先スレッドの項目と割当先CPUの識別情報の項目とを有し、出力データごとに該出力データの入力先スレッドと該入力先スレッドの割当先CPUとが記述されている。
スレッド1とスレッド2とを有するプログラムの開発時に該プログラムの開発者がコンパイラを用いることにより出力データと該出力データの入力先スレッドとを特定することができる。また、入力先スレッドの割当先CPUについては、スレッド1とスレッド2との割当状態に応じて変化する。
スレッド1はCPU101に割り当てられているため、出力データの項目の情報が変数zであり、かつ入力先スレッドの識別情報の項目の情報がスレッド1の場合、割当先CPUの識別情報の項目の情報はCPU101である。
まず、OS(Operating System)191が(1)スレッド2をCPUに割り当てると、OS191が、出力データの項目の情報が変数zであり、かつ入力先スレッドの識別情報の項目の情報がスレッド2の場合の割当先CPUの識別情報の項目の情報をCPU102に更新する。
さらに、OS191が、(2)出力データの項目の情報が変数xであり、かつ入力先スレッドの識別情報の項目の情報がスレッド2の場合の割当先CPUの識別情報の項目の情報をCPU102に更新する。なお、ここでは、OS191がスレッド2をCPU102に割り当てることにより、該スレッド2の割当を検出することとする。
そして、OS191が、(3)変数xの書き込み要求を検出すると、OS191が、(4)変数xに基づいてテーブルから割当先CPUの識別情報の項目に保持されている情報を検索することにより、割当先CPUの識別情報を特定する。つぎに、OS191が、(5)特定した割当先CPUの識別情報がCPU102を示しているため、CPU102の分散キャッシュ112へ変数xを格納する。
したがって、マルチコアプロセッサのCPUのキャッシュのうち、対象データを入力として用いるスレッドが割り当てられているCPUのキャッシュにのみ対象データを保持することができる。すなわち、対象データの読み出しが不要なCPUのキャッシュに対象データが格納されないため、入力先スレッドが対象データを読み出す読み出し速度に影響を与えることなく、各キャッシュの領域を有効的に活用することができる。
また、上述したようにスレッドの割当についてはCPUの割当状態に応じて入力先スレッドの割り当てが決定するため、対象データが格納されるCPUのキャッシュも該入力先スレッドの割当状態に応じて変化する。
図2は、スレッドの割当例を示す説明図である。(a)割当例1では、図1で示した例の様に、スレッド1がCPU101に割り当てられ、スレッド2がCPU102に割り当てられる。(b)割当例2では、スレッド1とスレッド2とが共にCPU101に割り当てられる。
本実施の形態において割当例1では、分散キャッシュ111と分散キャッシュ112とのうち、変数xは分散キャッシュ112のみに格納され、変数zは分散キャッシュ111と分散キャッシュ112とに格納される。一方、本実施の形態において割当例2では、分散キャッシュ111と分散キャッシュ112とのうち、変数xは分散キャッシュ111のみに格納され、変数zも分散キャッシュ111のみに格納される。本実施の形態では、各出力データの入力先スレッドの割当先CPUを記憶および更新することにより、該出力データを格納するCPUの分散キャッシュを決定している。
つぎに、本実施の形態では、各出力データの入力先スレッドの割当先CPUについてMMU(Memory Management Unit)とスレッド管理テーブルを用いて管理する例を示す。
(マルチコアプロセッサシステム100のハードウェア)
図3は、マルチコアプロセッサシステム100のハードウェアの一例を示すブロック図である。図3において、マルチコアプロセッサシステム100は、たとえば、CPU101およびCPU102と、MMU141およびMMU142と、分散キャッシュ111および分散キャッシュ112と、共有メモリ104と、を有している。本実施の形態では、CPU101とCPU102とを併せてマルチコアプロセッサと称する。
また、図示していないがマルチコアプロセッサシステム100では、たとえば、ユーザや他の機器との入出力装置として、インターネットなどのネットワークと接続するI/F(Interface)と、ディスプレイと、キーボード109と、を備えている。
ここで、CPU101とMMU141とがI/F181を介して接続され、MMU141と分散キャッシュ111(具体的には、分散キャッシュコントローラ121)とがI/F171を介して接続されている。CPU102とMMU142とがI/F182を介して接続され、MMU142と分散キャッシュ112(具体的には、分散キャッシュコントローラ122)とがI/F172を介して接続されている。各分散キャッシュの分散キャッシュコントローラと共有メモリ104とがスヌープバス103を介して接続されている。
CPU101とCPU102とは、それぞれコアとレジスタとを有している。コアとは、具体的には、CPUの演算機能を実現する回路である。CPU101はマスタCPUであり、OS191を実行し、マルチコアプロセッサシステム100の全体の制御を司る。OS191は、ソフトウェアの各スレッドをどのCPUに割り当てるかを制御する機能を有し、CPU101に割り当てられたスレッドの切り替えを制御する機能を有している。CPU102はスレーブCPUであり、OS192を実行する。OS192はCPU102に割り当てられたスレッドの切り替えを制御する機能を有している。
MMU141とMMU142は、アクセス要求をそれぞれCPU101とCPU102から受け付けると、該アクセス要求に付随している論理アドレスから物理アドレスに変換テーブル400を用いて変換する機能を有している。MMU141とMMU142についてはそれぞれCPU101の内部とCPU102の内部に含まれていてもよい。さらに、マルチコアプロセッサシステム100ではMMU141とMMU142とをハードウェアとしているが、MMU141とMMU142とをソフトウェアとしてそれぞれOS191とOS192との機能の一部であってもよい。
(変換テーブル400の一例)
図4は、変換テーブル400の一例を示す説明図である。論理アドレスとはプログラムのコーディング上で定義されている仮想メモリ空間上のアドレスであり、物理アドレスとは共有メモリ上のアドレスである。変換テーブル400では、論理アドレスごとに該論理アドレスを共有メモリ上にマッピングさせることにより得られる物理アドレスを有している。変換テーブル400では、論理アドレスの項目401と、物理アドレスの項目402と領域情報の項目403とを有している。
各CPUから通知されるアクセス要求には論理アドレスが付随されているため、変換テーブル400内の論理アドレスの項目401に保持されている情報から該アクセス要求の論理アドレスを検索することにより、物理アドレスを特定することができる。また、領域情報の項目403には、各論理アドレスで示される仮想メモリ空間上に配置される対象データの入力先スレッドの割当先CPUを判別可能な情報が保持されている。領域情報の項目403は各CPUに対応するCPUフラグを有している。領域情報の項目403はCPU101に対応するCPU101フラグとCPU102に対応するCPU102フラグとを有している。
たとえば、領域情報の項目403のうち、CPU101フラグが1であり、CPU102フラグが0であれば、対象データの入力先スレッドの割当先CPUはCPU101である。また、たとえば、領域情報の項目403のうち、CPU101フラグが0であり、CPU102のフラグが1であれば、対象データの入力先スレッドの割当先CPUはCPU101である。
領域情報の項目403のうち、CPU101フラグおよびCPU102フラグについてはスレッドの割当状態に応じてOS191がどのフラグを立てるか(1に設定するか)を決定する。
図3に戻って、分散キャッシュ111は、分散キャッシュコントローラ121と分散キャッシュメモリ131とを有している。分散キャッシュコントローラ121が分散キャッシュメモリ131への書き込みや読み出しを制御する。分散キャッシュ112は、分散キャッシュコントローラ122と分散キャッシュメモリ132とを有している。分散キャッシュコントローラ122が分散キャッシュメモリ132への書き込みや読み出しを制御する。
分散キャッシュ111の分散キャッシュコントローラ121は、スヌープバス103へ物理アドレスやデータやコマンド情報をマスタI/F151を介して渡す。そして、分散キャッシュコントローラ121は、スヌープバス103から物理アドレスやデータやコマンド情報をスレーブI/F161を介して受け付ける。分散キャッシュ112の分散キャッシュコントローラ122は、スヌープバス103へ物理アドレスやデータやコマンド情報をマスタI/F152を介して渡す。分散キャッシュコントローラ121は、スヌープバス103から物理アドレスやデータやコマンド情報をスレーブI/F162を介して受け付ける。
(分散キャッシュ111の詳細例)
図5は、分散キャッシュ111の詳細例を示す説明図である。上述のように分散キャッシュ111では分散キャッシュコントローラ121と分散キャッシュメモリ131を有している。分散キャッシュメモリ131では、データごとに物理アドレスとSTATEとデータとが記憶されている。
分散キャッシュメモリ131では、物理アドレスとSTATEを併せてタグ情報と称し、タグ情報とデータとを併せてキャッシュラインと称する。分散キャッシュコントローラ121は、MMU141またはスヌープバス103からの対象データのアクセス要求に付随する物理アドレスに基づいて分散キャッシュメモリ131に対象データが記憶されているか否かを判断することができる。
ここで、STATEについて説明する。STATEは2ビットの情報であり、STATEの値によって各キャッシュラインのとりうる状態が決まる。該状態はスヌープ方式を実現するプロトコルによって異なるが、代表的な状態としては以下の4つの状態である。
・M(Modified)状態:キャッシュラインが当該キャッシュだけに存在し、変更されていることを示す状態
・E(Exclusive)状態:キャッシュラインが当該キャッシュだけに存在し、変更されていないことを示す状態
・S(Shared)状態:キャッシュラインが複数のキャッシュに存在することを示す状態
・I(Invalid)状態:キャッシュラインは無効であることを示す状態
分散キャッシュコントローラ121は該4つの状態に対応して動作する。分散キャッシュコントローラ121による動作については、図17および図18のフローチャートを用いて後述する。また、分散キャッシュ112については、分散キャッシュ111と同様の機能であるため、詳細な説明を省略する。
図3に戻って、スヌープバス103は、共有メモリ104と分散キャッシュとを接続し、スヌープ処理に対応するバスである。
(スヌープバス103の詳細例)
図6は、スヌープバス103の詳細例を示す説明図である。図6中の線は物理的な一本の信号線であり、黒丸は信号線同士の接続を表す。スヌープバス103は、アドレス信号線と、コマンド信号線と、データ信号線と、コントローラ601と、セレクト信号線と、を有している。スヌープバス103は、マスタI/F151およびマスタI/F152と、スレーブI/F161およびスレーブI/F162と、から信号を受ける。
マスタI/F151およびマスタI/F152は、たとえば、物理アドレスをアドレス信号線へ、読み出し要求であるか書き込み要求であるかを示すコマンド情報をコマンド信号線へ送出する。そして、送出された物理アドレスは、コントローラ601が受信する。
コントローラ601は、物理アドレスとあらかじめコントローラ601に登録されたマッピング情報に基づいて、対応するスレーブI/Fへのセレクト信号線にセレクト信号を出力する。セレクト信号を受け取ったスレーブI/FはマスタI/F151およびマスタI/F152からの物理アドレスとコマンド情報を受け取り、該スレーブI/Fはコマンド情報に応じてデータのやりとりを行う。
さらに、スヌープバス103には、たとえば、ブロードキャストとブロックとインバリデートとの3つの機能がある。ブロードキャストとは、マスタI/Fから、コマンド情報とデータ情報との組み合わせの要求を、あらかじめブロードキャスト先として設定されたすべてのスレーブI/Fに送出する機能である。ブロックとは、現在のバス接続を強制的に解除する機能である。インバリデートとは、各分散キャッシュメモリに対して対象物理アドレスに対応するキャッシュラインを無効化させる機能である。これらの機能を使用することで、スヌープバス103は、キャッシュコヒーレンシ機構として要求される機能を満たす。
図3に戻って、共有メモリ104は、CPU101とCPU102とに共有されるメモリである。共有メモリ104は、たとえば、ROM(Read Only Memory)と、RAM(Random Access Memory)と、フラッシュROMなどを有している。共有メモリ104は、たとえば、スレッド管理テーブル800と、OS191およびOS192のブートプログラムや後述する制御プログラムやアプリケーションプログラムと、依存関係に関するリスト群700と、を記憶している。
たとえば、ROMまたはフラッシュROMは該プログラムなどを記憶し、RAMはCPU101とCPU102とのワークエリアとして使用される。共有メモリ104に記憶されているOS191とOS192は、それぞれCPU101とCPU102とにロードされることで、コーディングされている処理を各CPUに実行させることとなる。
(依存関係に関するリスト群700の一例)
図7は、依存関係に関するリスト群700の一例を示す説明図である。依存関係に関するリスト群700では、スレッドごとに該スレッド内の出力データと該出力データの入力先スレッドに関する情報と、スレッドごとに該スレッド内の入力データと該入力データの出力元スレッドに関する情報とを有している。
スレッド1に関するリスト701は出力テーブル711と入力テーブル721とを有し、スレッド2に関するリスト702は出力テーブル712と入力テーブル722とを有している。出力テーブル711は、出力データの項目と入力先スレッドの項目とを有している。出力テーブル711では、出力データの項目に保持されているデータごとに該データの入力先スレッドが入力先スレッドの項目に保持されている。入力テーブル721では、入力データの項目と出力元スレッドの項目とを有している。入力テーブル721では、入力データの項目に保持されているデータごとに該データの出力元スレッドが出力元スレッドの項目に保持されている。
出力テーブル712は、出力データの項目と入力先スレッドの項目とを有している。出力テーブル712では、出力データの項目に保持されているデータごとに該データの入力先スレッドが入力先スレッドの項目に保持されている。入力テーブル722では、入力データの項目と出力元スレッドの項目とを有している。入力テーブル722では、入力データの項目に保持されているデータごとに該データの出力元スレッドが出力元スレッドの項目に保持されている。
各スレッドの依存関係に関するリストについては、たとえば、プログラムの設計者がコンパイラを用いて該プログラム内の各データを解析することにより作成することができる。
(スレッド管理テーブル800の一例)
図8は、スレッド管理テーブル800の一例を示す説明図である。スレッド管理テーブル800はスレッドごとに該スレッドの割当状態と該スレッドの実行状態とが記述されている。スレッド管理テーブル800はスレッドの識別情報の項目801と割当先CPUの識別情報の項目802と実行状態の項目803とを有している。
たとえば、OS191が、プログラムの起動指示を受け付けると、該プログラム内のすべてのスレッドの識別情報をスレッド管理テーブル800内のスレッドの識別情報の項目801に登録する。そして、たとえば、OS191がスレッドごとに該スレッドの割当先CPUを決定すると、OS191が該割当先CPUの識別情報をスレッド管理テーブル800内の割当先CPUの識別情報の項目802に登録する。割当先CPUの識別情報が「−」のスレッドは割当先CPUが決定していない状態を示す。
実行状態については、たとえば、実行中であるか、未割当(図中「−」で示す。)であるか、レディーキューに登録されている実行待機であるかを示す。たとえば、OS191やOS192はタスクスイッチを行うと、該タスクスイッチによって切り替えられたスレッドに関する実行状態の項目803の実行状態を書き換える。図8では、スレッド1およびスレッド2に関する割当先CPUの識別情報の項目802に保持されている割当先CPUの識別情報は「−」であり、実行状態の項目803に保持されている実行状態は「−」となっている。
また、スレッド管理テーブル800は共有メモリ104の他に各分散キャッシュメモリに記憶させ、いずれかの分散キャッシュメモリ内のスレッド管理テーブル800に変化があれば、スヌープバス103を介してスヌープ処理をさせてもよい。
図3に戻って、上述したディスプレイとネットワークなどに接続するI/Fとキーボードとについて説明する。ディスプレイは、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。該ディスプレイは、たとえば、TFT液晶ディスプレイなどを採用することができる。
該I/Fは、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワークに接続され、ネットワークを介して他の装置に接続される。該I/Fには、たとえばモデムやLANアダプタなどを採用することができる。キーボードは、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、キーボードは、タッチパネル式の入力パッドやテンキーなどであってもよい。
図9は、マルチコアプロセッサシステム100の機能ブロック図である。マルチコアプロセッサシステム100では、記憶部901と、更新部902と、検出部903と、特定部904と、格納部905と、判断部906と、消去部907と、を有している。
記憶部901は、たとえば、MMUが変換テーブル400を記憶し、共有メモリ104がスレッド管理テーブル800を記憶することにより実現される。更新部902は、たとえば、制御プログラム内にプログラミング言語等を用いて定義され、OS191内に該制御プログラムを組み込む。そして、CPU101が共有メモリ104内に記憶されているOS191をロードし、CPU101が該OS191内の制御プログラムにコーディングされている処理を実行することにより更新部902が実現される。
また、たとえば、検出部903と特定部904とをHDL記述によって機能定義し、該HDL記述を論理合成して論理回路等の素子を組み合わせることで、各MMU内に検出部903と特定部904とを実現することができる。また、たとえば、検出部903と特定部904とは共有メモリ104内に制御プログラムとして記憶される。そして、たとえば、CPU101やCPU102のようにプログラムを実行可能な機能を有するMMUが該制御プログラムをロードして該制御プログラムにコーディングされている処理を実行してもよい。格納部905と判断部906と消去部907とは、分散キャッシュ111や分散キャッシュ112により実現される。
記憶部901は、対象データの入力先として定義されている入力先スレッドごとに該入力先スレッドの割当先CPUの識別情報を記憶する。
更新部902は、入力先スレッドのマルチコアプロセッサへの割当が検出されると、記憶部901により記憶されたスレッドの割当先CPUの識別情報を更新する。
検出部903は、対象データの書き込み要求を検出する。
特定部904は、検出部903により書き込み要求が検出された対象データに基づいて記憶部901から、更新部902による更新後の識別情報を特定する。
格納部905は、マルチコアプロセッサのうち、特定部904により更新後の識別情報が特定された入力先スレッドの割当先CPUの分散キャッシュメモリへ対象データを格納する。
判断部906は、書き込み要求の要求元CPUが入力先スレッドの割当先CPUに含まれていない場合、要求元CPUの分散キャッシュメモリ内に対象データが格納されているか否かを対象データに含まれるアドレス情報に基づいて判断する。本実施の形態では、具体的には、たとえば、書き込み要求に物理アドレスが付随され、かつ分散キャッシュメモリ内の各キャッシュラインに物理アドレスが格納されている。たとえば、書き込み要求の物理アドレスとキャッシュラインの物理アドレスとの一致により対象データが格納されているか否かが判断される。
消去部907は、判断部906により要求元CPUの分散キャッシュメモリ内に対象データが格納されていると判断した場合、要求元CPUの分散キャッシュメモリ内の対象データを消去する。分散キャッシュメモリ内の対象データを消去するとは、具体的には、たとえば、対象データを無効化することである。
また、格納部905は、特定部904により更新後の識別情報が特定されなかった場合、書き込み要求の要求元CPUの分散キャッシュメモリへ対象データを格納する。特定部904により更新後の識別情報が特定されなかった場合とは、具体的には、たとえば、入力先スレッドが未割当の場合である。
以上を踏まえて、実施例を用いて詳細に説明する。
図10は、スレッド1の割当例を示す説明図である。まず、OS191が、スレッド1の割当指示を受け付けると、スレッド管理テーブル800を参照することにより各CPUの割当状態を確認し、CPU101とCPU102のいずれかのCPUにスレッド1を割り当てる。OS191は(1)スレッド1をCPU101に割り当てることにより、スレッド1のマルチコアプロセッサへの割当を検出する。
つぎに、OS191は、スレッド管理テーブル800内のスレッドの識別情報の項目801からスレッド1に一致する識別情報を検索する。OS191は、更新部902により、(2)割当先CPUの識別情報の項目802に保持されている割当先CPUの識別情報をCPU101に更新する。さらに、OS191は、実行状態の項目803に保持されている実行状態を実行中に更新する。
さらに、OS191が、出力テーブル711から出力データの項目に保持されているデータ順に入力先スレッドの項目に保持されている情報を検索する。変数xの場合、入力先スレッドの項目に保持されている情報はスレッド2である。OS191は、スレッド管理テーブル800内のスレッドの識別情報の項目801からスレッド2と一致する識別情報を検索し、該スレッド2に関する割当先CPUの識別情報の項目802に保持されている割当先CPUの識別情報を検索する。ここでは、スレッドの割当先CPUの識別情報は「−」が検索される。
変数xの入力先スレッドであるスレッド2が未割当であるため、OS191は、(3)変換テーブル400内のCPU101フラグを1に更新する。すなわち、対象データの入力先スレッドが未割当の場合、書き込み要求の要求元CPUのメモリに対象データを格納する。これにより、対象データを少なくとも一つのCPUの分散キャッシュに格納でき、かつ他のCPUの分散キャッシュの領域を有効的に活用することができる。
また、本実施の形態では、入力先スレッドの割当先CPUが不明な場合(入力先スレッドが未割当の場合)、変数xの出力元スレッドのCPU101フラグを立てるが、これに限らず、たとえば、すべてのCPUフラグを立ててもよい。または、たとえば、いずれのCPUフラグも立てずに変数xを共有メモリ104へ直接書き込むように設定してもよい。OS191が上述した変数xに関する処理と同様に変数zに関しても変換テーブル400内の変数zに関するレコードのCPU101フラグを1に更新する。
また、図10の例では、OS191はスレッドの割当が発生する都度、変換テーブル400内のCPUフラグを更新しているが、これに限らず、たとえば、OS191は書き込み要求が発生したときに変換テーブル400内のCPUフラグを更新してもよい。
図11は、スレッド2の割当例を示す説明図である。まず、OS191が、スレッド2の割当指示を受け付けると、スレッド管理テーブル800を参照することにより各スレッドの割当状態を確認し、CPU101とCPU102のいずれかのCPUにスレッド2を割り当てる。OS191は(1)スレッド2をCPUに割り当てることにより、スレッド2の割当を検出する。
つぎに、OS191は、スレッド管理テーブル800内のスレッドの識別情報の項目801からスレッド2と一致する識別情報を検索する。OS191が、(2)スレッドの識別情報の項目801の識別情報がスレッド2である割当先CPUの識別情報の項目802に保持されている割当先CPUの識別情報をCPU102に更新する。さらに、OS191が、(2)スレッドの識別情報の項目801の識別情報がスレッド2である実行状態の項目803に保持されている実行状態を実行中に更新する。
つづいて、OS191がスレッド2に関するリスト702から出力テーブル712を取得する。そして、OS191が、出力テーブル712から出力データの項目に保持されている出力データ順に入力先スレッドの項目に保持されている入力先スレッドの識別情報を検索する。ここで、スレッド2内の出力データである変数yと変数aとに関する変換テーブル400の更新処理は、図10で説明した変数xの更新処理と同一であるため、詳細な説明を省略する。
つぎに、OS191が、スレッド2に関するリスト702から入力テーブル722を取得する。そして、OS191が、入力テーブル722から入力データの項目に保持されている入力データ順に出力元スレッドの項目に保持されている出力元スレッドの識別情報を検索する。ここでは、スレッド2の入力データである変数xと変数zの出力元スレッドはスレッド1であるため、検索結果はスレッド1である。そして、OS191が、検索した出力元スレッドの出力テーブルを取得する。すなわち、スレッド1に関するリスト701から出力テーブル711が取得される。
OS191が、出力テーブル711から出力データの項目に保持されている出力データ順に入力先スレッドの項目に保持されている入力先スレッドの識別情報を検索する。ここで、スレッド1内の出力データである変数xと変数zとに関する変換テーブル400の更新処理は、図10で説明した変数xの更新処理と同一であるため、詳細な説明を省略する。これにより、(3)変換テーブル400内の変数xに関するレコードのCPUフラグが更新される。
図12は、変数xが格納される例を示す説明図である。つぎに、スレッド1内で変数xの書き込み要求が発生すると、OS191が、該書き込み要求を検出し、(1)論理アドレスと書き込みデータとが付随されている書き込み要求をMMU141へ通知する。MMU141は、検出部903により、受け付けた書き込み要求に付随されている論理アドレスと同一の変換テーブル400内の論理アドレスの項目401に保持されている論理アドレスを検索する。そして、MMU141は、該検索した論理アドレスに対応する物理アドレスの項目402に保持されている物理アドレスを検索することにより、(2)論理アドレスから物理アドレスに変換する。
そして、MMU141が、特定部904により、変換テーブル400内の検索した論理アドレスに対応するCPUフラグを読み出すことにより、(3)変数xの入力先スレッドの割当先CPUを特定する。検索した論理アドレスに対応するCPUフラグとは、検索した論理アドレスを含むレコード上にあるCPUフラグである。MMU141が、物理アドレスと書き込みデータと各CPUフラグを書き込み要求に付随させ、分散キャッシュコントローラ121へ該書き込み要求を通知する。
分散キャッシュコントローラ121は、該書き込み要求を受け付けると、各CPUフラグを参照し、1であるCPUフラグが示すCPUに対して書き込みデータを格納する。ここでは、CPUフラグが0であり、CPUフラグが1であるため、分散キャッシュコントローラ121は、格納部905により、(5)CPU101の分散キャッシュメモリ131へ書き込みデータを格納せず、(6)CPU102の分散キャッシュメモリ132へ書き込みデータを格納する。
(OS191による更新処理手順)
図13および図14は、OS191による更新処理手順を示すフローチャートである。まず、OS191が、スレッドの起動指示を受け付けたか否かを判断する(ステップS1301)。OS191が、スレッドの起動指示を受け付けていないと判断した場合(ステップS1301:No)、ステップS1301へ戻る。OS191が、スレッドの起動指示を受け付けたと判断した場合(ステップS1301:Yes)、起動指示を受け付けたスレッド(対象スレッド)の割当先CPUを決定する(ステップS1302)。
つぎに、OS191が、更新部902により、決定結果に基づきスレッド管理テーブル800を更新する(ステップS1303)。そして、OS191が、対象スレッドの出力データごとに該出力データの入力先スレッドが記述された出力テーブルを取得し(ステップS1304)、更新部902により、変換テーブル400の更新処理を実行する(ステップS1305)。
そして、OS191が、対象スレッドの入力データごとに該入力データの出力元スレッドが記述された入力テーブルを取得し(ステップS1306)、対象スレッド内の入力データのうち、未選択な入力データがあるか否かを判断する(ステップS1307)。OS191が、未選択な入力データがあると判断した場合(ステップS1307:Yes)、未選択な入力データから1つの入力データ(選択入力データ)を選択する(ステップS1308)。
そして、OS191が、選択入力データに関する領域情報内の対象スレッドの割当先CPUに対応するフラグを1に設定する(ステップS1309)。OS191が、選択入力データの出力元スレッドを入力テーブルに基づいて検索し(ステップS1310)、検索した出力元スレッド内の出力データごとに該出力データの入力先スレッドが記述された出力テーブルを取得する(ステップS1311)。そして、OS191が、更新部902により、変換テーブル400の更新処理を実行し(ステップS1312)、ステップS1307へ戻る。
また、ステップS1307において、OS191が、対象スレッド内の入力データのうち、未選択な入力データがないと判断した場合(ステップS1307:No)、ステップS1301へ戻る。
図15は、図13および図14で示した変換テーブルの更新処理(ステップS1305またはステップS1312)の詳細な説明を示すフローチャートである。まず、OS191が、取得した出力テーブル内の出力データのうち、未選択の出力データがあるか否かを判断する(ステップS1501)。そして、OS191が、取得した出力テーブル内の出力データのうち、未選択の出力データがあると判断した場合(ステップS1501:Yes)、未選択の出力データから1つの出力データ(選択出力データ)を選択する(ステップS1502)。
そして、OS191が、出力テーブルに基づき選択出力データの入力先スレッドを検索し(ステップS1503)、検索した入力先スレッドの割当先CPUをスレッド管理テーブル800に基づき特定する(ステップS1504)。つぎに、OS191が、選択出力データに関するCPUフラグのうち、特定した割当先CPUに対応するCPUフラグを1に設定する(ステップS1505)。
そして、OS191が、選択出力データに関するCPUフラグのうち、特定した割当先CPUを除くCPUに対応するCPUフラグを0に設定し(ステップS1506)、全入力先スレッドの割当先CPUを特定したか否かを判断する(ステップS1507)。OS191が、全入力先スレッドの割当先CPUを特定したと判断した場合(ステップS1507:Yes)、ステップS1501へ戻る。
OS191が、全入力先スレッドの割当先CPUを特定していないと判断した場合(ステップS1507:No)、選択出力データに関するCPUフラグのうち、対象スレッドの割当先CPUに対応するフラグを1に設定する(ステップS1508)。これにより、対象データを少なくとも一つのCPUの分散キャッシュに格納でき、かつ他のCPUの分散キャッシュの領域を有効的に活用することができる。そして、OS191が、ステップS1508のつぎにステップS1501へ戻る。
また、OS191が、取得した出力テーブル内の出力データのうち、未選択の出力データがないと判断した場合(ステップS1501:No)、ステップS1306(ステップS1307)へ移行する。
(各MMUによる特定処理手順)
図16は、各MMUによる特定処理手順を示すフローチャートである。まず、MMUが、検出部903により、対象データの書き込み要求を検出したか否かを判断する(ステップS1601)。MMUが、対象データの書き込み要求を検出していないと判断した場合(ステップS1601:No)、ステップS1601へ戻る。
MMUが、対象データの書き込み要求を検出したと判断した場合(ステップS1601:Yes)、特定部904により、検出した書き込み要求に付随する論理アドレスに基づいて変換テーブル400から対象データに関するレコードを検索する(ステップS1602)。そして、MMUが、論理アドレスに変わって検索したレコード内の物理アドレスを書き込み要求に関連付ける(ステップS1603)。
つぎに、MMUが、特定部904により、検索したレコードからCPUフラグを書き込み要求に関連付けて(ステップS1604)、分散キャッシュコントローラへ書き込み要求を通知し(ステップS1605)、ステップS1601へ戻る。
(各分散キャッシュコントローラによる格納処理手順)
図17は、分散キャッシュコントローラによる格納処理手順(スヌープバス103からの書き込み要求)を示すフローチャートである。まず、分散キャッシュコントローラが、スヌープバス103からの書き込み要求を受け付けたか否かを判断する(ステップS1701)。分散キャッシュコントローラが、スヌープバス103からの書き込み要求を受け付けていないと判断した場合(ステップS1701:No)、ステップS1701へ戻る。
一方、分散キャッシュコントローラが、スヌープバス103からの書き込み要求を受け付けたと判断した場合(ステップS1701:Yes)、ステップS1702へ移行する。ステップS1702において、分散キャッシュコントローラが、対象キャッシュラインが該分散キャッシュコントローラに対応する分散キャッシュメモリ上にあるか否かを判断する(ステップS1702)。分散キャッシュコントローラが、対象キャッシュラインが該分散キャッシュコントローラに対応する分散キャッシュメモリ上にないと判断した場合(ステップS1702:No)、出力先CPUが1つだけか否かを判断する(ステップS1703)。
分散キャッシュコントローラが、出力先CPUが1つだけであると判断した場合(ステップS1703:Yes)、M状態で対象キャッシュラインをフェッチする(ステップS1704)。M状態で対象キャッシュラインをフェッチするとはタグ情報のSTATEをM状態に設定してフェッチすることを示している。そして、分散キャッシュコントローラが、出力先CPUが1つだけでないと判断した場合(ステップS1703:No)、S状態で対象キャッシュラインをフェッチする(ステップS1705)。S状態で対象キャッシュラインをフェッチするとはタグ情報のSTATEをS状態に設定してフェッチすることを示している。
ステップS1704またはステップS1705のつぎに、分散キャッシュコントローラが、該分散キャッシュコントローラに対応する分散キャッシュメモリ内の対象キャッシュライン上のデータを更新し(ステップS1706)、ステップS1701へ戻る。また、分散キャッシュコントローラが、対象キャッシュラインが該分散キャッシュコントローラに対応する分散キャッシュメモリ上にあると判断した場合(ステップS1702:Yes)、ステップS1706へ移行する。
図18は、分散キャッシュコントローラによる格納処理手順(MMUからの書き込み要求)を示すフローチャートである。まず、分散キャッシュコントローラが、MMUからの書き込み要求を受け付けたか否かを判断する(ステップS1801)。分散キャッシュコントローラが、MMUからの書き込み要求を受け付けていないと判断した場合(ステップS1801:No)、ステップS1801へ戻る。
一方、分散キャッシュコントローラが、MMUからの書き込み要求を受け付けたと判断した場合(ステップS1801:Yes)、書き込み要求にCPUフラグが付随されているか否かを判断する(ステップS1802)。分散キャッシュコントローラが、書き込み要求にCPUフラグが付随されていないと判断した場合(ステップS1802:No)、通常のスヌープ対応キャッシュコントローラとして動作し(ステップS1803)、ステップS1801へ戻る。
通常のスヌープ対応キャッシュコントローラとしての動作とは、対象キャッシュラインが分散キャッシュメモリ上に格納されているか否かをタグ情報に基づいて判断し、格納されていれば、対象キャッシュラインを更新する。一方、対象キャッシュラインが分散キャッシュメモリ上に格納されていない場合、分散キャッシュメモリ上に対象キャッシュラインをフェッチする。そして、すべてのCPUの分散キャッシュコントローラへ対象キャッシュラインの格納を通知する。
ステップS1802において、分散キャッシュコントローラが、書き込み要求にCPUフラグが付随されていると判断した場合(ステップS1802:Yes)、判断部906により、書き込み要求の要求元CPUに対応するCPUフラグが1か否かを判断する(ステップS1804)。分散キャッシュコントローラが、書き込み要求の要求元CPUに対応するCPUフラグが1であると判断した場合(ステップS1804:Yes)、対象キャッシュラインが分散キャッシュメモリ上にあるか否かを判断する(ステップS1805)。
分散キャッシュコントローラが、対象キャッシュラインが分散キャッシュメモリ上にないと判断した場合(ステップS1805:No)、出力先CPUが1つであるか否かを判断する(ステップS1806)。分散キャッシュコントローラが、出力先CPUが1つであると判断した場合(ステップS1806:Yes)、M状態で対象キャッシュラインをフェッチする(ステップS1807)。
分散キャッシュコントローラが、出力先CPUが1つでないと判断した場合(ステップS1806:No)、S状態で対象キャッシュラインをフェッチする(ステップS1808)。ステップS1807またはステップS1808のつぎに、分散キャッシュコントローラが、分散キャッシュメモリ内の対象キャッシュライン上のデータを更新する(ステップS1809)。
また、ステップS1805において、分散キャッシュコントローラが、対象キャッシュラインが分散キャッシュメモリ上にあると判断した場合(ステップS1805:Yes)、ステップS1809へ移行する。
ステップS1804において、分散キャッシュコントローラが、書き込み要求の要求元CPUに対応するCPUフラグが1でないと判断した場合(ステップS1804:No)、対象キャッシュラインが分散キャッシュメモリ上にあるか否かを判断する(ステップS1810)。
まず、分散キャッシュコントローラが、対象キャッシュラインが分散キャッシュメモリ上にあると判断した場合(ステップS1810:Yes)、対象キャッシュラインのデータを共有メモリ104に書き戻す(ステップS1811)。そして、分散キャッシュコントローラが、消去部907により、対象キャッシュラインを無効化する(ステップS1812)。対象キャッシュラインを無効化するとは、対象キャッシュラインのSTATEをI状態に設定することである。STATEをI状態に設定することは、該対象キャッシュラインを消去することを示す。
ステップS1810において、分散キャッシュコントローラが、対象キャッシュラインが分散キャッシュメモリ上にないと判断した場合(ステップS1810:No)、ステップS1813へ移行する。ステップS1809、ステップS1810:Noの場合、またはステップS1812のつぎに、CPUフラグで指定された分散キャッシュへ書き込み要求を通知し(ステップS1813)、ステップS1801へ戻る。
(アプリケーションの一例)
ここで、具体的なアプリケーションとしてマルチチャンネルオーディオデコーダを例に挙げる。マルチチャンネルオーディオデコーダでは、音声データをデコードして出力する処理である。
まず、圧縮された音声データが1単位分デコードされる。そして、デコード結果は1から7チャンネルまではそれぞれ4KB(Byte)サイズである。デコード結果はチャンネルごとにフィルタ処理や加工・合成(PCM(Pulse Code Modulation))処理が行われる。
フィルタ処理やPCM処理が行われた音声データは全チャンネル分集約され、集約後の音声データは機器に搭載された再生装置(スピーカー)のチャンネル数に合わせてダウンミックス処理が行われる。そして、ダウンミックス処理後の音声データは該再生装置へ出力される。1単位の音声データは数十ms程度なので、マルチチャンネルオーディオデコーダでは、再生装置へ出力中に次の音声データのデコード処理やフィルタ処理、PCM処理を行うことを繰り返して長時間の音声データを再生している。
フィルタ処理やPCM処理はチャンネルごとに実行することができるため、多チャンネルの音声データでは各チャンネルをマルチコアプロセッサで並列にフィルタ処理およびPCM処理を実行することが可能である。
図19は、アプリケーションの一例を示す説明図である。ここでは、図19のようにデコード処理と、各チャンネルのフィルタ処理およびPCM処理と、ダウンミックスおよび出力の処理とのスレッドに分けて実装する例を挙げる。デコード処理を行うスレッドがスレッドDECであり、フィルタ処理およびPCM処理を行うスレッドがスレッドCH1〜スレッドCH7およびスレッドCH7.1であり、フィルタ処理およびPCM処理を行うスレッドがスレッドDMである。
まず、スレッドDECでは全チャネル分のデコードした音声データ(デコード結果)を出力する。そして、スレッドCH1〜スレッドCH7およびスレッドCH7.1はそれぞれ1チャンネル分のデコードされた音声データ(デコード結果)を入力として1チャンネル分の加工した音声データ(PCM結果)をそれぞれが出力する。そして、スレッドDMでは全チャネル分の加工された音声データを入力とする。
図20は、デコード結果の格納例を示す説明図である。図20では、スレッドCH1とスレッドCH2とがCPU2001に割り当てられ、スレッドCH3とスレッドCH4とがCPU2002に割り当てられる。スレッドCH5とスレッドCH6とがCPU2003に割り当てられ、スレッドCH7と、スレッドCH7.1と、スレッドDECと、スレッドDMと、がCPU2004に割り当てられる。ここでは、スレッドDECのみが実行中(図中実線のスレッド)であり、他のスレッドはすべて実行待機中(図中破線のスレッド)である。
図20に示すマルチコアプロセッサシステムが記憶部901〜格納部905を有していると、スレッドDECのデコード結果のうち、スレッドCH1とスレッドCH2への入力であるデコード結果はCPU2001の分散キャッシュ2011のみに出力される。そして、スレッドDECのデコード結果のうち、スレッドCH3とスレッドCH4への入力であるデコード結果はCPU2002の分散キャッシュ2012のみに出力される。
さらに、スレッドDECのデコード結果のうち、スレッドCH5とスレッドCH6への入力であるデコード結果はCPU2003の分散キャッシュ2013のみに出力される。スレッドDECのデコード結果のうち、スレッドCH7とスレッドCH7.1への入力であるデコード結果はCPU2004の分散キャッシュ2014のみに格納される。
図20では、スレッドDECから分散キャッシュ2013と分散キャッシュ2012と分散キャッシュ2011内のデコード結果へ矢印が出ている。実際には、CPU2004のMMUと、分散キャッシュ2014内の分散キャッシュコントローラと、スヌープバスを介して各分散キャッシュへデコード結果が格納されている。
図21は、PCM結果の格納例を示す説明図である。スレッドCH1〜スレッドCH7およびスレッドCH7.1が実行中(図中実線のスレッド)であり、スレッドDECとスレッドDMとは実行待機中(図中破線のスレッド)である。図21で示すマルチコアプロセッサシステムが記憶部901〜格納部905を有していると、各PCMの結果はスレッドDMで用いられるため、各PCMの結果はスレッドDMが割り当てられているCPUの分散キャッシュにのみ格納される。
図21では、各チャンネルのスレッドから分散キャッシュ2014内の各PCMの結果へ矢印が出ている。実際には、各チャンネルのスレッドが割り当てられたCPUのMMUと、該CPUの分散キャッシュ内の分散キャッシュコントローラと、スヌープバスを介して分散キャッシュ2014へ各PCMの結果が格納される。
以上説明したように、マルチプロセッサシステム、制御プログラム、および制御方法によれば、マルチコアプロセッサのうち、対象データを入力として用いる入力先スレッドの割当先CPUの分散キャッシュにのみ対象データを格納する。これにより、対象データの読み出しが不要なCPUの分散キャッシュに対象データが格納されない。したがって、入力先スレッドが対象データを読み出す読み出し速度に影響を与えることなく、各分散キャッシュの領域を有効的に活用することができる。
また、対象データの書き込み要求の要求元CPUが入力先スレッドの割当先CPUに含まれていない場合、該要求元CPUの分散キャッシュにすでに対象データが格納されている場合、該要求元CPUの分散キャッシュにすでに対象データを消去する。これにより、読み出されないデータの領域を消去することができ、対象データを読み出さないCPUの分散キャッシュの領域を有効的に活用することができる。
また、対象データの入力先スレッドがマルチコアプロセッサへ未割当の場合、書き込み要求の要求元CPUのメモリに対象データを格納する。これにより、対象データを少なくとも一つのCPUの分散キャッシュに格納でき、かつ他のCPUの分散キャッシュの領域を有効的に活用することができる。