(57)【要約】      （修正有）【課題】複数のプロセッサによるパイプライン構成において、メモリアクセスの競合によるレイテンシ増加を抑え、プリフェッチによる処理高速化が可能なデータ処理装置及び画像処理装置を提供する。【解決手段】画像処理パイプラインの各ステージを構成するプロセッサのうち、ボトルネック判定部によりパイプラインのボトルネックと判定されたプロセッサを優先してプリフェッチを行うように制御する。また、ボトルネックでないと判定された場合はプリフェッチ機能を無効化する。【選択図】図６
2019139406.tif 000002
【特許請求の範囲】
【請求項１】
データ処理をパイプライン処理にて行う複数のプロセッサと、メモリと、前記複数のプロセッサと前記メモリとを接続するバスとを有するデータ処理装置であって、
前記複数のプロセッサのうち前記パイプラインのボトルネックとなるプロセッサを判定する第１判定手段と、を有し、
前記各プロセッサは、前記メモリからデータを読み出す方法の一つとして将来必要となるデータを予測して事前にデータを読み出しておくプリフェッチを行うか否かを選択可能であり、
前記複数のプロセッサのうち、前記第１判定手段によりボトルネックと判定されたプロセッサを優先して前記プリフェッチを行うように制御することを特徴とするデータ処理装置。
【請求項２】
前記バスの混雑度を測定して混雑度が高いか否かを判定する第２判定手段を有し、
前記第２判定手段により混雑度が高いと判定された場合、前記複数のプロセッサのうち、前記第１判定手段によりボトルネックと判定されなかったプロセッサは、前記プリフェッチを行わないよう制御することを特徴とする請求項１に記載のデータ処理装置。
【請求項３】
前記第２判定手段及び前記第１判定手段は、前記パイプラインにて行うデータ処理の途中に判定を変更することが可能であり、
前記各プロセッサは、前記プリフェッチを行うか否かを前記データ処理の途中に変更することを可能に制御することを特徴とする請求項２に記載のデータ処理装置。
【請求項４】
前記第１判定手段は、前記各プロセッサの間のデータ転送を監視してデータ転送の待ち時間を測定し、該待ち時間の少ないプロセッサをボトルネックと判定することを特徴とする請求項１〜３のいずれか１項に記載のデータ処理装置。
【請求項５】
前記データ処理は、画像処理であり、
前記データ処理装置は画像処理装置であることを特徴とする請求項１〜４のいずれか１項に記載のデータ処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ処理装置に関するものである。
【背景技術】
【０００２】
画像処理装置の中には、プロセッサを用い、ソフトウェアによる画像処理を行うものがある。プロセッサはメモリから命令やデータを読み込むことで動作するが、プロセッサがメモリから命令やデータを読み込むために必要な時間（レイテンシ）が長いと、実際に命令やデータを使用するまでに読み込みが終了しない場合が発生する。その場合、命令やデータの読み込みが終了するまでプロセッサは待つ必要があり、その分画像処理にかかる時間も長くなってしまう。キャッシュメモリの仕組みを持つプロセッサであっても同様で、キャッシュミスが発生したときにプロセッサはプロセッサの近くに配置したキャッシュメモリではなくて、遠くのメモリからの読み込みを行い、それが終了するまで待つ必要がある。
【０００３】
そこで、プリフェッチと呼ばれる先読みの手法で実質的なレイテンシを短くして、プロセッサの待ち時間を短縮する技術がある（例えば特許文献１）。プリフェッチは、プロセッサが実際に読み込み命令を実行する前に、先行してメモリに読み込み要求をしておく方法である。プリフェッチにより読み出した命令やデータを、プロセッサの近くに配置したキャッシュメモリあるいはプリフェッチ専用のメモリに格納しておくことで、プロセッサが実際の読み込み命令を実行したときには短いレイテンシで読み込みが行える。なお、プロセッサの命令で明示的にメモリからの読み出しを実行しておくことで、その後のキャッシュミスを減らすソフトウェアの先読みアルゴリズムも一種のプリフェッチである。しかし、ここでのプリフェッチとはプロセッサの命令ではなく、プロセッサの周辺回路が次に必要なデータを予測して自動的にプリフェッチ読み出しを実行するハードウェア機能のことである。ハードウェア機能によるプリフェッチでは、ソフトウェアが介在するのはプリフェッチ機能の有効・無効を切り替える等の設定のみで、プロセッサのメモリアクセスに連動したプリフェッチの動作はハードウェアが自動的に行う。
【０００４】
一方、画像処理の単位時間内の処理能力を増強するために、画像処理を複数の処理に分割して、各処理を異なるモジュールで並列に実行するパイプライン処理の構成にする手法がある。分割後の複数の画像処理が、パイプライン処理の複数のステージに相当する。各ステージの処理を行うモジュールはプロセッサで構成することも可能であり、複数のプロセッサによるパイプライン処理を行うことで高速処理を実現できる（特許文献２）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特許第３２５４０１９号公報
【特許文献２】特許第４５２２２１６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、複数のプロセッサによるパイプライン構成でプリフェッチ機能を使用した場合、バスが混雑している状態だと、プロセッサ数が多いほどプリフェッチによる処理高速化の効果が得にくくなるという課題がある。その原因は、メモリアクセスの競合が多く発生してバスの混雑が増し、プリフェッチによるメモリアクセスのレイテンシが短縮しにくくなるからで、その仕組みは以下に示すものである。
【０００７】
まず、プロセッサがプリフェッチ機能を使用すると、プリフェッチの予測が外れた場合に改めて正しいデータを読み出す必要がありメモリアクセス数が増加する。しかし、複数のプロセッサの構成では、それによりメモリアクセスの競合が発生する。そして、メモリアクセスの競合が発生すると、片方が待つ必要があるため、全体的にメモリアクセスのレイテンシが長くなる。よって、その分プリフェッチによるメモリアクセスのレイテンシ短縮の効果が薄れてしまう。
【０００８】
さらに、プロセッサ数が多いほど、また、バスが混雑しているほど、競合が増加してメモリアクセスのレイテンシが長くなる。そのため、プリフェッチによるレイテンシ短縮の効果に比べて、競合によるレイテンシ増加の方が処理速度に大きな影響を持つようになってきてしまう。
【０００９】
本発明は、上記の問題点を解決するためになされたものである。本発明は、複数のプロセッサによるパイプライン構成におけるメモリアクセスの競合によるレイテンシ増加を抑え、プリフェッチによる処理高速化の効果を得ることを可能にする仕組みを提供することである。
【課題を解決するための手段】
【００１０】
本発明は、データ処理をパイプライン処理にて行う複数のプロセッサと、メモリと、前記複数のプロセッサと前記メモリとを接続するバスとを有するデータ処理装置であって、前記複数のプロセッサのうち前記パイプラインのボトルネックとなるプロセッサを判定する第１判定手段と、を有し、前記各プロセッサは、前記メモリからデータを読み出す方法の一つとして将来必要となるデータを予測して事前にデータを読み出しておくプリフェッチを行うか否かを選択でき、前記複数のプロセッサのうち、前記第１判定手段によりボトルネックと判定されたプロセッサを優先して前記プリフェッチを行うように制御することを特徴とする。
【発明の効果】
【００１１】
本発明によれば、複数のプロセッサによるパイプライン構成におけるメモリアクセスの競合によるレイテンシ増加を抑え、プリフェッチによる処理高速化の効果を得ることができる。
【図面の簡単な説明】
【００１２】
【図１】本実施例の画像処理装置の構成を例示するブロック図
【図２】本実施例の画像処理装置の停止時間モニタの内部構成を例示するブロック図
【図３】本実施例の画像処理装置の画像処理とデータの流れを例示する模式図
【図４】全てのCPUのプリフェッチ機能を無効にして画像処理を実行した場合のタイミングチャート
【図５】図４の場合の停止時間モニタ内部の動作を示すタイミングチャート
【図６】各CPUが実行する処理を例示するフローチャート
【図７】ボトルネックであるCPUのプリフェッチ機能だけ有効にして画像処理を実行した場合のタイミングチャート
【図８】全てのCPUのプリフェッチ機能を有効にして画像処理を実行した場合（従来の動作）のタイミングチャート
【発明を実施するための形態】
【００１３】
以下、本発明を実施するための形態について図面を用いて説明する。
図１は、本実施形態の画像処理装置1の構成の一例を示すブロック図である。
画像処理装置1は、例えば１つのLSI（マルチプロセッサLSI）であり、FPGA（Field Programmable Gate Array）等で実現されるものとするが、ASIC等であっても、他のデバイスで実現される構成でもよい。
【００１４】
画像処理装置1において、CPU101、102、103及び104は、メモリ105に記憶されたプログラムを、バス106を介して読み出して、そのプログラムに従って動作するプロセッサである。各CPUはデータ出力ポートを持ち、接続先に対してデータ書き出し要求を表すVALID信号を「HIGH」出力してデータの書き出しを行う。また、CPU101以外のCPUはデータ入力ポートを持ち、接続先に対してデータ読み込み要求を、BUSY信号を「LOW」出力することで表して、データの読み込みを行う。図中の太い矢印はデータの転送される方向を示し、細い矢印はデータ転送の制御信号を示している。ここで、データ転送の制御信号とは、前述のVALID信号とBUSY信号である。
【００１５】
また、各CPUは、プリフェッチ機能を持つ。プリフェッチ機能とは、プロセッサがメモリからデータを読み出す方法の一つとして将来必要となるデータを予測して事前にデータを読み出しておく機能である。本実施例では、プリフェッチ機能は、プログラム中に記述されたメモリ読み出し命令の実行直後に、自動的に次のアドレスに対するメモリ読み出しを実行してキャッシュメモリに格納しておくプリフェッチ動作を行う機能とする。ここで、プリフェッチ機能の次のアドレスとは、次に読み出されるアドレスを予測して決定したアドレスのことであるが、本実施例においては説明を簡単にするため、直前に読み出したアドレスの値に「1」を加算したアドレスを表すものとして説明する。
【００１６】
各CPUがプリフェッチ動作を行って次のアドレスのデータがキャッシュメモリに格納された状態で、CPUがそのアドレスのメモリ読み出し命令を実行すると、新たにメモリ読み出しは行われず、CPUはすぐに次の命令に進むことができる。一方、各CPUがプリフェッチ動作を行って次のアドレスのデータがキャッシュメモリに格納された状態で、CPUが違うアドレスのメモリ読み出し命令を実行すると、通常通りメモリ読み出しが行われ、CPUはその完了後に次の命令に進むことができる。また、各CPUは、プログラム中で所定の命令を実行することで、プリフェッチ機能の有効と無効を切り替えることができる。すなわち、各CPUは、プリフェッチを行うか否かを選択可能に構成されている。
【００１７】
メモリ105は、画像処理装置1の主記憶装置であり、CPUのプログラムを記憶する他にCPUのワークメモリとして変数やスタック領域として使用される。またメモリ105は、画像処理装置1が使用する入力画像データを格納する。
【００１８】
バス106は、各CPUがメモリ105にアクセスするための共有バスである。バス106は、一度に一つのCPUだけがアクセスできるため、同時に二つ以上のCPUがアクセス要求を出した場合、既定の方式によって決まる順番に従って調停を行ってアクセス要求を許可することでメモリアクセスの順番を制御する。既定の方式については後述する。
【００１９】
バスモニタ107は、バス106を介した各CPUのメモリアクセスを監視するものであり、バス106の混雑度を測定して混雑度（例えば混雑度が高いか否か）を判定し、その結果を出力する。バスモニタ107は、バス106がメモリアクセスに使用されたか否かの情報を現在から一定期間分の過去にさかのぼって常に保持し、バス106がメモリアクセスに使用されている時間と使用されていない時間との比率でバス106の混雑度を判定する。バスモニタ107は、初期状態では、現在を含めた過去の時間「25」個分の情報を保持し、その期間の中でバス106がメモリアクセスに使用されている時間が半分以上であるときに混雑と判定する。バスモニタ107は、常に監視しているバス上のメモリアクセスが所定のアドレスへの値の書き込みだった場合に、バスモニタ107が混雑と判定する比率と、メモリアクセスに使用されたか否かの情報を保持する期間を、その書き込み値で変更する機能を持つ。バスモニタ107は、混雑と判定した場合に出力値を「HIGH」にし、混雑していないと判定した場合に出力値を「LOW」にする。バスモニタ107の出力は各CPUに接続されており、各CPUは実行プログラム中でバスモニタ107の出力するバス106の混雑度判定結果を取得することができる。
【００２０】
停止時間モニタ108は、各CPUのデータ出力ポートのデータ出力を監視するモニタであり、データ出力とデータ入力のタイミングのずれによる各CPUの停止時間を数えて、最も停止時間の少ないCPUをボトルネックと判定し、その結果を出力する。ここで、ボトルネックとは、パイプライン処理の複数のステージ中でもっとも時間のかかるステージのことである。ボトルネックではないステージがどんなに高速に処理を行おうとしても、ボトルネックのステージとのデータ入出力で待たされることになるので、パイプライン処理全体の処理速度はボトルネックとなるステージの処理速度に律速される。逆に、ボトルネックのステージを高速化することで、パイプライン処理全体の処理速度を高速化することができる。図１の例では、パイプライン全体とは4個のCPUによる画像処理装置全体を表し、4個のCPUがパイプラインの4個のステージである。すなわち4個のCPU（101、102、103及び104）は、パイプラインを構成するプロセッサである。そのため、ボトルネックのステージとは、ボトルネックのCPUと言い換えることもできる。
【００２１】
ここで、二つのCPU間のデータの受け渡しの開始条件は、データ出力側のCPUの処理が完了してデータ出力が開始されることと、データ入力側のCPUの処理が完了して次のデータ入力が開始されること、の両方である。データ出力とデータ入力で開始されたのが片方だけの場合は、両方が開始されるまでの間ずっと相手を待たせることになる。
【００２２】
したがって、ボトルネックのCPUは、最も処理時間のかかるCPUのことであるが、データの入出力に着目すると、処理が完了しないためにデータの入出力をなかなか開始できず他のCPUを待たせる時間がもっとも多いCPUのことである。または、処理が完了してすぐにデータの入出力ができたCPUは、処理が完了するまで他のCPUを待たせていたことになるため、ボトルネックのCPUは、他のCPUによって待たされる時間のもっとも少ないCPUのことである。したがって、前述の通り、停止時間モニタ108は、最も停止時間の少ないCPUをボトルネックと判定し、その結果を出力する。停止時間モニタ108の出力は各CPUに対して個別に接続されており、各CPUは実行プログラム中で停止時間モニタ108の出力するボトルネック判定結果を取得することができる。
【００２３】
図２は、画像処理装置1の停止時間モニタ108の内部構造の一例を示すブロック図である。
出力停止カウンタ1081、1083、1085及び1087は、それぞれ、CPU101、102、103及び104のデータ出力に対応したカウンタで、VALID信号とBUSY信号が両方とも「HIGH」になった回数をカウントする。データ出力をするCPUは、一旦VALID信号を「HIGH」にしたら、BUSY信号が「LOW」になるまでデータ出力を保留して次の命令を実行せずに停止して待機する。このため、出力停止カウンタのカウント値は、各CPUがデータ出力時に停止した時間に相当する。出力停止カウンタ1081、1083、1085及び1087は、一定期間カウント動作を行った後、カウント値をボトルネック判定部1088に対して出力し、カウント値を「0」にリセットしてまたカウント動作を開始する。出力停止カウンタ1081、1083、1085及び1087は、次の一定期間後に次の新しいカウント値を出力するまでの間、出力したカウント値を出力し続ける。
【００２４】
入力停止カウンタ1082、1084及び1086は、それぞれ、CPU102、103及び104のデータ入力に対応したカウンタで、VALID信号とBUSY信号が両方とも「LOW」になった回数をカウントする。データ入力をするCPUは、一旦BUSY信号を「LOW」にしたら、VALID信号が「HIGH」になるまでデータ入力を保留して次の命令を実行せずに停止して待機する。このため、入力停止カウンタのカウント値は、各CPUがデータ入力時に停止した時間に相当する。入力停止カウンタ1082、1084及び1086は、一定期間カウント動作を行った後、カウント値をボトルネック判定部1088に対して出力し、カウント値を「0」にリセットしてまたカウント動作を開始する。入力停止カウンタ1082、1084及び1086は、次の一定期間後に次の新しいカウント値を出力するまでの間、出力したカウント値を出力し続ける。
【００２５】
ボトルネック判定部1088は、出力停止カウンタ1081、1083、1085及び1087と、入力停止カウンタ1082、1084及び1086と接続されており、それらが出力するカウント値を参照してボトルネックの判定を行う。ボトルネック判定部1088は、CPU101、102、103及び104のそれぞれに対して、ボトルネックの判定結果を出力する。ボトルネック判定部1088の出力は、そのまま停止時間モニタ108の出力となり、前述の通り、各CPUは実行プログラム中で停止時間モニタ108の出力するボトルネック判定結果を取得することができる。
【００２６】
ボトルネック判定部1088は、CPU101については出力停止カウンタのカウント値を、CPU102、103及び104については、出力停止カウンタのカウント値と入力停止カウンタのカウント値の合計値を使い、ボトルネック判定を行う。具体的には、カウント値のもっとも少ないCPUをボトルネックと判定し、CPUそれぞれに対してボトルネック判定結果を出力する。同一のもっとも少ないカウント値を持つCPUが複数ある場合は、その複数のCPUすべてをボトルネックと判定する。なお、前述の通り、各出力停止カウンタおよび各入力停止カウンタが出力するカウント値は一定期間ごとに更新されるため、ボトルネックの判定も一定期間ごとに更新する。
【００２７】
図３は、画像処理装置1の画像処理の処理とデータの流れの一例を示す模式図である。
画像処理は、処理A、処理B、処理C、処理D及び処理Eを順番に行うことで出力画像データを得るものである。また、処理B、処理C及び処理Eは、前の処理結果に加えて、それぞれ、データB、データC及びデータEを使う。
【００２８】
処理AはCPU101が実行し、処理BはCPU102が実行し、処理C及び処理DはCPU103が実行し、処理EはCPU104が実行する。データA、データB、データC及びデータEは、あらかじめメモリ105に格納してあり、各CPUは前段のCPUの処理結果を受信する直前にメモリ105から読み出しを行う。
【００２９】
ここで、CPU103は処理Cと処理Dの二つの処理を実行するため、他のCPUよりも処理時間が多く必要である。なお、各CPUが実行する処理の数、あるいは、処理に必要な時間は、本来は処理するデータに依存して変わるものであるが、本実施例においては簡単化のため、処理の数を固定とし、処理に必要な時間は処理の数に応じて固定として説明する。
【００３０】
また、この画像処理は小さな固定サイズ画像に対する処理であり、大きな画像の処理は、あらかじめ複数の小さな固定サイズ画像に分割しておき、それらの小さな固定サイズ画像に対する画像処理を複数回実行することで実現する。本実施例においては、大きな画像を6個に分割して、6回の画像処理を連続して実行する場合を例とする。つまり、本実施例では、データA、データB、データC及びデータEが、それぞれ6個ずつメモリ105上に準備された状態で、画像処理装置1が画像処理を開始し、6回の連続した画像処理を実行し、出力画像データを6回出力する場合を示す。
【００３１】
図４は、画像処理装置1において、全てのCPUのプリフェッチ機能を無効にして画像処理を実行した場合のCPU101〜104、バス106、メモリ105及びバスモニタ107の動作の一例を示すタイミングチャートである。なお、画像処理装置1は、バス106の混雑情報とCPUのボトルネック情報がない最初の画像処理実行時には、本図で示すように全てのCPUのプリフェッチ機能を無効にして画像処理を実行する。プリフェッチ機能の有効と無効の切り替えに関して詳細は後述する。
【００３２】
図４（Ａ）は、画像処理装置1において、全てのCPUのプリフェッチ機能を無効にして画像処理を実行した場合のCPU101〜104の動作を示すタイミングチャートである。本図は、CPUのメモリアクセス、データ入力、データ処理及びデータ出力の流れを模式的に説明するためのものである。そのため、画像処理動作自体ではなく、処理内容の設定等に必要なメモリアクセスや、プログラムをメモリ105上から読み込むため等のCPUが動作するために必要となるメモリアクセスについては記載を省略してある。以下、時間「1」から、CPU101、CPU102、CPU103及びCPU104の動作を一つずつ順番に説明する。
【００３３】
CPU101は時間「1」において、画像処理動作を開始すると同時にメモリアクセスを行い、メモリ105のアドレス「10」からデータ処理に必要なデータを読み出す。CPU101は時間「2」において、読み出したデータに対する前記した処理Aのデータ処理を行う。CPU101は時間「3」において、処理結果のデータをCPU102に対して出力する。このように、CPU101は、データの読み出しのためのメモリアクセス、処理Aのデータ処理、CPU102に対するデータ出力を一組として連続して実行する。ここで、メモリアクセス、データ処理及びデータ出力は、CPU101がプログラムに従って実行する命令であるため、同時処理ではなく順次的な処理となっている。なお、この一組の処理は、前述の小さな固定サイズ画像の処理に相当し、前述の通り、大きな画像に対する画像処理は、この小さな固定サイズ画像の処理を必要な回数だけ繰り返すことで実現する。本実施例においては、大きな画像を6個に分割して、6回の画像処理を連続して実行する場合を例とする。したがって、CPU101はこの一組の処理を全部で6回繰り返すことで、大きな画像に対する画像処理を完了する。
【００３４】
次に、CPU101は時間「4」において、メモリアクセスを行おうとするが、バス106からの許可が出ないため、待機する。その後、CPU101は時間「5」において、メモリアクセスを行い、メモリ105のアドレス「11」からデータ処理に必要なデータを読み出す。このように、メモリアクセスは、他のCPUと競合した場合にバス106からの許可が出ずに待機する時間が発生する場合があり、その状態を図中の白い四角で示している。CPU101は時間「6」において、読み出したデータに対する前記した処理Aのデータ処理を行う。CPU101は時間「7」において、処理結果のデータをCPU102に対して出力する。
【００３５】
次に、CPU101は時間「8」において、メモリアクセスを行い、メモリ105のアドレス「13」からデータ処理に必要なデータを読み出す。CPU101は時間「9」において、読み出したデータに対する前記した処理Aのデータ処理を行う。CPU101は時間「10」から時間「12」において、処理結果のデータをCPU102に対して出力しようとするが、CPU102がデータ入力をしないため、待機する。その後、CPU101は時間「13」において、処理結果のデータをCPU102に対して出力する。このように、データ出力は、出力先のCPUのデータ入力が実行できるまで待機する時間が発生する場合があり、その状態も、メモリアクセスの待機の場合と同様に、図中の白い四角で示している。
【００３６】
そして、CPU101は時間「14」から時間「27」に至るまで、全部で合計6個の小さな固定サイズ画像の処理が完了するまで繰り返し動作する。
【００３７】
同様に、CPU102は、時間「1」において、メモリアクセスを行おうとするが、バス106からの許可が出ないため、待機する。その後、CPU102は時間「2」において、メモリアクセスを行い、メモリ105のアドレス「20」からデータ処理に必要なデータを読み出す。CPU102は時間「3」において、CPU101からデータを入力する。CPU102は時間「4」において、読み出したデータと入力したデータに対する前記した処理Bのデータ処理を行う。CPU102は時間「5」において、処理結果のデータをCPU103に対して出力する。
【００３８】
そして、CPU102は時間「5」から時間「30」に至るまで、全部で合計6個の小さな固定サイズ画像の処理が完了するまで繰り返し動作する。
【００３９】
同様に、CPU103は、時間「1」から時間「2」において、メモリアクセスを行おうとするが、バス106からの許可が出ないため、待機する。CPU103は時間「3」において、メモリアクセスを行い、メモリ105のアドレス「30」からデータ処理に必要なデータを読み出す。CPU103は時間「4」において、CPU102からデータを入力しようとするがCPU102がデータ出力をしないため、待機する。その後、CPU103は時間「5」において、CPU102からデータを入力する。このように、データ入力は、入力元のCPUのデータ出力が実行できるまで待機する時間が発生する場合があり、その状態も、メモリアクセスの待機の場合と同様に、図中の白い四角で示している。CPU103は時間「6」から時間「7」において、読み出したデータと入力したデータに対する前記した処理Cおよび処理Dのデータ処理を行う。このように、CPU103によるデータ処理は、二つの処理を行うため他のCPUのデータ処理よりも時間が長くかかる。CPU103は時間「8」において、処理結果のデータをCPU104に対して出力する。
【００４０】
そして、CPU103は時間「9」から時間「33」に至るまで、全部で合計6個の小さな固定サイズ画像の処理が完了するまで繰り返し動作する。
【００４１】
同様に、CPU104は、時間「1」から時間「35」に至るまで、全部で合計6個の小さな固定サイズ画像の処理が完了するまで繰り返し動作する。
【００４２】
このように、各CPUは、メモリアクセス、データ入力、データ出力において、必要に応じて待機することで他のCPUと連携して動作する。
なお、CPU104のデータ出力は、画像処理装置1の図示しない外部の装置に対して行われるが、本実施例においては、図示しない外部の装置は常にデータ入力できる状態にあるため、CPU104がデータ出力で待機することはない。
【００４３】
図４（Ｂ）は、画像処理装置1において、全てのCPUのプリフェッチ機能を無効にして画像処理を実行した場合のバス106の動作を示すタイミングチャートである。本図は、図４（Ａ）の各CPUのメモリアクセス部分だけを抜き出したものである。バス106は、一つのCPUだけがメモリアクセス要求を出した時に、そのCPUに対してメモリアクセスを許可する。また、バス106は、複数のCPUが同時にメモリアクセス要求を出した時に調停動作、すなわちメモリアクセスを許可するCPUをその複数のCPUの中から一つだけ選んで許可を出す動作を行う。バス106が行う調停動作の方法は、ラウンドロビン方式と呼ばれるもので、CPU101、CPU102、CPU103及びCPU104の並び順に、前回許可を出したCPUの次のCPUを第一優先とし、さらに次のCPUを第二優先という順番である。なお、バス106は、並びの最後のCPU104の次は並びの先頭のCPU101に環状につながる順番を使い調停動作をする。以下、時間「1」から、バス106の調停動作を説明する。
【００４４】
バス106は時間「1」において、複数のCPU（CPU101、CPU102、CPU103、CPU104）からのメモリアクセス要求に対してCPU101に許可を出す。これは、最初の時間はCPU101を最優先として処理するためである。
【００４５】
バス106は時間「2」において、複数のCPU（CPU102、CPU103、CPU104）からのメモリアクセス要求に対してCPU102に許可を出す。これは、CPU102が前回許可を出したCPU（CPU101）の次のCPU（CPU102）を最優先とした環状の順番の中でもっとも優先度が高いからである。なお、図中では、バス106が複数のCPUに対する調停動作を行う時間に、前回許可を出したCPUから今回許可を出すCPUに対する矢印を付けて、許可するCPUの推移を表現している。
【００４６】
バス106は時間「3」において、複数のCPU（CPU103、CPU104）からのメモリアクセス要求に対してCPU103に許可を出す。これは、CPU103が前回許可を出したCPU（CPU102）の次のCPU（CPU103）を最優先とした環状の順番の中でもっとも優先度が高いからである。
【００４７】
バス106は時間「4」において、複数のCPU（CPU101、CPU104）からのメモリアクセス要求に対してCPU104に許可を出す。これは、CPU104が前回許可を出したCPU（CPU103）の次のCPU（CPU104）を最優先とした環状の順番の中でもっとも優先度が高いからである。
【００４８】
バス106は時間「5」から時間「9」において、一つのCPUだけからのメモリアクセス要求に対して要求のあったCPUに許可を出す。
【００４９】
バス106は時間「11」において、複数のCPU（CPU102、CPU104）からのメモリアクセス要求に対してCPU104に許可を出す。これは、CPU104が前回許可を出したCPU（CPU103）の次のCPU（CPU104）を最優先とした環状の順番の中でもっとも優先度が高いからである。このように、時間「10」においてはメモリアクセス要求がないが、バス106はそれに影響を受けず、前回許可を出したCPU（CPU103）の次のCPU（CPU104）を最優先として調停動作を行う。
【００５０】
同様に、バス106は時間「12」から時間「31」まで、上述した方式にしたがってメモリアクセスの許可を出す。
【００５１】
図４（Ｃ）は、画像処理装置1において、全てのCPUのプリフェッチ機能を無効にして画像処理を実行した場合のメモリ105及びバスモニタ107の動作を示すタイミングチャートである。本図は、図４（Ａ）に記載した動作時にバスモニタ107が観測するメモリ105の動作を示すものであるが、図４（Ａ）の各CPUが実際にメモリアクセスをする部分だけを抜き出してまとめたものと同等である。
【００５２】
バスモニタ107は、前述の通り、保持している過去の時間「25」個分のメモリアクセスに使用されたか否かの情報を用いて、使用された数が13以上でメモリアクセスが混雑していると判定する。そのため、図４（Ｃ）に示す例では、バスモニタ107は、使用された時間の累積が13となる時間「16」以降は混雑判定で出力を「HIGH」にする。そして、前述の通り、各CPUはバスモニタ107の出力値を取得することで、混雑度判定結果を得ることができる。
【００５３】
本実施例においては、各CPUは6回の画像処理が完了した時点で、バスモニタ107の出力値を取得して混雑度判定結果を得る。本図においては、6回の画像処理が完了した時点とは、CPU101は時間「27」、CPU102は時間「30」、CPU103は時間「33」及びCPU104は時間「35」のことで、混雑という判定結果である。
【００５４】
図５は、画像処理装置1において、図４の動作条件の場合の停止時間モニタ108内部の動作の一例を示すタイミングチャートである。以下、時間「1」から、出力停止カウンタ1081と入力停止カウンタ1082、出力停止カウンタ1083と入力停止カウンタ1084、出力停止カウンタ1085と入力停止カウンタ1086、出力停止カウンタ1087の動作を一つずつ順番に説明する。また、その後にボトルネック判定部1088の動作を説明する。
【００５５】
まず、出力停止カウンタ1081と入力停止カウンタ1082が、CPU101からCPU102へのデータ転送状態に応じて動作する様子を、図中の横破線で区切られた上から1番目の領域で説明する。
【００５６】
まず、図４に示したCPU101のデータ出力及びCPU102のデータ入力に対するVALID信号とBUSY信号は図示した通りである。
VALID信号は「HIGH」状態でデータ出力要求を示す信号であり、時間「3」や時間「7」のようなデータ出力が実行される時間及び時間「10」から時間「12」のようなデータ出力するCPUが待機状態の時間に「HIGH」となる。
BUSY信号は「LOW」状態でデータ入力要求を示す信号であり、時間「3」や時間「7」のようなデータ入力が実行される時間及びCPU102のデータ入力にはないが、データ入力するCPUが待機状態の時間に「LOW」となる。
【００５７】
出力停止カウンタ1081は、データ出力するCPUが待機状態の時間、つまりVALID信号とBUSY信号が共に「HIGH」である時間「10」から時間「12」及び時間「20」から時間「22」にカウント値を1ずつ増加させる。また、出力停止カウンタ1081は、一定期間、ここでは25の時間ごとに、カウント値を新しい出力値として出力し、カウント値を「0」にリセットする。したがって、出力停止カウンタ1081は、時間「26」において、時間「25」の時点のカウント値「6」を出力値として出力し、カウント値を「0」にリセットしている。
【００５８】
入力停止カウンタ1082は、データ入力するCPUが待機状態の時間、つまりVALID信号とBUSY信号が共に「LOW」である時間にカウント値を1ずつ増加させるが、CPU102のデータ入力には待機状態の時間はない。また、入力停止カウンタ1082は、一定期間、ここでは25の時間ごとに、カウント値を新しい出力値として出力し、カウント値を「0」にリセットする。したがって、入力停止カウンタ1082は、時間「26」において、時間「25」の時点のカウント値「0」を出力値として出力し、カウント値を「0」にリセットしている。
【００５９】
同様に、出力停止カウンタ1083と入力停止カウンタ1084が、CPU102からCPU103へのデータ転送状態に応じて動作する様子を、図中の横破線で区切られた上から2番目の領域で説明する。
【００６０】
まず、図４に示したCPU102のデータ出力及びCPU103のデータ入力に対するVALID信号とBUSY信号は図示した通りである。
VALID信号は「HIGH」状態でデータ出力要求を示す信号であり、時間「8」や時間「13」のようなデータ出力が実行される時間及びCPU102のデータ出力にはないが、データ出力するCPUが待機状態の時間に「HIGH」となる。
BUSY信号は「LOW」状態でデータ入力要求を示す信号であり、時間「5」や時間「10」のようなデータ入力が実行される時間及び時間「4」のようなデータ入力するCPUが待機状態の時間に「LOW」となる。
【００６１】
出力停止カウンタ1083は、データ出力するCPUが待機状態の時間、つまりVALID信号とBUSY信号が共に「HIGH」である時間「9」、時間「19」及び時間「29」にカウント値を1ずつ増加させる。また、出力停止カウンタ1083は、一定期間、ここでは25の時間ごとに、カウント値を新しい出力値として出力し、カウント値を「0」にリセットする。したがって、出力停止カウンタ1083は、時間「26」において、時間「25」の時点のカウント値2を出力値として出力し、カウント値を「0」にリセットしている。入力停止カウンタ1084は、データ入力するCPUが待機状態の時間、つまりVALID信号とBUSY信号が共に「LOW」である時間「4」にカウント値を1増加させる。また、入力停止カウンタ1084は、一定期間、ここでは25の時間ごとに、カウント値を新しい出力値として出力し、カウント値を「0」にリセットする。したがって、入力停止カウンタ1084は、時間「26」において、時間「25」の時点のカウント値「1」を出力値として出力し、カウント値を「0」にリセットしている。
【００６２】
次に、出力停止カウンタ1085と入力停止カウンタ1086が、CPU103からCPU104へのデータ転送状態に応じて動作する様子を、図中の横破線で区切られた上から3番目の領域で簡単に説明する。
【００６３】
まず、図４に示したCPU103のデータ出力及びCPU104のデータ入力に対するVALID信号とBUSY信号は図示した通りである。
出力停止カウンタ1085は、データ出力するCPUが待機状態の時間、つまりVALID信号とBUSY信号が共に「HIGH」である時間にカウント値を1ずつ増加させるが、CPU103のデータ出力には待機状態の時間はない。また、出力停止カウンタ1085は、一定期間、ここでは25の時間ごとに、カウント値を新しい出力値として出力し、カウント値を「0」にリセットする。したがって、出力停止カウンタ1085は、時間「26」において、時間「25」の時点のカウント値「0」を出力値として出力し、カウント値を「0」にリセットしている。
入力停止カウンタ1086は、データ入力するCPUが待機状態の時間、つまりVALID信号とBUSY信号が共に「LOW」である時間「5」から時間「7」、時間「12」、時間「22」及び時間「32」にカウント値を1ずつ増加させる。また、入力停止カウンタ1086は、一定期間、ここでは25の時間ごとに、カウント値を新しい出力値として出力し、カウント値を「0」にリセットする。したがって、入力停止カウンタ1086は、時間「26」において、時間「25」の時点のカウント値「5」を出力値として出力し、カウント値を「0」にリセットしている。
【００６４】
同様に、出力停止カウンタ1087が、CPU104から図示しない外部装置へのデータ転送状態に応じて動作する様子を、図中の横破線で区切られた上から4番目の領域で簡単に説明する。
【００６５】
まず、図４に示したCPU104のデータ出力及び図示しない外部装置のデータ入力に対するVALID信号とBUSY信号は図示した通りである。ここで、図示しない外部装置は常にデータの入力ができるハードウェアであり、BUSY信号は常に「LOW」である。
出力停止カウンタ1087は、データ出力するCPUが待機状態の時間、つまりVALID信号とBUSY信号が共に「HIGH」である時間にカウント値を1ずつ増加させるが、CPU104のデータ出力には待機状態の時間はない。また、出力停止カウンタ1087は、一定期間、ここでは25の時間ごとに、カウント値を新しい出力値として出力し、カウント値を「0」にリセットする。したがって、出力停止カウンタ1087は、時間「26」において、時間「25」の時点のカウント値「0」を出力値として出力し、カウント値を「0」にリセットしている。
【００６６】
最後に、ボトルネック判定部1088が、出力停止カウンタ1081、1083、1085、1087及び入力停止カウンタ1082、1084、1086の出力値に応じて動作する様子を、図中の横破線で区切られた上から5番目の領域で説明する。
【００６７】
まず、ボトルネック判定部1088は、CPU101、CPU102、CPU103及びCPU104、それぞれの停止時間を次のように計算する。
CPU101の停止時間は、出力停止カウンタ1081の出力値である。
CPU102の停止時間は、入力停止カウンタ1082の出力値と出力停止カウンタ1083の出力値の合計値である。
CPU103の停止時間は、入力停止カウンタ1084の出力値と出力停止カウンタ1085の出力値の合計値である。
CPU104の停止時間は、入力停止カウンタ1086の出力値と出力停止カウンタ1087の出力値の合計値である。
【００６８】
そして、ボトルネック判定部1088は、停止時間がもっとも少ないCPUをボトルネックと判定し、ボトルネックのCPUには出力信号を「HIGH」にして出力し、ボトルネックではないCPUには出力信号を「LOW」にして出力する。前述した通り、もっとも少ない停止時間のCPUが複数あった場合は、そのすべてをボトルネックと判定する。したがって、時間「1」から時間「25」までの間は、全ての出力停止カウンタと全ての入力停止カウンタの出力値が「0」で、全てのCPUの停止時間が「0」であるため、ボトルネック判定部1088は全てのCPUをボトルネックと判定する。そして、ボトルネック判定部1088は、時間「1」から時間「25」までの間は、全てのCPUに対して出力信号を「HIGH」にして出力している。
【００６９】
また、時間「26」から後の各出力停止カウンタ及び各入力停止カウンタの出力値と、各CPUの停止時間は次のようになっている。
出力停止カウンタ1081の出力値は「6」のため、CPU101の停止時間は「6」である。
入力停止カウンタ1082の出力値は「0」で、出力停止カウンタ1083の出力値は「2」のため、CPU102の停止時間は「2」である。
入力停止カウンタ1084の出力値は「1」で、出力停止カウンタ1085の出力値は「0」のため、CPU103の停止時間は「1」である。
入力停止カウンタ1086の出力値は「5」で、出力停止カウンタ1087の出力値は「0」のため、CPU104の停止時間は「5」である。
【００７０】
したがって、ボトルネック判定部1088は時間「26」から後は、もっとも少ない停止時間のCPU103をボトルネックと判定し、CPU103に対して出力信号を「HIGH」にして出力し、他のCPUに対しては出力信号を「LOW」にして出力する。
そして、各CPUは、時間「26」以降にボトルネック判定部1088の出力値を取得することで、ボトルネック判定結果を得ることができる。本実施例においては、各CPUは6回の画像処理が完了した時点で、ボトルネック判定部1088の出力値を取得してボトルネック判定結果を得る。本図においては、6回の画像処理が完了した時点とは、CPU101は時間「27」、CPU102は時間「30」、CPU103は時間「33」及びCPU104は時間「35」のことで、CPU103だけがボトルネックという判定結果である。
【００７１】
図６は、画像処理装置1において、CPU101、CPU102、CPU103及びCPU104がプリフェッチ機能の有効と無効を切り替える制御を実行する処理の一例を示すフローチャートである。本フローチャートは、CPU101、CPU102、CPU103及びCPU104が実行可能なプログラムとしてメモリ105に格納されており、これら各CPUがそれぞれ読み出して実行する。各CPUは、それぞれ独立して本図で示す制御を行うため、本図の説明中は各CPUを単にCPUと表記する。
【００７２】
CPUは、プリフェッチ機能の有効と無効を切り替える制御をS601から開始する。
S601において、CPUは、バスモニタ107の出力であるバス106の混雑度情報及び停止時間モニタ108の出力であるCPUのボトルネック情報を取得済みであるか否かを判定する。
そして、混雑情報とボトルネック情報を取得済みであると判定した場合（S601でYesの場合）、CPUは、S602に処理を進める。
【００７３】
S602において、CPUは、混雑度情報が混雑を示すか否かを判定する。
そして、混雑情報とボトルネック情報を取得済みでないと判定した場合（S601でNoの場合）、CPUは、S604に処理を進める。
S604において、CPUは、プリフェッチ機能を無効化する命令を実行してプリフェッチ機能を無効化し、プリフェッチ機能の制御を終了する。
【００７４】
一方、上記S601において、混雑を示すと判断した場合（S602でYesの場合）CPUは、S603に処理を進める。
S603において、CPUは、ボトルネック情報がボトルネックを示すか否かを判定する。そして、ボトルネックでないと判定した場合（S603でNoの場合）、CPUは、S604に処理を進め、プリフェッチ機能を無効化し、処理を終了する。
【００７５】
一方、上記S603において、ボトルネックでないと判定した場合（S603でNoの場合）、CPUは、S605に処理を進める。
また、上記S602において、混雑していないと判定した場合（S602でNoの場合）にも、CPUは、S605に処理を進める。
S605において、CPUは、プリフェッチ機能を有効化する命令を実行してプリフェッチ機能を有効化し、プリフェッチ機能の有効と無効を切り替える制御を終了する。
【００７６】
以上に示すように、プリフェッチ機能の有効と無効を切り替えることで、各CPUは、バスが混雑していて、かつ、ボトルネックではないときに、プリフェッチ機能を使用しなくなるようにすることができる。
【００７７】
図７は、画像処理装置1において、ボトルネックであるCPU103のプリフェッチ機能だけ有効にして画像処理を実行した場合のCPU101〜104、バス106、メモリ105及びバスモニタ107の動作の一例を示すタイミングチャートである。この例では、CPU103以外、CPU101、CPU102及びCPU104のプリフェッチ機能は無効に制御されている。なお、画像処理装置1は、バス106の混雑情報とCPUのボトルネック情報を得た後に、図６で示したように各CPUのプリフェッチ機能の有効と無効を制御して画像処理を実行する。また、本図は、図４および図５で示した画像処理動作により、バス106が混雑、CPU103がボトルネック、という情報を得た後の画像処理動作を示している。
【００７８】
図７（Ａ）は、画像処理装置1において、ボトルネックであるCPU103のプリフェッチ機能だけ有効にして画像処理を実行した場合のCPU101〜104の動作を示すタイミングチャートである。本図は、図４（Ａ）同様、CPUのメモリアクセス、データ入力、データ処理及びデータ出力の流れを模式的に説明するためのものである。また、CPU101、CPU102及びCPU104の動作は、プリフェッチを行わないという点において図４（Ａ）と同じため説明を省略する。以下、時間「1」から、CPU103の動作を説明する。
【００７９】
CPU103は、時間「1」から時間「2」において、メモリアクセスを行おうとするが、バス106からの許可が出ないため、待機する。その後、CPU103は時間「3」において、メモリアクセスを行い、メモリ105のアドレス「30」からデータ処理に必要なデータを読み出す。
【００８０】
CPU103は時間「4」において、CPU102からデータを入力しようとするがCPU102がデータ出力をしないため、待機する。また、CPU103は時間「4」において、前述の動作と並行してプリフェッチ機能によるメモリアクセスを開始する。ここで、プリフェッチ機能は、CPUの動作シーケンスのうちメモリアクセス以外、つまりデータ入力、データ処理及びデータ出力と同時に実行できるため、CPU103はメモリアクセス完了後のデータ入力と同時にプリフェッチ動作を実行する。CPU103は時間「4」から時間「6」において、プリフェッチ機能によるメモリアクセスを行おうとするが、バス106からの許可が出ないため、待機する。図７では、プリフェッチ機能によるメモリアクセスを、通常のメモリアクセスと区別するため、図中で破線の四角で示してあり、また、待機状態を白で、メモリアクセス実行状態を網掛けとアクセス先のアドレスで示している。
【００８１】
CPU103は時間「7」において、プリフェッチ機能によるメモリアクセスを行い、メモリ105のアドレス「31」から次のデータ処理に必要と予測したデータを読み出し、読み出したデータをCPU103内部のキャッシュメモリに格納する。ここで、各CPUのプリフェッチ機能によるメモリアクセスのアドレスは、直前に実行されたメモリアクセスのアドレスに1を加えたもので、アドレスが昇順に使用されるという予測の元に決定しており、次に必ず使用されるという保証があるわけではない。CPU103は、プリフェッチ機能によるメモリアクセスを実行した後、次のメモリアクセスがあるまで、プリフェッチ機能によるメモリアクセスは行わない。
【００８２】
以降、CPU103がプリフェッチ機能の動作と並行して行う動作の説明を続ける。
CPU103は時間「5」において、CPU102からデータを入力する。図４（Ａ）と同様に、データ入力は、入力元のCPUのデータ出力が実行できるまで待機する時間が発生する場合があり、そのことを図中の白い四角で示している。CPU103は時間「6」から時間「7」において、読み出したデータと入力したデータに対する前記した処理Cおよび処理Dのデータ処理を行う。CPU103は時間「8」において、処理結果のデータをCPU104に対して出力する。
【００８３】
そして、CPU103は時間「9」から時間「33」に至るまで、全部で合計6個の小さな固定サイズ画像の処理が完了するまで繰り返し動作するが、図４（Ａ）で示した動作とメモリアクセスに関して異なる場合がある。それは、メモリアクセスで読み出そうとするアドレスのデータが、直前に実行したプリフェッチ機能によるメモリアクセスですでにキャッシュメモリ内に格納されている場合である。それは、図４（Ａ）における、時間「9」、時間「18」及び時間「28」のメモリアクセスが該当し、本図では異なる動作になっている。
【００８４】
以下、時間「9」からの動作について具体的に説明する。
図４（Ａ）ではCPU103はメモリ105のアドレス31に対するメモリアクセスを時間「9」において実行するが、本図では、メモリ105のアドレス31に対するメモリアクセスは時間「7」にすでに完了しているため、時間「9」では実行しない。本図の場合、CPU103は時間「9」において、メモリアクセスの次の動作であるデータ入力の動作を行うことができ、その分、CPU103の処理が高速化する。そして、本図では、CPU103は時間「9」において、次のプリフェッチ機能によるメモリアクセスの動作を行う。つまり、CPU103は、プリフェッチ機能によるメモリアクセスで読み出したデータの利用後にも、前述したメモリアクセス後と同様に、データ入力と同時に次のアドレス「32」に対してプリフェッチ機能によるメモリアクセスを実行する。ここまで時間「9」からのCPU103の動作について説明したが、時間「18」から及び時間「28」からの動作についても同様である。メモリアクセスで読み出そうとするアドレスのデータが、直前のプリフェッチ機能によるメモリアクセスで読み出されている場合、CPU103はメモリアクセスの時間を省略することで画像処理の高速化ができる。
【００８５】
一方、メモリアクセスで読み出そうとするアドレスのデータが、直前のプリフェッチ機能によるメモリアクセスで読み出したアドレスと異なる場合もあり、本図では、時間「13」及び時間「23」が該当する。これらは、直前に実行したプリフェッチ機能によるメモリアクセスの予測が外れることで発生する状況で、その場合、CPU103は時間「1」からのメモリアクセスと同様に通常通りのメモリアクセスを実行する。
【００８６】
したがって、CPU103は、プリフェッチ機能によるメモリアクセスの予測が外れた場合には画像処理の高速化はできないが、予測が当たった分だけ画像処理の高速化ができる。この高速化の効果で画像処理全体でも高速化ができ、CPU103は6回の画像処理が完了する時点で比較して、図４（Ａ）で時間「33」だったものが、本図では時間「32」と、1だけ高速化している。そして、CPU103は、画像処理装置1の処理の中でボトルネックのCPUであるため、画像処理装置1全体の画像処理の高速化も実現している。画像処理装置1の6回の画像処理、つまり、CPU104の画像処理が完了する時点で比較して、図４（Ａ）で時間「35」だったものが、本図では時間「34」と、1だけ高速化している。
【００８７】
図７（Ｂ）は、画像処理装置1において、ボトルネックであるCPU103のプリフェッチ機能だけ有効にして画像処理を実行した場合のバス106の動作を示すタイミングチャートである。本図は、図７（Ａ）の各CPUのメモリアクセス部分だけを抜き出したものである。本図は、図４（Ｂ）同様、バス106の調停動作を説明する図であるが、図４（Ｂ）と比較して、本図では、通常のメモリアクセスに加え、プリフェッチ機能によるメモリアクセスがあり、メモリアクセス総数が増加している。しかし、バス106は、通常のメモリアクセスとプリフェッチ機能によるメモリアクセスを区別することなく調停動作を行い、動作の仕組みに違いはないため詳しい説明は省略する。
【００８８】
図７（Ｃ）は、画像処理装置1において、ボトルネックであるCPU103のプリフェッチ機能だけ有効にして画像処理を実行した場合のメモリ105およびバスモニタ107の動作を示すタイミングチャートである。本図は、図７（Ａ）に記載した動作時にバスモニタ107が観測するメモリ105の動作を示すものであるが、図７（Ａ）の各CPUが実際にメモリアクセスをする部分だけを抜き出してまとめたものと同等である。本図では、プリフェッチ機能によるメモリアクセスが増加したため、図４（Ｃ）と比較して、メモリアクセスの混雑度はさらに高くなっている。バスモニタ107は、使用された時間の累積が13となる時間「13」以降は混雑判定で出力を「HIGH」にする。
【００８９】
以上、画像処理装置1の一連の動作の一例を、図４から図７を使って説明した。その中で、バス106の混雑度が高い場合に、ボトルネックとなるCPUだけプリフェッチ機能を有効にすることで、画像処理装置1の処理速度が速くなることを示した。
【００９０】
ここで、本画像処理装置1の本来の動作とは異なるが、比較のために、図６で示したプリフェッチ機能の制御を使わずに、全てのCPUのプリフェッチ機能を有効にして動作した場合の動作（即ち従来技術）について、図８を使い説明する。そこでは、バス106の混雑度がより高くなり、画像処理装置1の処理速度が遅くなってしまうことが示される。
【００９１】
図８は、画像処理装置1の本来の動作とは異なり、全てのCPUのプリフェッチ機能を有効にして画像処理を実行した場合のCPU101〜104、バス106、メモリ105及びバスモニタ107の動作（即ち従来技術）の一例を示すタイミングチャートである。この動作は、本来の画像処理装置1の動作とは異なる従来の動作に対応するものであるが、比較のために示す。
【００９２】
図８（Ａ）は、画像処理装置1の本来の動作とは異なり、全てのCPUのプリフェッチ機能を有効にして画像処理を実行した場合のCPU101〜104の動作を示すタイミングチャートである。図７（Ａ）と同様に、プリフェッチ機能によるメモリアクセスを区別するため、図中で破線の四角で示してあり、また、待機状態を白で、メモリアクセス実行状態を網掛けとアクセス先のアドレスで示している。
【００９３】
本図では、全てのCPUにおいて、プリフェッチ機能によるメモリアクセスが多く、待機状態になる時間も長いことがわかる。また、各CPUは、プリフェッチ機能を無効にした状態では、データ出力の直後にメモリアクセスを実行開始できるが、本図では、プリフェッチ機能によるメモリアクセスが完了するまで実行開始ができない箇所が発生している。それらが積み重なることで画像処理装置1の処理速度も遅くなっており、画像処理装置1の6回の画像処理、つまり、CPU104の画像処理が完了する時点で比較して、図４（Ａ）で時間「35」だったものが、本図では時間「38」と、3だけ低速化している。
【００９４】
図８（Ｂ）は、画像処理装置1の本来の動作とは異なり、全てのCPUのプリフェッチ機能を有効にして画像処理を実行した場合のバス106の動作を示すタイミングチャートである。本図は、図８（Ａ）の各CPUのメモリアクセス部分だけを抜き出したものである。本図は、図７（Ｂ）同様、バス106の調停動作を説明する図であるが、図７（Ｂ）と比較して、本図では、プリフェッチ機能によるメモリアクセスがさらに増加しており、常に調停動作が必要な状態になることがわかる。なお、調停動作が必要ということは、CPUがメモリアクセスのために待機する時間が発生することであり、図中の白い四角で示した待機時間が多くなっている。
【００９５】
図８（Ｃ）は、画像処理装置1の本来の動作とは異なり、全てのCPUのプリフェッチ機能を有効にして画像処理を実行した場合のメモリ105およびバスモニタ107の動作を示すタイミングチャートである。本図は、図８（Ａ）に記載した動作時にバスモニタ107が観測するメモリ105の動作を示すものであるが、図８（Ａ）の各CPUが実際にメモリアクセスをする部分だけを抜き出してまとめたものと同等である。本図では、プリフェッチ機能によるメモリアクセスが増加したため、図７（Ｃ）と比較して、メモリアクセスの混雑度はさらに高くなり、空き時間がまったくなくなっている。
【００９６】
以上、本画像処理装置1の本来の動作とは異なるが、比較のために、図６で示したプリフェッチ機能の制御を使わずに、全てのCPUのプリフェッチ機能を有効にして動作した場合の動作（即ち従来技術）について、図８で説明した。この動作では、バス106の混雑度がより高くなり、画像処理装置1の処理速度が遅くなってしまうといった、従来術の課題について確認した。つまり、図６で示したプリフェッチ機能の制御を用いることにより、バスが混雑している場合でもプリフェッチによる処理高速化の効果を得ることができる。
【００９７】
なお、本実施例においては、バスの混雑度およびボトルネックの判定とプリフェッチ機能の有効無効の切り替えを二つの異なる画像処理の間で行ったが、一つの画像処理の途中で行うこともできる。さらには、バスの混雑度およびボトルネックの判定とプリフェッチ機能の有効無効の切り替えを一つの画像処理の途中に複数回行うことも可能である。これにより、バスの混雑度とボトルネックが画像データに依存して途中で変化する場合にも追従した動作ができる。
【００９８】
以上のように、バスが混雑している場合には、ボトルネックとなるプロセッサでプリフェッチを使用可能にし、それ以外のプロセッサでプリフェッチを使用しないように制御する。また、バスが混雑していない場合には、ボトルネックとならないプロセッサでもプリフェッチを使用可能に制御する。このように、バスの混雑度に応じ、複数のプロセッサのうちボトルネックとなるものを優先してプリフェッチを使用するように制御することにより、バスの混雑度に合わせてプリフェッチを行うプロセッサを限定する。これにより、競合によるレイテンシの増加を抑え、プリフェッチによる処理高速化の効果を得ることができる。
【００９９】
なお、本発明は、マルチプロセッサによるパイプラインで画像処理を行う画像処理装置に限定されるものではなく、マルチプロセッサによるパイプラインで各種データ処理を行うデータ処理装置であってもよい。すなわち、複数のプロセッサによるパイプライン構成でプリフェッチ機能を使用するデータ処理装置であれば本発明を適用可能である。
【０１００】
以上のように、バスの混雑度とパイプライン構成のボトルネックに合わせてプリフェッチを行うプロセッサを限定することにより、複数プロセッサのパイプライン構成でプリフェッチ機能を使用するときにバス混雑による処理性能劣化を防ぐことができる。
【０１０１】
なお、上述した各種データの構成及びその内容はこれに限定されるものではなく、用途や目的に応じて、様々な構成や内容で構成されていてもよい。
【０１０２】
以上、一実施形態について示したが、本発明は、例えば、システム、装置、方法、プログラムもしくは記憶媒体等としての実施態様をとることが可能である。具体的には、複数の機器から構成されるシステムに適用しても良いし、また、一つの機器からなる装置に適用しても良い。
【０１０３】
また、上記各実施例を組み合わせた構成も全て本発明に含まれるものである。
【０１０４】
（その他の実施例）
本発明は、上述の実施例の1以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける1つ以上のプロセッサがプログラムを読出し実行する処理でも実現可能である。また、1以上の機能を実現する回路（例えば、ASIC）によっても実現可能である。
【０１０５】
また、本発明は、複数の機器から構成されるシステムに適用しても、1つの機器からなる装置に適用してもよい。
【０１０６】
本発明は上記実施例に限定されるものではなく、本発明の趣旨に基づき種々の変形（各実施例の有機的な組合せを含む）が可能であり、それらを本発明の範囲から除外するものではない。即ち、上述した各実施例及びその変形例を組み合わせた構成も全て本発明に含まれるものである。
【符号の説明】
【０１０７】
101,102,103,104    CPU
105    メモリ
106    バス
107    バスモニタ
108    停止時間モニタ
【図１】
2019139406.tif 000003
【図２】
2019139406.tif 000004
【図３】
2019139406.tif 000005
【図４】
2019139406.tif 000006
【図５】
2019139406.tif 000007
【図６】
2019139406.tif 000008
【図７】
2019139406.tif 000009
【図８】
2019139406.tif 000010