(57)【特許請求の範囲】
【請求項１】
数をカウントするカウント処理部を複数備える並列カウント処理装置であって、
前記カウント処理部がカウントする数の第１の限界値の範囲と、前記並列カウント処理装置のカウントする数の第２の限界値の範囲と、当該カウント処理部がカウントした数値とを記憶している第１の記憶部と、
各前記カウント処理部に設定された前記第１の限界値の範囲の上限値の合計を、前記第２の限界値の範囲の上限値から減算した数値を残数として記憶している第２の記憶部と、
前記カウントした数値と前記第１の限界値の範囲とを比較し、当該カウントした数値が前記第１の限界値の範囲に入ると判定した場合、当該カウントした数値を前記第１の記憶部に記憶し、当該カウントした数値が前記第１の限界値の範囲に入らないと判定した場合、前記第１の限界値の範囲から外れた分の差分値を前記第２の記憶部の前記残数から減算した数値を新たな前記第２の記憶部の前記残数として記憶し、前記新たな前記第２の記憶部の前記残数と前記第２の限界値の範囲とを比較し、当該新たな前記第２の記憶部の前記残数が前記第２の限界値の範囲に入ると判定した場合、前記差分値を前記第１の限界値の範囲の上限値に加算して前記第１の記憶部の前記第１の限界値の範囲を更新し、当該新たな前記第２の記憶部の前記残数が前記第２の限界値の範囲に入らないと判定した場合、当該新たな前記第２の記憶部の前記残数に前記差分値を加算して前記第２の記憶部の前記残数を書き換えて更新する前記カウント処理部と
を備えることを特徴とする並列カウント処理装置。
【請求項２】
前記カウント処理部は、
前記第１の限界値の範囲の上限値から前記カウントした数値を減算した減算値と前記残数とを比較し、前記減算値が前記残数より大きいと判定した場合、前記第１の限界値の範囲の上限値から前記減算値に対する所定の割合の値を減算して前記第１の限界値の範囲を更新し、前記第２の記憶部の前記残数に前記減算値に対する所定の割合の値を加算して前記第２の記憶部の前記残数を更新する
ことを特徴とする請求項１に記載の並列カウント処理装置。
【請求項３】
ユーザの使用する装置とネットワークを介して通信可能に接続され、前記装置間の通信接続を制御する通信装置であって、
前記カウント処理部によってカウントされる前記数として、通信に用いるセッション数をカウントする請求項１または請求項２に記載の前記並列カウント処理装置を備えることを特徴とする通信装置。
【請求項４】
ユーザの使用する端末とネットワークを介して通信可能に接続され、サービス提供用の情報を蓄積している通信装置であって、
前記カウント処理部によってカウントされる前記数として、前記端末から前記サービス提供用の情報をダウンロードした回数をカウントする請求項１または請求項２に記載の前記並列カウント処理装置を備えることを特徴とする通信装置。
【請求項５】
数をカウントするカウント処理部を複数備える並列カウント処理装置において用いられる並列カウント処理方法であって、
前記並列カウント処理装置は、
前記カウント処理部がカウントする数の第１の限界値の範囲と、前記並列カウント処理装置のカウントする数の第２の限界値の範囲と、当該カウント処理部がカウントした数値とを記憶している第１の記憶部と、
各前記カウント処理部に設定された前記第１の限界値の範囲の上限値の合計を、前記第２の限界値の範囲の上限値から減算した数値を残数として記憶している第２の記憶部と、
複数の前記カウント処理部と、を備え、
前記カウント処理部は、
前記カウントした数値と前記第１の限界値の範囲とを比較し、当該カウントした数値が前記第１の限界値の範囲に入ると判定した場合、当該カウントした数値を前記第１の記憶部に記憶し、当該カウントした数値が前記第１の限界値の範囲に入らないと判定した場合、前記第１の限界値の範囲から外れた分の差分値を前記第２の記憶部の前記残数から減算した数値を新たな前記第２の記憶部の前記残数として記憶し、前記新たな前記第２の記憶部の前記残数と前記第２の限界値の範囲とを比較し、当該新たな前記第２の記憶部の前記残数が前記第２の限界値の範囲に入ると判定した場合、前記差分値を前記第１の限界値の範囲の上限値に加算して前記第１の記憶部の前記第１の限界値の範囲を更新し、当該新たな前記第２の記憶部の前記残数が前記第２の限界値の範囲に入らないと判定した場合、当該新たな前記第２の記憶部の前記残数に前記差分値を加算して前記第２の記憶部の前記残数を書き換えて更新する
ことを特徴とする並列カウント処理方法。
【請求項６】
請求項５に記載の並列カウント処理方法を、コンピュータである前記並列カウント処理装置に実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、数をカウントするカウント処理の並列処理数の増加に応じた、スループットのスケーラビリティを確保する技術に関する。
【背景技術】
【０００２】
インターネット上で、動画共有サイトやダウンロードサイト等として動作する複数のサーバによって構成されるサーバ群がある。このサーバ群では、特定のユーザや特定のデータで、そのリソースのすべてが消費されないようにするために、同時接続数やダウンロード回数等に上限を設定することが行われている。そのため、サーバは、自身の同時接続数やダウンロード回数をカウントしつつ、サーバ群全体として特定のユーザや特定のデータに関する同時接続数やダウンロード回数の合計数を更新したり、取得したりする必要がある。その際、サーバ群は、各サーバから共通にアクセスされる合計数の一貫性（コヒーレンス）を保つ必要がある。
【０００３】
前記したサーバ群に類似する構成として、マルチコアプロセッサがある。マルチコアプロセッサでは、メインメモリ上のデータとキャッシュメモリ上のデータとの間に違いがある場合には、正しい処理が行われなくなってしまう。そこで、メインメモリのデータとキャッシュメモリのデータとの間の一貫性（キャッシュコヒーレンス）が保たれる必要がある。例えば、キャッシュコヒーレンス機能を備えたプロトコルとして、ＭＥＳＩ（Modified Exclusive Shared Invalid）プロトコル（非特許文献１参照）が挙げられる。
【０００４】
ＭＥＳＩプロトコルは、キャッシュラインに対して、Modified(変更)、Exclusive(排他)、Shared(共有)、Invalid(無効)のいずれの操作が必要かを判定し、メインメモリのデータとキャッシュメモリのデータとの間の一貫性を保つ手段を備えている。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】T. Suh, D.M. Blough, H.-H.S. Lee,“Supporting cache coherence in heterogeneous multiprocessor systems”, Design, Automation and Test in Europe Conference and Exhibition, 2004. Proceedings Vol.2, p.1150-1155 (2004)
【発明の概要】
【発明が解決しようとする課題】
【０００６】
前記サーバ群では同時接続数やダウンロード回数等の数をカウントする場合を例示したが、このカウント機能を前記したサーバにマルチコアプロセッサを備えて実現し、各コアが並列してカウントを実行した場合、サーバ群全体のカウント処理の速度が向上すると想定される。
しかしながら、ＭＥＳＩプロトコルは、マルチコアプロセッサのコア数（並列に処理するスレッドの数）の増加に伴って、キャッシュコヒーレンスの回数が増加するため、そのキャッシュコヒーレンスの処理に費やされる時間が増加し、マルチコアプロセッサのスループットの低下をまねく虞がある。
前記虞と同様に、サーバ群においても、サーバ数の増加に伴って、共通にアクセスされる合計数の一貫性を保つ処理（キャッシュコヒーレンス処理に相当）の回数が増加するため、その処理に費やされる時間が増加し、サーバ群全体のスループットの低下をまねく虞もある。
【０００７】
そこで、本発明は、数をカウントするカウント処理の並列処理数の増加に応じて、スループットのスケーラビリティを確保することを課題とする。
【課題を解決するための手段】
【０００８】
本発明は、数をカウントするカウント処理部を複数備える並列カウント処理装置であって、前記カウント処理部がカウントする数の第１の限界値の範囲と、前記並列カウント処理装置のカウントする数の第２の限界値の範囲と、当該カウント処理部がカウントした数値とを記憶している第１の記憶部と、各前記カウント処理部に設定された前記第１の限界値の範囲の上限値の合計を、前記第２の限界値の範囲の上限値から減算した数値を残数として記憶している第２の記憶部と、前記カウントした数値と前記第１の限界値の範囲とを比較し、当該カウントした数値が前記第１の限界値の範囲に入ると判定した場合、当該カウントした数値を前記第１の記憶部に記憶し、当該カウントした数値が前記第１の限界値の範囲に入らないと判定した場合、前記第１の限界値の範囲から外れた分の差分値を前記第２の記憶部の前記残数から減算した数値を新たな前記第２の記憶部の前記残数として記憶し、前記新たな前記第２の記憶部の前記残数と前記第２の限界値の範囲とを比較し、当該新たな前記第２の記憶部の前記残数が前記第２の限界値の範囲に入ると判定した場合、前記差分値を前記第１の限界値の範囲の上限値に加算して前記第１の記憶部の前記第１の限界値の範囲を更新し、当該新たな前記第２の記憶部の前記残数が前記第２の限界値の範囲に入らないと判定した場合、当該新たな前記第２の記憶部の前記残数に前記差分値を加算して前記第２の記憶部の前記残数を書き換えて更新する前記カウント処理部とを備えることを特徴とする。
【０００９】
また、本発明は、数をカウントするカウント処理部を複数備える並列カウント処理装置において用いられる並列カウント処理方法であって、前記並列カウント処理装置が、前記カウント処理部がカウントする数の第１の限界値の範囲と、前記並列カウント処理装置のカウントする数の第２の限界値の範囲と、当該カウント処理部がカウントした数値とを記憶している第１の記憶部と、各前記カウント処理部に設定された前記第１の限界値の範囲の上限値の合計を、前記第２の限界値の範囲の上限値から減算した数値を残数として記憶している第２の記憶部と、複数の前記カウント処理部と、を備え、前記カウント処理部が、前記カウントした数値と前記第１の限界値の範囲とを比較し、当該カウントした数値が前記第１の限界値の範囲に入ると判定した場合、当該カウントした数値を前記第１の記憶部に記憶し、当該カウントした数値が前記第１の限界値の範囲に入らないと判定した場合、前記第１の限界値の範囲から外れた分の差分値を前記第２の記憶部の前記残数から減算した数値を新たな前記第２の記憶部の前記残数として記憶し、前記新たな前記第２の記憶部の前記残数と前記第２の限界値の範囲とを比較し、当該新たな前記第２の記憶部の前記残数が前記第２の限界値の範囲に入ると判定した場合、前記差分値を前記第１の限界値の範囲の上限値に加算して前記第１の記憶部の前記第１の限界値の範囲を更新し、当該新たな前記第２の記憶部の前記残数が前記第２の限界値の範囲に入らないと判定した場合、当該新たな前記第２の記憶部の前記残数に前記差分値を加算して前記第２の記憶部の前記残数を書き換えて更新することを特徴とする。
【００１０】
このような構成によれば、並列カウント処理装置は、各カウント処理部のカウント数が第１の記憶部に記憶されている第１の限界値の範囲内であれば、第２の記憶部の残数が更新されないため、すなわち、キャッシュコヒーレンスのための処理が不要となるため、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【００１１】
また、本発明は、前記カウント処理部が、前記第１の限界値の範囲の上限値から前記カウントした数値を減算した減算値と前記残数とを比較し、前記減算値が前記残数より大きいと判定した場合、前記第１の限界値の範囲の上限値から前記減算値に対する所定の割合の値を減算して前記第１の限界値の範囲を更新し、前記第２の記憶部の前記残数に前記減算値に対する所定の割合の値を加算して前記第２の記憶部の前記残数を更新することを特徴とする。
【００１２】
このような構成によれば、カウント処理部は、第１の記憶部に記憶している第１の限界値の範囲が実際のカウント数より大き過ぎるか否かを判定し、ローカルに持つ第１の限界値の範囲を設定変更することができる。言い換えると、カウント処理部は、第１の限界値の範囲が実際のカウント数より大き過ぎると判定した場合、第２の記憶部の残数を増加させ、他のカウント処理部が、より大きな第１の限界値の範囲に変更することが可能なようにすることができる。つまり、他のカウント処理部は、より大きく変更した第１の限界値の範囲内であれば、第２の記憶部の残数を更新する必要がないため、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【００１３】
また、本発明は、ユーザの使用する装置とネットワークを介して通信可能に接続され、前記装置間の通信接続を制御する通信装置が、前記カウント処理部によってカウントされる前記数として、通信に用いるセッション数をカウントする前記並列カウント処理装置を備えることを特徴とする。
【００１４】
このような構成によれば、例えば、通信装置が通信接続の制御を実行するＳＩＰ（Session Initiation Protocol）サーバ等である場合には、前記並列カウント処理装置を備えているので、セッション数のカウントにおいて、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【００１５】
また、本発明は、ユーザの使用する端末とネットワークを介して通信可能に接続され、サービス提供用の情報を蓄積している通信装置が、前記カウント処理部によってカウントされる前記数として、前記端末から前記サービス提供用の情報をダウンロードした回数をカウントする前記並列カウント処理装置を備えることを特徴とする。
【００１６】
このような構成によれば、例えば、通信装置がサービス提供用の情報を蓄積しているサーバ等である場合には、前記並列カウント処理装置を備えているので、ダウンロード数のカウントにおいて、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【００１７】
また、本発明は、前記並列カウント処理方法を、コンピュータである前記並列カウント処理装置に実行させるためのプログラムとした。このようなプログラムをインストールされたコンピュータは、このプログラムに基づいた機能を実現することができる。
【発明の効果】
【００１８】
本発明によれば、数をカウントするカウント処理の並列処理数の増加に応じて、スループットのスケーラビリティを確保することができる。
【図面の簡単な説明】
【００１９】
【図１】比較例として同じキャッシュラインにアクセスする並列カウント処理装置（マルチコアプロセッサ）の機能例を示す図である。
【図２】比較例の並列カウント処理装置（マルチコアプロセッサ）の動作例を示す図であり、（ａ）は処理シーケンス例を表し、（ｂ）は処理フロー例を表す。
【図３】第１実施形態の並列カウント処理装置（マルチコアプロセッサ）の構成例を示す図である。
【図４】第１実施形態の並列カウント処理装置（マルチコアプロセッサ）の処理シーケンス例を示す図である。
【図５】第１実施形態の並列カウント処理装置（マルチコアプロセッサ）の処理フロー例を示す図である。
【図６】第２実施形態において、第１実施形態の並列カウント処理装置（マルチコアプロセッサ）を備えた通信装置の構成例を示す図である。
【図７】第２実施形態における通信装置の処理シーケンス例を示す図である。
【図８】第３実施形態において、複数のサーバで構成されるサーバ群の構成例を示す図である。
【発明を実施するための形態】
【００２０】
本発明を実施するための形態（以降、「実施形態」と称す。）の比較例として、同じキャッシュラインにアクセスする並列カウント処理装置（マルチコアプロセッサ）について説明する。次に、第１実施形態として、スループットのスケーラビリティを確保可能な並列カウント処理装置（マルチコアプロセッサ）について説明し、第２実施形態として、第１実施形態の並列カウント処理装置（マルチコアプロセッサ）を通信装置に適用したケースについて説明し、第３実施形態として、複数のサーバによって構成されるサーバ群における並列カウント処理について説明する。以下に、比較例および各実施形態について、適宜図面を参照しながら詳細に説明する。
【００２１】
（カウント処理）
はじめに、数をカウントするカウント処理について説明する。本発明のカウント処理では、インクリメント処理またはデクリメント処理が定義でき、更に、交換法則および結合法則が成り立つものとする。
まず、インクリメント処理とは、これ以上砕くことのできない最小の演算処理を指すものとする。具体的には、ある空間において、原子的な値（シンボル）ｏが定義でき、その空間を満たす値が、すべて下記式の関数ｓのように表現できる場合をインクリメント処理と呼ぶことにする。ただし、下記式に示した関数ｓは、＋１のインクリメントの場合を示している。なお、関数ｓは、例えば、３の倍数しか出現しない空間であれば＋３のインクリメントを表すものであっても良い。
【００２２】
ｏ≡０
ｓ（ｏ）≡１
ｓ（ｓ（ｏ））＝ｓ２（ｏ）≡２
・・・
ｓ（ｓ（・・ｓ（ｏ）・・））＝ｓＮ（ｏ）≡Ｎ
【００２３】
この場合、便宜的に関数ｓの再帰回数をそのまま、整数値として表現しても一般性は失われない。
また、マグニチュードのような対数空間ではｓ（ｘ）＝Ａｘと表しても良い。
【００２４】
また、デクリメント処理は、下記式を満たすような関数ｓ−１で表すことができる。
ｓ（ｓ（・・ｓ（ｏ）・・））＝ｓＮ（ｏ）≡Ｎ
ｓ−１（Ｎ）＝ｓ−１（ｓＮ（ｏ））＝ｓＮ−１（ｏ）≡Ｎ−１
【００２５】
前記関数ｓとして、２項演算ｆ（ｘ，ｙ）が定義できるとき、ｆについて交換・結合法則が成り立つとは、下記式のように、ｆをどのように入れ換えても、またどのような順番で演算を行っても結果が同じとなることを意味している。
ｆ（ｆ（ｘ，ｙ），ｚ）＝ｆ（ｘ，ｆ（ｙ，ｚ））
ｆ（ｘ，ｙ）＝ｆ（ｙ，ｘ）
【００２６】
例えば、ｆ（ｘ，ｙ）＝ｓｙ（ｘ）は、上記式を満足し、加減算の空間だけでなく、乗除算の（１次元）空間等も本発明の処理対象としても良い。
【００２７】
（比較例の並列カウント処理装置）
ここで、比較例の並列カウント処理装置（マルチコアプロセッサ）の機能例について、図１を用いて説明する。次に、比較例の並列カウント処理装置において、図２（ａ）では処理シーケンス例について説明し、図２（ｂ）では処理フロー例について説明する。
【００２８】
比較例の並列カウント処理装置は、マルチコアプロセッサであり、図１に示すように論理的に表現した場合、複数のスレッドを並列に処理する並列スレッド処理部と、並列スレッド処理部からアクセスされる共有カウント記憶部とで構成される。図１の並列カウント処理装置は、複数のスレッド［０］〜［Ｍ−１］を並列に実行する。便宜的に、数をカウントするスレッドを実行しているコアをカウント処理部と称することにする。また、共有カウント記憶部は、Ｌ２（Level ２）キャッシュにおいて、メモリ上の所定のアドレスで指定されたキャッシュラインを表している。
【００２９】
図１の並列カウント処理装置は、カウント処理部のいずれかがカウント数を変更するたびに、共有カウント記憶部に記憶している累積カウント数（カウント処理部によってカウントされた数の合計数）を書き込み更新する。そして、並列カウント処理装置は、累積カウント数の更新のたびに、キャッシュコヒーレンスをとる必要がある。そのため、カウント処理部の数（言い換えると、並列処理するスレッドを実行するコアの数）を増加した場合、並列処理数の増加に応じて、カウント処理部間でキャッシュコヒーレンスをとる回数が増加し、キャッシュコヒーレンスに費やす処理時間が増大して、スループットのスケーラビリティを確保することが困難になる。
【００３０】
次に、図１の並列カウント処理装置における動作例について、図２を用いて説明する（適宜、図１参照）。なお、図２では、並列カウント処理装置の累積カウント数の上限値が３０のケースを例示している。
【００３１】
まず、図１の並列カウント処理装置における処理シーケンス例について、図２（ａ）を用いて説明する（適宜、図１参照）。各スレッド［０］〜［Ｍ−１］は、累積カウント数３０を限界値として、３０未満であれば、＋１の増加をカウントする。そのため、各スレッド［０］〜［Ｍ−１］は、共有カウント記憶部（同じキャッシュライン）に記憶されている累積カウント数をループで３０以下か確認し続ける。
【００３２】
そして、数のカウントを開始してからある時間経過後に、スレッド［０］が＋１の増加をカウントし、共有カウント記憶部の累積カウント数を１０に更新する。この際、スレッド［０］は、他のスレッド［１］〜［Ｍ−１］とキャッシュコヒーレンスを一箇所ずつとる。そのため、スレッドの数（カウント処理部の数）が増加すると、キャッシュコヒーレンスに費やされる時間が増大する。
【００３３】
次に、スレッド［Ｍ−１］は、キャッシュコヒーレンスの後、＋１の増加をカウントし、共有カウント記憶部の累積カウント数を１１に更新する。この際、スレッド［Ｍ−１］は、他のスレッド［０］〜［Ｍ−２］とキャッシュコヒーレンスを一箇所ずつとる。
以降、同様にして、各スレッドがカウントアップしていく。なお、共有カウント記憶部への書き込み更新は、atomicな処理（変更中の状態があたかも存在しないように見せる処理）であり、キャッシュラインに早く書き込んだもの以外は、ＭＥＳＩプロコトル等によって破棄される。
【００３４】
図２（ｂ）は、図２（ａ）の処理シーケンス例を、処理フロー形式で表したものである（適宜、図１参照）。
【００３５】
ステップＳ２０１では、カウント処理部は、共有カウント記憶部から累積カウント数Ｖを読み出し、カウント数の変化分ｘを、Ｖに加算し、仮の累積カウント数ｖ’を算出する。ただし、変化分ｘは、正の場合には増加数を表し、負の場合には減少数を表す。
【００３６】
ステップＳ２０２では、カウント処理部は、仮の累積カウント数ｖ’が累積カウント数の限界値の範囲（０以上、Ｔ未満）に入るか否かを判定する。ただし、Ｔは、並列カウント処理装置の累積カウント数の上限値を表す。
【００３７】
仮の累積カウント数ｖ’が累積カウント数の限界値の範囲（０以上、Ｔ未満）に入ると判定した場合（ステップＳ２０２でＹｅｓ）、ステップＳ２０３では、カウント処理部は、共有カウント記憶部に記憶されている累積カウント数Ｖを仮の累積カウント数ｖ’で置き換え更新をする。なお、図２（ｂ）中で、破線の四角で表示しているステップは、キャッシュコヒーレンスをともなう処理であることを表す。
【００３８】
そして、ステップＳ２０４では、並列カウント処理装置を備えたシステム（不図示）は、カウント範囲内の場合の処理Ａを実行する。そして、処理は、ステップＳ２０１へ戻る。なお、処理Ａは、例えば、並列カウント処理装置がダウンロードサイトに備えられている場合には、そのダウンロードサイトがダウンロードを受け付ける処理を表す。
【００３９】
また、ステップＳ２０２において、仮の累積カウント数ｖ’が累積カウント数の限界値の範囲（０以上、Ｔ未満）に入らないと判定した場合（ステップＳ２０２でＮｏ）、ステップＳ２０５では、並列カウント処理装置を備えたシステム（不図示）は、カウント範囲外の場合の処理Ｂを実行する。そして、処理は、ステップＳ２０１へ戻る。なお、処理Ｂは、例えば、並列カウント処理装置がダウンロードサイトに備えられている場合には、そのダウンロードサイトがダウンロードを受け付けないことを表す。
【００４０】
以上説明したように、比較例では、カウント処理部におけるカウント数が変化するたびに、キャッシュコヒーレンスの処理が発生するため、カウント処理の並列処理数の増加に応じて、スループットのスケーラビリティを確保することが困難である。
【００４１】
（第１実施形態）
そこで、第１実施形態では、カウント処理の並列処理数の増加に応じて、スループットのスケーラビリティを確保可能な並列カウント処理装置（マルチコアプロセッサ）の構成例について、図３を用いて説明する。
【００４２】
図３に示す並列カウント処理装置３００は、構成を論理的に表現した場合、並列スレッド処理部３１０および共有カウント記憶部３２０で表される。並列スレッド処理部３１０は、複数のカウント処理部３１１と、カウント処理部３１１ごとに設けられるローカルカウント記憶部３１２（請求項に記載の第１の記憶部）とで論理的に形成される。
並列カウント処理装置３００は、マルチコアプロセッサであり、複数のスレッド［０］〜［Ｍ−１］を並列に実行する。便宜的に、数をカウントするスレッドを実行しているコアをカウント処理部３１１と称する。また、共有カウント記憶部３２０は、Ｌ２キャッシュのメモリ上の所定のアドレスで指定されたキャッシュラインを表している。
【００４３】
ローカルカウント記憶部３１２は、コア［０］〜［Ｎ−１］ごとに設けられ、Ｌ２キャッシュのメモリ上の所定のアドレス（共有カウント記憶部３２０とは異なるアドレス）で指定されたキャッシュラインを表している。ここで、並列カウント処理装置３００がカウントする累積カウント数Ｖの限界値の範囲を下限値０〜上限値Ｔとするとき、それぞれのコア［ｉ］のローカルカウント記憶部３１２に対して、カウント数の限界値の範囲（下限値０〜上限値ｔｉ）を配分する。
具体的には、カウント処理部３１１ごとのカウント数の限界値の範囲の上限値（以降、単に、上限値と称すこともある。）をｔｉで表すと、コア数がＮ個の場合、上限値はｔ０，・・、ｔＮ−１となる。なお、上限値ｔｉの合計値は、初期値として、Ｔ以下となるように設定される。例えば、任意のｉに対して、ｔｉ＝Ｔ／（２Ｎ）のように、上限値ｔｉの合計値の初期値は、Ｔ未満であっても構わない。
【００４４】
そして、カウント処理部３１１は、カウント数が上限値ｔｉ未満の場合おいては、スレッドの処理を実行しているコアに対応するローカルカウント記憶部３１２を用いて、カウントを実行する。そして、カウント処理部３１２は、カウントした数をローカルカウント記憶部３１２に記憶する。
【００４５】
また、共有カウント記憶部３２０（請求項に記載の第２の記憶部）は、次式（１）で示される残数ｒを記憶している。なお、残数ｒは、各カウント処理部３１１から共通にアクセス可能な共有変数である。
ｒ＝Ｔ−Σｔｉ  （ただし、０≦ｉ≦Ｎ−１）      ・・式（１）
【００４６】
そして、カウント処理部３１１は、カウント数がローカルカウント記憶部３１２に記憶している限界値の範囲の上限値ｔｉ未満の場合には、共有カウント記憶部３２０の残数ｒを更新する必要がない。なお、カウント処理部３１１は、カウント数がローカルカウント記憶部３１２に記憶している限界値の範囲の上限値ｔｉを超える場合には、共有カウント記憶部３２０の残数ｒを更新することになる。ただし、共有カウント記憶部３２０の残数ｒを更新する場合には、キャッシュコヒーレンスをとる必要がある。
つまり、図３に示す並列カウント処理装置３００の構成は、カウントした数がローカルカウント記憶部３１２に記憶している限界値の範囲の上限値ｔｉ未満の場合には、カウント処理の並列処理数の増加に応じて、スループットのスケーラビリティを確保することが可能である。
【００４７】
次に、第１実施形態の並列カウント処理装置３００（マルチコアプロセッサ）の処理シーケンス例について、図４を用いて説明する（適宜、図３参照）。なお、図４は、複数のスレッド［０］〜［２］、すなわち、３個のカウント処理部３１１によって並列にカウントするケースを示している。また、各カウント処理部３１１のカウント数の上限値ｔｉが５であって、並列カウント処理装置３００の累積カウント数の上限値Ｔが３０の場合を表している。このとき、残数ｒは、式（１）を用いて、１５と算出される。
【００４８】
各スレッド［０］〜［２］は、カウントした数ｖ’が３＋１＝４までは、ローカルカウント記憶部３１２を用いてカウントする。したがって、このカウント数ｖ’＝４までは、カウント数の上限値ｔｉ＝５未満であるので、キャッシュコヒーレンスが必要とされない。
【００４９】
次に、スレッド［０］が、カウント数ｖ’＝３＋１の後、＋１の増加のカウントを実行する。具体的には、カウント数ｖ’は４＋１＝５となる。カウント数ｖ’＝５では、カウント数の限界値の範囲（０以上、ｔｉ＝５未満）に入らないと判断されて、ローカルカウント記憶部３１２に記憶している限界値の範囲の上限値ｔｉを増加する処理が開始される。まず、スレッド［０］は、共有カウント記憶部３２０に記憶している残数ｒから必要とする分を減ずることが可能かを判定する。ただし、残数ｒの減算には、atomicな処理を用いる。これにより、他のスレッドが、次の判定処理（ステップＳ５０９）の前に残数ｒを減じてしまっても安全側に判定が行われるようにしている。言い換えると、並列カウント処理装置３００が残数ｒを実際よりも大きいと誤認して、本来の並列カウント処理装置３００の累積カウント数の上限値Ｔを超えるようなカウントアップが発生しないようにすることができる。
【００５０】
スレッド［０］は、カウント数ｖ’＝３＋１の後、カウント数ｖ’を＋１増加するとともに、残数ｒを「１」減算する演算処理を実行する。すなわち、残数ｒは、ｒ＝ｒ−１＝１５−１＝１４となる。次に、スレッド［０］は、残数ｒ＝１４が、０以上でかつ累積カウント数の上限値Ｔ未満の範囲に入るか否かを判定する。スレッド［０］は、残数ｒ＝１４が０以上でかつ累積カウント数の上限値Ｔ未満の範囲に入ると判定した場合、ローカルカウント記憶部３１２に記憶している限界値の範囲の上限値ｔｉを＋１増加するように更新する。
【００５１】
次に、スレッド［１］は、前記したスレッド［０］の処理の場合と同様に、カウント数ｖ’＝３＋１の後、カウント数ｖ’を＋１増加するとともに、共有カウント記憶部３２０に記憶されている残数ｒから「１」を減算する演算処理を実行して残数ｒ＝１３とする。スレッド［１］は、残数ｒ＝１３が０以上でかつ累積カウント数の上限値Ｔ未満の範囲に入ると判定した場合、ローカルカウント記憶部３１２に記憶している限界値の範囲の上限値ｔｉを＋１増加するように更新する。
【００５２】
前記したように、共有カウント記憶部３２０の残数ｒを更新するときには、キャッシュコヒーレンスが必要とされる。しかし、残数ｒが変更されない間は、キャッシュコヒーレンスが必要とされないため、カウント処理の並列処理数の増加に応じて、スループットのスケーラビリティを確保することが可能となる。
【００５３】
そして、残数ｒが０未満になったときに、並列カウント処理装置３００は、並列カウント処理装置３００のカウント数の上限値Ｔに到達していると判定する。
【００５４】
次に、第１実施形態の並列カウント処理装置３００における処理フロー例について、図５を用いて説明する（適宜、図３参照）。なお、図５に示す処理フロー例の中で、実線の矩形で表されたステップは、キャッシュコヒーレンスを必要としない処理を表す。また、破線の矩形で表されたステップは、キャッシュコヒーレンスを必要とする処理を表す。
また、図５で用いられる変数のうち、ｖｉ、ｖ’ｉ、およびｔｉは、カウント処理部ｉにおいて用いられる変数であり、ｖｉはカウント済みの数値、ｖ’ｉは仮のカウント数を表し、ｔｉはカウント処理部ｉに設定されるカウント数の限界値の範囲（請求項に記載の第１の限界値の範囲）の上限値を表す。ただし、図５では、ｖ’ｉ≧０である。ｒは共有カウント記憶部３２０に記憶されている残数（前記式（１）参照）を表し、Ｔは並列カウント処理装置３００の累積カウント数の限定値の範囲（請求項に記載の第２の限界値の範囲）の上限値を表す。また、変数ｘは単位時間当たりのカウント数の変化分を表しており、正の場合は増加数を表し、負の場合は減少数を表すものとする。
【００５５】
ステップＳ５００では、ｖｉとｔｉとの初期値が設定される。すなわち、カウント処理部３１１は、ｖｉ＝０およびｔｉ＝ｔ０を設定する。ただし、ｔ０は、並列カウント処理装置３００の累積カウント数の上限値Ｔとコアの数Ｎとに基づいて予め決められた値である。例えば、ｔ０＝Ｔ／（２Ｎ）としても良い。
【００５６】
ステップＳ５０１では、カウント処理部３１１は、現在のカウント数ｖｉに変化分ｘを加算し、加算した値をｖ’ｉとする。
【００５７】
ステップＳ５０２では、カウント処理部３１１は、ｖ’ｉがカウント数の限界値の範囲（０以上ｔｉ未満）に入るか否かを判定する。
【００５８】
ｖ’ｉがカウント数の限界値の範囲に入ると判定した場合（ステップＳ５０２でＹｅｓ）、ステップＳ５０３では、カウント処理部３１１は、（ｔｉ−ｖ’ｉ）が残数ｒより大きいか否かを判定する。ここで、残数ｒは、共有変数であり、共有カウント記憶部３２０に記憶されている値である。
【００５９】
（ｔｉ−ｖ’ｉ）が残数ｒ以下であると判定した場合（ステップＳ５０３でＮｏ）、ステップＳ５０６では、カウント処理部３１１は、ｖｉをｖ’ｉで置き換える。
【００６０】
ステップＳ５０７では、カウント処理部３１１は、カウント範囲内の場合の処理Ａを実行する。そして、処理は、ステップＳ５０１へ戻る。なお、処理Ａは、例えば、並列カウント処理装置３００がダウンロードサイトに備えられている場合には、そのダウンロードサイトがダウンロードを受け付ける処理を表す。
【００６１】
また、ステップＳ５０３において、（ｔｉ−ｖ’ｉ）が残数ｒより大きいと判定した場合（ステップＳ５０３でＹｅｓ）、ステップＳ５０４では、カウント処理部３１１は、ｔｉを｛ｔｉ−（ｔｉ−ｖ’ｉ）／２｝で置き換える。
【００６２】
ステップＳ５０５では、カウント処理部３１１は、共有カウント記憶部３２０の残数ｒを｛ｒ＋（ｔｉ−ｖ’ｉ）／２｝で書き換え更新する。そして、処理はステップＳ５０６へ進む。
【００６３】
前記したステップ５０３の処理は、（ｔｉ−ｖ’ｉ）が残数ｒより大きい場合には、他のカウント処理部３１１においてカウント可能となるように、そのカウント処理部３１１が保持しているカウント数の限界値の範囲の上限値ｔｉを開放（減少）するためのものである。
【００６４】
次に、ステップＳ５０２において、ｖ’ｉがカウント数の限界値の範囲に入らないと判定した場合（ステップＳ５０２でＮｏ）、ステップＳ５０８では、カウント処理部３１１は、共有カウント記憶部３２０の残数ｒをｒ−（ｖ’ｉ−ｔｉ＋１）と書き換え更新する。このステップＳ５０８の処理は、atomicな処理で行われ、残数ｒから必要とする（ｖ’ｉ−ｔｉ＋１）分を減ずることが可能かを確認するとともに、他のカウント処理部３１１によって同時に残数ｒが更新されて、キャッシュコヒーレンスがとれなくならないようにするためのものである。
【００６５】
ステップＳ５０９では、カウント処理部３１１は、残数ｒが累積カウント数の限界値の範囲（０以上Ｔ未満）に入るか否かを判定する。ただし、Ｔは、予めローカルカウント記憶部３１２に記憶されているものとする。
【００６６】
残数ｒが累積カウント数の限界値の範囲に入ると判断した場合（ステップＳ５０９でＹｅｓ）、ステップＳ５１０では、カウント処理部３１１は、ｔｉをｔｉ＋（ｖ’ｉ−ｔｉ＋１）と書き換える。そして、処理はステップＳ５０６へ進む。
【００６７】
また、ステップＳ５０９において、残数ｒが累積カウント数の限界値の範囲に入らないと判断した場合（ステップＳ５０９でＮｏ）、ステップＳ５１１では、カウント処理部３１１は、共有カウント記憶部３２０の残数ｒをｒ＋（ｖ’ｉ−ｔｉ＋１）と書き換え更新する。すなわち、カウント処理部３１１は、残数ｒを、ステップＳ５０８の処理前の数値に戻す処理を行う。
【００６８】
ステップＳ５１２では、カウント処理部３１１は、カウント範囲外の場合の処理Ｂを実行する。そして、処理は、ステップＳ５０１へ戻る。なお、処理Ｂは、例えば、並列カウント処理装置３００がダウンロードサイトに備えられている場合には、そのダウンロードサイトがダウンロードを受け付けない処理を表す。
【００６９】
ここで、図５の処理フロー例について、いくつかの変形例について以下に説明する。
ステップＳ５０４およびステップＳ５０５では、（ｔｉ−ｖ’ｉ）／２を用いているが、これに限られず、（ｔｉ−ｖ’ｉ）に対する所定の割合の値を用いることとしても良い。
また、ステップＳ５０７の処理およびステップＳ５１２の処理は、カウント処理部３１１が行うものとして説明したが、並列スレッド処理部３１０または並列カウント処理装置３００が実行しても構わない。具体的には、ステップＳ５０７では、カウント処理部３１１がステップＳ５０６の処理終了の情報を並列スレッド処理部３１０または並列カウント処理装置３００に送信して、並列スレッド処理部３１０または並列カウント処理装置３００がステップＳ５０７の処理を実行する。また、ステップＳ５１２では、カウント処理部３１１がステップＳ５１０の処理終了の情報を並列スレッド処理部３１０または並列カウント処理装置３００に送信して、並列スレッド処理部３１０または並列カウント処理装置３００がステップＳ５１２の処理を実行する。
【００７０】
また、図５では、ｖ’ｉ≧０として説明したが、ｖ’ｉ≦０の場合には、ｖｉ、ｖ’ｉ、ｔｉ、ｒ、およびＴについて、正負の符号を反転させた上で、図５と同じ処理フロー例を実行すれば良い。
【００７１】
以上説明したように、第１実施形態の並列カウント処理装置３００は、マルチコアプロセッサであり、例えば、１つのＣＰＵ（Central Processing Unit）に多数のコアを設けたメニーコアプロセッサと呼ばれるダイに、コア数を数十〜数百有するプロセッサが該当する。そして、各カウント処理部３１１は、ローカルカウント記憶部３１２に記憶しているカウント数の限界値の範囲内であれば、共有カウント記憶部３２０の残数ｒを更新する必要がないため、すなわち、キャッシュコヒーレンスの処理を不要とするため、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【００７２】
（第２実施形態）
次に、第２実施形態では、第１実施形態の並列カウント処理装置（マルチコアプロセッサ）を通信装置に適用したケースについて、図６を用いて説明する。
【００７３】
図６は、第１実施形態の並列カウント処理装置３００を備える通信装置６００と、ユーザが使用する端末６５０とが、ネットワーク６４０を介して通信可能に接続されている構成を示している。
なお、図６では、通信装置６００は、１台しか記載していないが、２台以上であっても構わない。また、端末６５０は、２台しか記載していないが、３台以上であっても構わない。
【００７４】
通信装置６００は、例えば、動画共有サイトやダウンロードサイト等として動作するサーバである。この場合、通信装置６００は、同時接続数やダウンロード回数等に上限を設定し、通信サービス等の情報提供を行う機能を備える。また、通信装置６００は、例えば、ＳＩＰサーバであっても良い。この場合、通信装置６００は、端末６５０間の通信接続を制御し、通信に用いるセッション数に上限を設定する機能を備える。
端末６５０は、例えば、ＰＣ（Personal Computer）であり、通信装置６００にネットワーク６４０を介してアクセスする機能を備える。
【００７５】
図６に示すように、通信装置６００は、少なくとも、情報受信部６１０、振分処理部６２０、並列カウント処理装置３００、および情報送信部６３０を備える。通信装置６００は、図示しないＣＰＵおよびメインメモリによって構成される処理部（不図示）とアプリケーションプログラム等を記憶する記憶部（不図示）とで構成される。処理部は、記憶部に記憶されているアプリケーションプログラムをメインメモリに展開して、振分処理部６２０および並列カウント処理装置３００を具現化する。また、処理部は、情報受信部６１０、振分処理部６２０、並列カウント処理装置３００、および情報送信部６３０の間のデータの送受信等の制御を行う。
【００７６】
情報受信部６１０は、端末６５０から送信された情報を受信し、受信した情報を振分処理部６２０に受け渡す。
振分処理部６２０は、受信した情報の処理を担当するカウント処理部３１１を決定し、当該カウント処理部３１１に、受信した情報を受け渡す。担当するカウント処理部３１１の決定は、例えば、受信した情報の一部をハッシュ関数等に適用する処理に基づいて行われる。
並列カウント処理装置３００は、図３に示した構成と同様であるので、その詳細を省略する。
情報送信部６３０は、情報受信部６１０が受信した情報に対応する応答情報を端末６５０に送信する。
【００７７】
通信装置６００における処理シーケンス例について、図７を用いて説明する。
図７において、並列スレッド処理部３１０は、マルチスレッドプログラムの実行を開始する。その際、Ｍ本のスレッドを立ち上げるコアの個数Ｎが確定される。
そして、ステップＳ７０１では、並列スレッド処理部３１０は、共有カウント記憶部３２０とローカルカウント記憶部３１２との整合性をとるための初期設定を実行する。
【００７８】
ステップＳ７０２では、並列スレッド処理部３１０は、各カウント処理部３１１のカウント数の限界値の範囲（０以上、ｔｉ未満）を設定する。
【００７９】
ステップＳ７０３では、情報受信部６１０は、端末６５０から情報ｑを受信する。
ステップＳ７０４では、情報受信部６１０は、情報ｑを振分処理部６２０に受け渡す。
ステップＳ７０５では、振分処理部６２０は、情報ｑの所定の箇所のデータに基づいて、担当するスレッドを決定する。具体的には、振分処理部６２０は、情報ｑの所定の箇所のデータをハッシュ関数等に適用して、担当するスレッドを決定する。
【００８０】
ステップＳ７０６では、カウント処理部３１１は、カウント数が限界値の範囲内（０以上、ｔｉ未満）の処理では、ローカルカウント記憶部３１２を用いてカウント処理を実行する。
または、ステップＳ７０７のように、カウント処理部３１１は、カウント数が限界値の範囲外となる場合には、共有カウント記憶部３２０に記憶されている残数ｒの更新処理を実行し、キャッシュコヒーレンスの必要な処理を行う。
【００８１】
そして、ステップＳ７０８では、カウント処理部３１１は、残数ｒが通信装置６００の累積カウント数の限界値の範囲（０以上Ｔ未満）内に入ると判定した場合、所定の処理を実行し、応答データを情報送信部６３０に受け渡す。所定の処理とは、例えば、受信した情報ｑに対応する応答データを生成することである。
また、ステップＳ７０８において、カウント処理部３１１は、残数ｒが通信装置６００の累積カウント数の限界値の範囲（０以上Ｔ未満）内に入らないと判定した場合、受信した情報ｑを受け付けられない旨の応答データを生成し、情報送信部６３０に受け渡す。
【００８２】
ステップＳ７０９では、情報送信部６３０は、カウント処理部３１１から受け取った応答データを、応答情報としてネットワーク６４０を介して端末６５０に送信する。
【００８３】
以上説明したように、第２実施形態の通信装置６００は、第１実施形態の並列カウント処理装置３００を備えている。通信装置６００がセッションを用いて通信を管理する装置である場合には、カウントする数は、センション数（接続回線数）となる。また、通信装置６００が通信サービス等の情報提供を実行する装置である場合には、カウントする数は、端末６５０によってダウンロードされた回数となる。
そして、各カウント処理部３１１は、ローカルカウント記憶部３１２に記憶しているカウント数の限界値の範囲内であれば、共有カウント記憶部３２０の残数ｒを更新する必要がなく、キャッシュコヒーレンスのための処理を不要とする。そのため、通信装置６００の並列カウント処理装置３００は、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【００８４】
（第３実施形態）
次に、第３実施形態では、複数のサーバによって構成されるクラスタ構成のサーバ群における並列カウント処理について、図８を用いて説明する。
【００８５】
図８に示すように、サーバ群８００は、複数のサーバ８１０と１台のサーバ８１０ａとによって構成される。なお、サーバ８１０とサーバ８１０ａとの違いは、サーバ８１０ａがサーバ共有カウント記憶部３２０ｂを備えていることである。
【００８６】
サーバ８１０は、図６に示した通信装置６００と同様の構成を備えているが、図８では、情報受信部６１０、振分処理部６２０、および情報送信部６３０の記載を省略している。なお、サーバカウント記憶部３２０ａ（３２０）は、図６の共有カウント記憶部３２０の名称を変更しただけであり、サーバ８１０に割り当てられた累積カウント数の残数ｒ１を記憶している。
また、サーバ８１０ａが備えるサーバ共有カウント記憶部３２０ｂ（３２０）は、サーバ群８００全体に割り当てられた累積カウント数の残数ｒ２を記憶しており、複数のサーバ８１０からコヒーレンスを必要とする残数ｒ２の書き換え更新の対象となる。
【００８７】
まず、サーバ８１０のカウント処理部３１１は、ローカルカウント記憶部３１２に記憶されているカウント数の限界値の範囲内では、キャッシュコヒーレンスをともなわないカウント処理を実行する。そして、カウント処理部３１１は、ローカルカウント記憶部３１２に記憶されているカウント数の限界値の範囲外では、キャッシュコヒーレンスをともなう、サーバカウント記憶部３２０ａの残数ｒ１の更新（図８中の破線矢印）を実行しつつカウント処理を実行する。すなわち、サーバ８１０内では、ローカルカウント記憶部３１２が請求項に記載の第１の記憶部であり、サーバカウント記憶部３２０ａが請求項に記載の第２の記憶部となる。
【００８８】
次に、カウント処理部３１１は、サーバカウント記憶部３２０ａの残数ｒ１が０未満になった場合、サーバ８１０ａのサーバ共有カウント記憶部３２０ｂ（３２０）の残数ｒ２を更新しつつ（図８の一点鎖線）、コヒーレンスを必要とするカウント処理を実行する。
【００８９】
なお、図８では、１台のサーバ８１０ａがサーバ共有カウント記憶部３２０ｂを備えるものとしたが、サーバ８１０のそれぞれが、サーバ８１０間で共通にアクセスされるサーバ共有カウント記憶部３２０ｂを備えるようにしても構わない。
【００９０】
以上、第３実施形態のサーバ群８００は、第１実施形態の並列カウント処理装置３００（図３参照）と対比したとき、サーバ８１０が並列スレッド処理部３１０（図３参照）に相当し、サーバ共有カウント記憶部３２０ｂ（３２０）が共有カウント記憶部３２０（図３参照）に相当する。すなわち、サーバ群８００全体としては、ローカルカウント記憶部３１２およびサーバカウント記憶部３２０ａが請求項に記載の第１の記憶部に対応し、サーバ共有カウント記憶部３２０ｂが請求項に記載の第２の記憶部に対応する。ただし、サーバカウント記憶部３２０ａが請求項に記載の第１の記憶部に対応するという意味は、サーバ８１０のカウント数の限界値の範囲内では、サーバ共有カウント記憶部３２０ｂの残数ｒ２を更新しない、すなわち、サーバ８１０間のコヒーレンスを不要とするということである。
【００９１】
以上、第１実施形態で説明した並列カウント処理装置３００では、各カウント処理部３１１は、ローカルカウント記憶部３１２に記憶されているカウント数の限界値の範囲内であれば、共有カウント記憶部３２０の残数ｒを更新する必要がないため、すなわち、キャッシュコヒーレンスのための処理を不要とするため、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【００９２】
第２実施形態では、第１実施形態で説明した並列カウント処理装置３００を備える通信装置６００について説明した。すなわち、通信装置６００においては、ローカルカウント記憶部３１２に記憶されている限界値の範囲内であれば、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【００９３】
また、第３実施形態では、サーバ群８００を構成する複数のサーバ８１０が第１実施形態の並列カウント処理装置３００を備えるようにした。さらに、サーバ８１０ａは、サーバ群８００全体の残数ｒ２を記憶しているサーバ共有カウント記憶部３２０ｂを備えた。そして、サーバ群８００全体の構成は、第１実施形態の並列カウント処理装置３００における並列カウント処理部３１０と共有カウント記憶部３２０との構成と類似するようにした。そのため、サーバ群８００は、ローカルカウント記憶部３１２に記憶されている限界値の範囲内であれば、並列に処理するスレッドの数を増加させても、スループットのスケーラビリティを確保することが可能となる。
【符号の説明】
【００９４】
３００  並列カウント処理装置
３１１  カウント処理部
３１２  ローカルカウント記憶部（第１および第３実施形態における第１の記憶部）
３２０  共有カウント記憶部（第１実施形態における第２の記憶部）
６００  通信装置
８００  サーバ群
８１０，８１０ａ  サーバ
３２０ａ  サーバカウント記憶部
３２０ｂ  サーバ共有カウント記憶部（第３実施形態における第２の記憶部）
ｒ  残数
ｔｉ  第１の限界値の範囲の上限値
Ｔ  第２の限界値の範囲の上限値
【図１】
0005458030.tif 000002
【図２】
0005458030.tif 000003
【図３】
0005458030.tif 000004
【図４】
0005458030.tif 000005
【図５】
0005458030.tif 000006
【図６】
0005458030.tif 000007
【図７】
0005458030.tif 000008
【図８】
0005458030.tif 000009