(57)【要約】【課題】疎結合マルチプロセッサ構成の制御装置におけるプロセッサ間通信方法において、プロセッサ間で大量のデータを高速に通信することを可能にする。【解決手段】プロセッシングユニット（PU)間の転送データをローカルメモリLMに書き込むことで、共有メモリSMに対するアクセスのオーバヘッドをなくし、転送データの書き込みが完了してから、プロセッサ１ａのブロック転送命令あるいはDMAで、転送元ローカルメモリLMから共有メモリSMへまとめて転送を行うことで、大量データの高速転送を実現する。転送データの書き込み完了は、OS等が持っている解放系同期基本操作を行ったタイミングでそれとみなす。次に、転送データの読み込みに先立って、プロセッサ１ａのブロック転送命令あるいはDMAで、共有メモリSMから転送先ローカルメモリLMにまとめて転送を行う。転送データの読み込み開始は、OSの獲得系同期基本操作を行ったタイミングでそれとみなす。【選択図】図１
2007280127.tif 000002
【特許請求の範囲】
【請求項１】
ローカルメモリをそれぞれ持つ複数のプロセッサとプロセッサ間通信用の共有メモリとが共有バスで接続されたマルチプロセッサシステムのプロセッサ間通信方法であって、
前記複数のプロセッサの内のあるプロセッサから他のプロセッサへデータを転送する際に、獲得系同期基本操作及び解放系同期基本操作の中で前記ローカルメモリと前記共有メモリ間でデータ転送を行うことを特徴とするプロセッサ間通信方法。
【請求項２】
ローカルメモリをそれぞれ持つ複数のプロセッサと通信データ領域を持つプロセッサ間通信用の共有メモリとが共有バスで接続され、前記各プロセッサはキャッシュメモリを有しないか、有する場合でも前記キャッシュメモリが共有メモリ領域についてデータ一貫性を保つ仕組みを持たないマルチプロセッサシステムのプロセッサ間通信方法であって、
前記共有メモリの通信データ領域と、前記複数のプロセッサの内のデータを送信するための送信プロセッサの転送元ローカルメモリ、及びデータを受信するための受信プロセッサの転送先ローカルメモリと、を対応付け、前記共有メモリの通信データ領域を排他制御する排他制御用変数を持ち、
前記送信プロセッサがデータを送信するとき、前記転送元ローカルメモリに書き込み、前記対応付けされた共有メモリの通信データ領域に対し解放系同期基本操作を行ったタイミングで、前記転送元ローカルメモリから前記共有メモリへまとめて転送を行い、
前記受信プロセッサがデータを受信するとき、データの読み込みに先立ち前記共有メモリの通信データ領域に対し獲得系同期基本操作を行ったタイミングで、前記共有メモリから前記転送先ローカルメモリへまとめて転送を行い、データを前記転送先ローカルメモリから読み出すことを特徴とするプロセッサ間通信方法。
【請求項３】
前記ローカルメモリと前記共有メモリ間とでデータをまとめて転送する方法として、前記プロセッサのブロック転送命令あるいはダイレクト・メモリ・アクセスを用いることを特徴とする請求項２記載のプロセッサ間通信方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサ間通信用の共有メモリを持つ疎結合マルチプロセッサ構成のシステムにおけるプロセッサ間通信方法に関するものである。
【背景技術】
【０００２】
従来、１つのシステムに複数のプロセッサを搭載し、それらのプロセッサを同時に動作させるマルチプロセッサシステムには、主記憶装置を共有する密結合マルチプロセッサ方式（共有メモリ方式（ａ））と、主記憶装置をプロセッサ毎に持つ疎結合マルチプロセッサ方式とがある。疎結合マルチプロセッサ方式には更に、単一のアドレス空間をプロセッサ間で共有し、各プロセッサから他のプロセッサのメモリ（記憶装置）にアクセス可能なもの（分散共有メモリ方式（ｂ））と、プロセッサ毎に別のアドレス空間を持つもの（以後、単に「疎結合マルチプロセッサ方式」（ｃ）という。）とに分類できる。
【０００３】
（ａ）  共有メモリ方式は、共有メモリにアクセスするときのオーバヘッド（余計に掛かる時間）と共有メモリのアクセス競合を低減するために、各プロセッサにキャッシュメモリを搭載している。このキャッシュメモリのデータ一貫性を保持するために、特別な仕組み（コヒーレントキャッシュ；共有メモリや他のプロセッサのキャッシュメモリも同時に書き換えるまたは消去する機能）を備えている。この仕組みのため、メモリの書き込み、読み出しを行うだけでプロセッサ間通信が可能となっており、プログラミングモデルとして使いやすいモデルを提供している。
【０００４】
（ｂ）  分散共有メモリ方式は、自プロセッサのローカル共有メモリにアクセスする場合は高速に行うことができるが、他プロセッサのローカル共有メモリにアクセスする場合はオーバヘッドが大きい。このため、他プロセッサのローカル共有メモリの内容を必要に応じて自プロセッサのメモリ上にキャッシュする方法を取る場合が多い。この場合も、データ一貫性を保持するために、特別な仕組み（コヒーレントキャッシュ）を備えている。この仕組みがある場合、メモリの書き込み、読み出しを行うだけでプロセッサ間通信が可能となるため、プログラミングモデルとして使いやすいモデルを提供している。
【０００５】
（ｃ）  プロセッサ毎に別のアドレス空間を持つ疎結合マルチプロセッサ方式は、例えば、通常のネットワーク・パーソナルコンピュータ（以下「PC」という。）等のように、共有メモリを用いたプロセッサ間通信は行わないので、データ一貫性のための仕組み（コヒーレントキャッシュ）を持つ必要がなく、ハードウェアを簡素化できる。
【０００６】
また、疎結合マルチプロセッサでも、プロセッサ間通信のバンド幅（つまり転送速度）を大きくするために、プロセッサ間通信用に共有メモリを持つ構成のシステム（ｄ）も存在する（例えば、下記の特許文献１に記載されている。）。この場合、共有メモリを用いたプロセッサ間通信を行うが、他のプロセッサの主記憶装置にもアクセスする構成になっていて、共有メモリをキャッシュしないため、データ一貫性の仕組みを持つ必要がない。
【０００７】
このような特許文献１等に記載された構成のシステムにおける従来のプロセッサ間通信方法では、送信プロセッサが共有メモリ上のプロセッサ間通信エリアにメッセージを格納し、送信プロセッサが受信プロセッサにプロセッサ間通信割り込み要求を発行し、受信プロセッサがプロセッサ間通信エリアからメッセージを取り出すことにより行っていた。
【０００８】
【特許文献１】特開平１１−１２０１５６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、従来のプロセッサ間通信方法では、次の（ａ）〜（ｄ）のような課題があった。
【００１０】
（ａ）  共有メモリ方式は、コヒーレントキャッシュを実装するため、システム構成が複雑になる。また、インテレクチュアル・プロパティ（知的所有権、以下「IP」という。）)としてライセンスされたキャッシュ付プロセッサコアを使用する場合、キャッシュメモリのデータ一貫性を保持する仕組みをサポートしていないコアは使用できないという課題がある。
【００１１】
（ｂ）  分散共有メモリ方式も、コヒーレントキャッシュを実装するため、共有メモリ方式と同様の課題がある。
【００１２】
（ｃ）  疎結合マルチプロセッサは、プロセッサ間通信の機能を、メモリの読み書きによってではなく、プログラムにより通信装置を制御することによって実装する必要があり、プログラムが複雑になるという課題がある。また、通信装置にも依存するが、バンド幅の大きな転送を小さなレイテンシ（待ち時間）で実現することは一般に困難である。
【００１３】
（ｄ）  プロセッサ間通信用に共有メモリを持つ疎結合マルチプロセッサは、以下の課題があった。
【００１４】
共有メモリにアクセスするためには、バスアービトレーション（バスの調停）が必要であることから、アクセスに時間がかかる。このため、大量のデータを高速に他のプロセッサに転送するためには、オーバヘッドが大きく、転送に時間がかかるばかりか、プロセッサの処理時間を浪費していた。
【００１５】
また、プログラムがプロセッサ間通信エリアという特別な領域を意識すること、プロセッサ間割り込みの制御等を行う必要があり、プログラムが繁雑になるという課題があった。
【００１６】
そこで、このような課題を解決するために、本発明では、システム構成とプログラム構成を複雑にせず、データ一貫性を保持する仕組みを提供していないプロセッサコアIPでも利用可能な、プロセッサ間通信用の共有メモリを持つ疎結合マルチプロセッサ構成をベースとした、プロセッサ間で大量のデータを高速に通信することを可能にするプロセッサ間通信方法を提供することを目的とする。
【課題を解決するための手段】
【００１７】
前記課題を解決するために、請求項１に係る発明は、ローカルメモリをそれぞれ持つ複数のプロセッサとプロセッサ間通信用の共有メモリとが共有バスで接続されたマルチプロセッサシステムのプロセッサ間通信方法であって、前記複数のプロセッサの内のあるプロセッサから他のプロセッサへデータを転送する際に、獲得系同期基本操作及び解放系同期基本操作の中で前記ローカルメモリと前記共有メモリ間でデータ転送を行うようにしている。
【００１８】
請求項２、３に係る発明では、転送データをローカルメモリに書き込むことで、共有メモリアクセスのオーバヘッドをなくし、転送データの書き込みが完了してから、プロセッサのブロック転送命令あるいはダイレクト・メモリ・アクセス（以下「DMA」という。）で転送元ローカルメモリから共有メモリへまとめて転送を行うことで、大量データの高速転送を実現する。転送データの書き込み完了は、オペレーティング・システム（以下「OS」という。）等が持っている解放系同期基本操作（例えば、排他的制御手段であるセマフォ（semaphore)V命令、シグナル（signal)、アンロック(unlock)等）を行ったタイミングでそれとみなす。次に、転送データの読み込みに先立って、プロセッサのブロック転送命令あるいはDMAで共有メモリから転送先ローカルメモリにまとめて転送を行う。転送データの読み込み開始は、OSの獲得系同期基本操作（例えば、セマフォP命令、ウェイト（wait)、ロック(lock)等）を行ったタイミングでそれとみなす。
【発明の効果】
【００１９】
請求項１に係る発明によれば、同期基本操作（獲得系同期基本操作、解放系同期基本操作）の中でローカルメモリと共有メモリ間でデータ転送を行うようにしたので、次の(i)、(ii)のような効果がある。
【００２０】
(i)  あるプロセッサにおいて一連の演算処理を行っている間はローカルメモリに書き込むため、プログラムで共有メモリを意識する必要がなく、かつ高速に書き込みができる。そして、一連の演算処理が終了し、同期基本操作を行う際に、他のプロセッサに伝達すべき演算結果をまとめてローカルメモリと共有メモリ間で書き込みを行うため、高速に書き込みができる。
【００２１】
(ii)  ローカルメモリと共有メモリ間の書き込み動作は、同期基本操作中に組み込まれているため、メインのプログラムではローカルメモリと共有メモリ間の書き込みを記述する必要がない。よって、プログラムを簡素化することができる。
【００２２】
請求項２、３に係る発明によれば、共有メモリアクセスのオーバヘッドを低減し、大量データの高速転送を実現できる。更に、データ転送のタイミングを同期基本操作とセットで行うことにより、プログラム全体の複雑さを減らすことができる。
【発明を実施するための最良の形態】
【００２３】
マルチプロセッサシステムは、ローカルメモリをそれぞれ持つ複数のプロセッサとプロセッサ間通信用の共有メモリとが共有バスで接続されている。このようなマルチプロセッサシステムのプロセッサ間通信方法において、複数のプロセッサの内のあるプロセッサから他のプロセッサへデータを転送する際に、同期基本操作（獲得系同期基本操作（wait_sem)、解放系同期基本操作(sig_sem)）の中でローカルメモリと共有メモリ間でデータ転送を行うようにしている。
【実施例１】
【００２４】
（実施例１の構成）
図１は、本発明の実施例１に係るプロセッサ間通信方法を実現するマルチプロセッサシステムの構成例を示すブロック図である。
【００２５】
このマルチプロセッサシステムは、複数のプロセッシングユニット（以下「PU」という。）１−０〜１−ｎと、これらの各PU１−０〜１−ｎが使用する共有メモリSMとを有し、これらのPU１−０〜１−ｎと共有メモリSMが共有バス３で接続されている。共有バス３には、DMAコントローラ等が接続されている。各PU１−０〜１−nは、プロセッサ１aと、主記憶メモリであるローカルメモリLMとで構成されている。プロセッサ１aのアドレス空間はPU１−０〜１−n毎に別になっている、いわゆる疎結合マルチプロセッサで、各ローカルメモリLMは、同一PU内のプロセッサ１aからのみアクセス可能である。また、各プロセッサ１aは、必要に応じてキャッシュメモリ１bを持っていてもよい。このキャッシュメモリ１bは、プロセッサ間のデータ一貫性を保証する必要はなく、単一プロセッサで通常使用されるキャッシュメモリでよい。
【００２６】
共有メモリSMは、プロセッサ１aのアドレス空間の特定の領域にマッピングされており、各プロセッサ１aは、この領域を介してデータを共有できる。共有メモリ領域はキャッシャブルとしない、つまりキャッシュメモリ１bを使用しない。
【００２７】
各プロセッサ１aが共有メモリSMにアクセスする場合には、図示しないバスアービタ（バス調停手段）に共有バス３の使用権を要求し、共有バス３の使用権を獲得した場合のみ、共有メモリSMにアクセスできる。また、プロセッサ１a間で割り込みを掛けることができる。
【００２８】
このような構成のマルチプロセッサシステムで、共有メモリSMを使用したプロセッサ間通信の実施例について述べる。
【００２９】
共有メモリSM上には、PU１−０とPU１−１との通信用領域CBUF01が配置されると共に、通信用領域CBUF01に関連する排他制御用変数領域SEM_CBUF01が配置されている。排他制御用変数領域SEM_CBUF01には、例えば、PU１−０データ読み込みコールバックルーチン（回収ルーチン）、PU１−１データ読み込みコールバックルーチン、PU１−０データ書き込みコールバックルーチン、及び、PU１−１データコールバックルーチンの先頭アドレスが格納されている。
【００３０】
PU１−０のローカルメモリLM上には通信用領域CBUF01のコピー領域LBUF0が配置され、PU１−１のローカルメモリLM上にも通信用領域CBUF01のコピー領域LBUF1が配置されている。コピー領域LBUF0,LBUF1は、それぞれPU１−０、PU１−１上で通信用領域CBUF01のバッファ領域として使用されるもので、通信用領域CBUF01とコピー領域LBUF0,LBUF1の対応関係は、それぞれPU１−０,PU１−１で管理される。
【００３１】
図２は、図１中の通信用領域CBUF01の構成を示す図である。
通信用領域CBUF01は、データサイズ２aと転送データ領域２bを含んでいる。
【００３２】
通信用領域CBUF01のデータサイズ２aは、PU１−０またはPU１−１により初期値０で初期化されているものとする。
【００３３】
（実施例１のプロセッサ間通信方法）
図３−１、図３−２は、本発明の実施例１のプロセッサ間通信方法における処理手順を示す図である。図３−１には、例えば、PU１−０上のユーザプログラムがPU１−１にデータを送信し、PU１−１上のユーザプログラムがその内容に何らかの処理を施してPU１−０に結果を返す処理の手順が示されている。図３−２には、図３−１におけるルーチン等の処理手順が示されている。
【００３４】
本実施例１のプロセッサ間通信方法において、同期基本操作(wait_sem,sig_sem)は、ユーザの定義したデータ読み込みコールバックルーチン、データ書き込みコールバックルーチンを起動するようになっているものとする。排他制御用変数領域SEM_CBUF01では、同期基本操作(wait_sem,sig_sem)で起動されるデータ読み込みコールバックルーチン、データ書き込みコールバックルーチンがPU毎に関連付けられているものとする。
【００３５】
図３−１に示すプロセッサ間通信方法では、下記の（Ａ）ステップＳ１、（Ｂ）ステップＳ２、（Ｃ）ステップＳ３に従って処理が行われる。
【００３６】
（Ａ）  PU１−０：送信プログラムの処理（ステップＳ１）
先ず、PU１−０からPU１−１にデータを送信するために、PU１−０上のユーザの送信プログラムを起動する。PU１−０上の送信プログラムは、最初に、共有メモリSM上に配置された通信用領域CBUF01の排他制御のために、共有メモリSM上の排他制御用変数領域SEM_CBUF01を使ってOSの資源獲得待ちシステムコールwait_semを呼び出して、通信用領域CBUF01の獲得を試みる。
【００３７】
OSの資源獲得待ちシステムコールwait_semは、共有メモリSM上の排他制御用変数領域SEM_CBF01を参照して通信用領域CBUF01を獲得できるかどうか判断し、獲得できない場合は、待ち状態に移行する。通信用領域CBUF01を獲得できた場合は、共有メモリSM上の排他制御用変数領域SEM_CBF01に関連付けられたデータ読み込みコールバックルーチンを起動する。
【００３８】
データ読み込みコールバックルーチンは、通信用領域CBUF01内のデータを通信用領域CBUF01内に書かれているデータサイズ分だけ通信用領域CBUF01からコピー領域LBUF0にコピーする。データサイズ２ａは０になっているので、実際にはコピーは行われず、データサイズ２ａを通信用領域CBUF01からコピー領域LBUF0に読み込んで、データ読み込みコールバックルーチンは終了する。
【００３９】
データ読み込みコールバックルーチンが終了したら、OSの資源獲得待ちシステムコールwait_semは呼び出し元に制御を返す。
【００４０】
OSの資源獲得待ちシステムコールwait_sem から戻り、通信用領域CBUF01を獲得できたならば、送信プログラムは、転送データとデータサイズ２aを通信用領域CBUF01のコピー領域であるLBUF0に書き込む（なお、従来は、データを共有メモリSMに書き込んでいた。）。
【００４１】
データの書き込みが完了した後、通信用領域CBUF01を解放するため、共有メモリSM上の排他制御用変数領域SEM_CBF01を使って、OSの資源解放システムコールsig_semを呼び出す。
【００４２】
OSの資源解放システムコールsig_semは、実際に通信用領域CBUF01を解放する前に、データ書き込みコールバックルーチンを起動する。
【００４３】
データ書き込みコールバックルーチンは、コピー領域LBUF0内のデータをコピー領域LBUF0内に書かれているデータサイズ分だけコピー領域LBUF0から通信用領域CBUF01にコピーする。また、コピー領域LBUF0内のデータのデータサイズ自体もコピーする。コピーは、プログラム転送またはDMAを起動して行う。コピーが完了したら、データ書き込みコールバックルーチンは終了する。
【００４４】
データ書き込みコールバックルーチンが終了したら、OSの資源解放システムコールsig_semは、通信用領域CBUF01を解放し、呼び出し元に制御を返す。
【００４５】
次に、送信プログラムはPU１−０からPU１−１に割り込みをかけて、PU１−１にデータが準備できたことを通知する。
【００４６】
（Ｂ）  PU１−１：処理プログラムの処理（ステップＳ２）
PU１−１は、割り込みを受け取ると、ユーザの処理プログラムを起動する。PU１−１上の処理プログラムは、最初に、共有メモリSM上に配置された通信用領域CBUF01の排他制御のために、共有メモリSM上の排他制御用変数領域SEM_CBF01を使ってOSの資源獲得待ちシステムコールwait_semを呼び出して、通信用領域CBUF01の獲得を試みる。
【００４７】
OSの資源獲得待ちシステムコールwait_semは、共有メモリSM上の排他制御用変数領域SEM_CBF01を参照して通信用領域CBUF01を獲得できるかどうか判断し、獲得できない場合は、待ち状態に移行する。通信用領域CBUF01を獲得できた場合は、共有メモリSM上の排他制御用変数領域SEM_CBF01に関連付けられたデータ読み込みコールバックルーチンを起動する。
【００４８】
データ読み込みコールバックルーチンは、通信用領域CBUF01内のデータを通信用領域CBUF01内に書かれているデータサイズ分だけ通信用領域CBUF01からコピー領域LBUF1にコピーする。コピーは、プログラム転送またはDMAを起動して行う。コピーが完了したら、データ読み込みコールバックルーチンは終了する。
【００４９】
データ読み込みコールバックルーチンが終了したら、OSの資源獲得待ちシステムコールwait_semは呼び出し元に制御を返す。
【００５０】
OSの資源獲得待ちシステムコールwait_sem から戻り、通信用領域CBUF01を獲得できたならば、通信用領域CBUF01のコピー領域であるLBUF1に通信用領域CBUF01の内容がすべてコピーされているので、処理プログラムは、コピー領域LBUF1から転送データをデータサイズ分読み込む。読み込みが完了したら、データサイズ２aを０に変更する。
【００５１】
次に、処理プログラムは受け取ったデータを元に何らかの処理を行って、その結果のデータとデータサイズ２aをコピー領域LBUF1に書き込む。
【００５２】
データの書き込みが完了した後、通信用領域CBUF01を解放するため、共有メモリSM上の排他制御用変数領域SEM_CBF01を使ってOSの資源解放システムコールsig_semを呼び出す。
【００５３】
OSの資源解放システムコールsig_semは、実際に通信用領域CBUF01を解放する前にデータ書き込みコールバックルーチンを起動する。
【００５４】
データ書き込みコールバックルーチンは、コピー領域LBUF1内のデータをコピー領域LBUF1内に書かれているデータサイズ分だけコピー領域LBUF1から通信用領域CBUF01にコピーする。コピーは、プログラム転送またはDMAを起動して行う。コピーが完了したら、データ書き込みコールバックルーチンは終了する。
【００５５】
データ書き込みコールバックルーチンが終了したら、OSの資源解放システムコールsig_semは通信用領域CBUF01を解放し、呼び出し元に制御を返す。
【００５６】
次に、処理プログラムはPU１−１からPU１−０に割り込みをかけて、PU１−０に処理の完了を通知する。
【００５７】
（Ｃ）  PU１−０：受信プログラムの処理（ステップＳ３）
PU１−０は、割り込みを受け取ると、ユーザの受信プログラムを起動する。PU１−０上の受信プログラムは、最初に、共有メモリSM上に配置された通信用領域CBUF01の排他制御のために、共有メモリSM上の排他制御用変数領域SEM_CBF01を使ってOSの資源獲得待ちシステムコールwait_semを呼び出して、通信用領域CBUF01の獲得を試みる。
【００５８】
OSの資源獲得待ちシステムコールwait_semは、共有メモリSM上の排他制御用変数領域SEM_CBF01を参照して通信用領域CBUF01を獲得できるかどうか判断し、獲得できない場合は、待ち状態に移行する。通信用領域CBUF01を獲得できた場合は、共有メモリSM上の排他制御用変数領域SEM_CBF01に関連付けられたデータ読み込みコールバックルーチンを起動する。
【００５９】
データ読み込みコールバックルーチンは、通信用領域CBUF01内のデータを通信用領域CBUF01内に書かれているデータサイズ分だけ通信用領域CBUF01からコピー領域LBUF0にコピーする。コピーは、プログラム転送またはDMAを起動して行う。コピーが完了したら、データ読み込みコールバックルーチンは終了する。
【００６０】
データ読み込みコールバックルーチンが終了したら、OSの資源獲得待ちシステムコールwait_semは呼び出し元に制御を返す。
【００６１】
OSの資源獲得待ちシステムコールwait_sem から戻り、通信用領域CBUF01を獲得できたならば、通信用領域CBUF01のコピー領域であるLBUF0に通信用領域CBUF01の内容がすべてコピーされているので、受信プログラムはコピー領域LBUF0から結果データをデータサイズ分読み込む。読み込みが完了したら、データサイズ２aを０に変更する。
【００６２】
次に、通信用領域CBUF01を解放するため、共有メモリSM上の排他制御用変数領域SEM_CBF01を使ってOSの資源解放システムコールsig_semを呼び出す。
【００６３】
OSの資源解放システムコールsig_semは、実際に通信用領域CBUF01を解放する前にデータ書き込みコールバックルーチンを起動する。
【００６４】
データ書き込みコールバックルーチンは、コピー領域LBUF0内のデータをコピー領域LBUF0内に書かれているデータサイズ分だけコピー領域LBUF0から通信用領域CBUF01にコピーする。データサイズは０になっているので、実際にはコピーは行われず、データサイズ２aをコピー領域LBUF0から通信用領域CBUF01に書き戻してデータ書き込みコールバックルーチンは終了する。
【００６５】
データ書き込みコールバックルーチンが終了したら、OSの資源解放システムコールsig_semは通信用領域CBUF01を解放し、呼び出し元に制御を返す。
【００６６】
呼び出し元の受信プログラムは、受信が完了したので終了し、結果データに基づいてユーザプログラムの処理を継続する。
【００６７】
（実施例１の効果）
本実施例１によれば、次の（ａ）〜（ｄ）のような効果がある。
【００６８】
（ａ）  同期基本操作（wait_sem,sig_sem）の中でローカルメモリLMと共有メモリSM間でデータ転送を行うようにしている。これにより、あるプロセッサ１aにおいて一連の演算処理を行っている間はローカルメモリLMに書き込むため、プログラムで共有メモリSMを意識する必要がなく、かつ高速に書き込みができる。そして、一連の演算処理が終了し、同期基本操作（wait_sem,sig_sem）を行う際に、他のプロセッサ１aに伝達すべき演算結果をまとめてローカルメモリLMと共有メモリSM間でデータ転送を行うため、高速に書き込みができる。
【００６９】
（ｂ）  前記（a)において、ローカルメモリLMと共有メモリSM間の書き込み動作は、同期基本操作（wait_sem,sig_sem）中に組み込まれているため、メインのプログラムではローカルメモリLMと共有メモリSM間の書き込みを記述する必要がない。よって、プログラムを簡素化することができる。
【００７０】
（ｃ）  共有メモリアクセスに関して、キャッシュメモリのデータ一貫性を保持する仕組みを提供していないキャッシュ付プロセッサコアIPを使用する場合でも、プロセッサコアIPを変更することなく、簡単なハードウェア構成で、共有メモリSMを使用したプロセッサ間通信を高速かつ効率よく行うことができる。
【００７１】
（ｄ）  同期基本操作（wait_sem,sig_sem)のタイミングで、共有メモリSMとのブロック転送あるいはDMAによるデータ転送を行うことで、ユーザのプログラムから実際に共有メモリSMに対してデータ転送を行う部分を分離することができ、プログラム全体の複雑さを低減できる。
【実施例２】
【００７２】
（実施例２の構成）
図４は、本発明の実施例２に係るプロセッサ間通信方法を実現するマルチプロセッサシステムの構成例を示すブロック図であり、実施例１を示す図１中の要素と共通の要素には共通の符号が付されている。
【００７３】
本実施例２のマルチプロセッサシステムは、実施例１と同様の構成である。
本実施例２では、一方のプロセッサから他方のプロセッサに、ストリーム（stream、流れ）的にデータ転送を行う場合について説明する。
【００７４】
共有メモリSM上には、PU１−０とPU１−１との通信用領域CBUF01が配置されると共に、通信用領域CBUF01に関連する排他制御のための排他制御用変数領域SEM_EMPTY01及びSEM_READY01が配置されている。排他制御用変数領域SEM_EMPTY01は空の転送データ領域数を表す計数型セマフォ、排他制御用変数領域SEM_READY01はデータが書き込まれた転送データ領域数を表す計数型セマフォであり、この一組で通信用領域CBUF01の排他制御を行う。排他制御用変数領域SEM_EMPTY01は初期値ｍ、排他制御用変数領域SEM_READY01は初期値０で初期化されているものとする。
【００７５】
排他制御用変数領域SEM_EMPTY01には、例えば、PU１−０データ読み込みコールバックルーチン、及び、PU１−１データ書き込みコールバックルーチンが格納されている。排他制御用変数領域SEM_READY01には、例えば、PU１−０データ書き込みコールバックルーチン、及び、PU１−１データ読み込みコールバックルーチンが格納されている。
【００７６】
実施例１と同様に、PU１−０のローカルメモリLM上には通信用領域CBUF01のコピー領域LBUF0が配置され、PU１−１のローカルメモリLM上にも通信用領域CBUF01のコピー領域LBUF1が配置されている。コピー領域LBUF0,LBUF1は、それぞれPU１−０、PU１−１上で通信用領域CBUF01のバッファ領域として使用されるもので、通信用領域CBUF01とコピー領域LBUF0,LBUF1の対応関係は、それぞれPU１−０,PU１−１で管理される。
【００７７】
図５は、図４中の通信用領域CBUF01の構成を示す図である。
通信用領域CBUF01は、m個の転送データ領域２ｂ−０〜２ｂ−（ｍ−１）を含んでいる。各転送データ領域２ｂ−０〜２ｂ−（ｍ−１）には、書き込まれている各データサイズ２ａ−０〜２ａ−（ｍ−１）を書き込む領域が付随している。データサイズ２ａ−０〜２ａ−（ｍ−１）は、PU１−０またはPU１−１により初期値０で初期化されているものとする。更に、通信用領域CBUF01は、使用中の転送データ領域２ｂを管理するために、使用中の転送データ領域２ｂの先頭の番号headbufno、及び、末尾の次の番号tailbufnoを含んでいる。
【００７８】
これらは、通信用領域CBUF01のm個の転送データ領域２ｂ−０〜２ｂ−（ｍ−１）をリングバッファ２Ｂとして管理するためのもので、番号headbufnoは使用中のリングバッファ２Ｂの先頭となる転送データ領域２ｂの番号、番号tailbufnoは使用中のリングバッファ２Ｂの末尾となる転送データ領域の次の番号を保持する。いずれも初期値０で初期化されているものとする。
【００７９】
（実施例２のプロセッサ間通信方法）
図６−１、図６−２、図６−３は、本発明の実施例２のプロセッサ間通信方法における処理手順を示す図である。図６−１には、例えば、PU１−０上のユーザプログラムがPU１−１に繰り返しデータを送信し、PU１−１上がそれを受信する処理の手順が示されている。図６−２、図６−３には、図６−１におけるルーチン等の処理手順が示されている。
【００８０】
実施例１と同様に、同期基本操作（wait_sem,sig_sem)は、ユーザの定義したデータ読み込みコールバックルーチン、データ書き込みコールバックルーチンを起動するようになっているものとする。排他制御用変数領域SEM_EMPTY01及びSEM_READY01には、同期基本操作（wait_sem,sig_sem)で起動されるデータ読み込みコールバックルーチン、データ書き込みコールバックルーチンがPU毎に関連付けられているものとする。
【００８１】
図６−１に示すプロセッサ間通信方法では、例えば、PU１−０上のユーザプログラムがPU１−１に繰り返しデータを送信し、PU１−１上のユーザプログラムがそのデータを受信する場合、下記の（Ａ）ステップＳ１０、（Ｂ）ステップＳ１１に従って処理が行われる。
【００８２】
（Ａ）  ＰＵ０：通信プログラムの処理（ステップＳ１０）
先ず、PU１−０からPU１−１にデータを送信するために、PU１−０上のユーザの送信プログラムを起動する。PU１−０上の送信プログラムは、最初に、共有メモリSM上に配置された通信用領域CBUF01の空き転送データ領域獲得のために、共有メモリSM上の排他制御用変数領域SEM_EMPTY01を使ってOSの資源獲得待ちシステムコールwait_semを呼び出して、通信用領域CBUF01の空き転送データ領域２ｂの獲得を試みる。
【００８３】
OSの資源獲得待ちシステムコールwait_semは、共有メモリSM上の排他制御用変数SEM_EMPTY01を参照して通信用領域CBUF01の空き転送データ領域２ｂを獲得できるかどうか判断し、獲得できない場合は、待ち状態に移行する。通信用領域CBUF01の空き転送データ領域２ｂを獲得できた場合は、共有メモリSM上の排他制御用変数SEM_EMPTY01に関連付けられたPU１−０のデータ読み込みコールバックルーチンを起動する。
【００８４】
PU１−０のデータ読み込みコールバックルーチンは、通信用領域CBUF01内の番号tailbufnoで指定される転送データ領域２ｂのデータを、その転送データ領域２ｂに書かれているデータサイズ分だけコピー領域LBUF0にコピーする。データサイズ２ａは０に初期化されているので、実際にはコピーは行われず、データサイズ２ａのみをコピー領域LBUF0に読み込んで、データ読み込みコールバックルーチンは終了する。
【００８５】
データ読み込みコールバックルーチンが終了したら、OSの資源獲得待ちシステムコールwait_semは呼び出し元に制御を返す。
【００８６】
OSの資源獲得待ちシステムコールwait_sem から戻り、通信用領域CBUF01の空き転送データ領域２ｂを獲得できたならば、送信プログラムは転送データとデータサイズ２ａをコピー領域LBUF0に書き込む。転送データとデータサイズ２ａの書き込みは、複数回に分けて行ってもよい。
【００８７】
データの書き込みが完了した後、そのことを通知するため、共有メモリSM上の排他制御用変数領域SEM_READY01を使ってOSの資源解放システムコールsig_semを呼び出す。
OSの資源解放システムコールsig_semは、実際にデータ準備通知を行う前に、排他制御用変数領域SEM_READY01に関連付けられたPU１−０のデータ書き込みコールバックルーチンを起動する。
【００８８】
PU１−０のデータ書き込みコールバックルーチンは、コピー領域LBUF0内のデータをコピー領域LBUF0内に書かれているデータサイズ分だけ、コピー領域LBUF0から通信用領域CBUF01内の番号tailbufnoで指定される転送データ領域にコピーする。データサイズ２ａもコピーする。コピーは、プログラム転送またはDMAを起動して行う。コピーが完了したら、番号tailbufnoの値が新たな領域を指すようにインクリメント（＋１増分）する。リングバッファ２Ｂを構成するように番号tailbufnoの値が（m-1）を超えていたら、その値を０にする。番号tailbufnoの値の更新が完了したら、データ書き込みコールバックルーチンは終了する。
【００８９】
データ書き込みコールバックルーチンが終了したら、OSの資源解放システムコールsig_semは、排他制御用変数領域SEM_READY01でデータ準備完了を通知し、呼び出し元に制御を返す。
【００９０】
次に、送信プログラムはPU１−０からPU１−１に割り込みをかけて、PU１−１にデータが準備できたことを通知する。
【００９１】
送信プログラムは、すべてのデータの送信を完了するまで上記の処理を繰り返す。
【００９２】
（Ｂ）  PU1：受信プログラムの処理（ステップＳ１１）
PU１−１は、割り込みを受け取るか、もしくは、データを受信したい場合に、ユーザの受信プログラムを起動する。PU１−１上の受信プログラムは、最初に、共有メモリSM上に配置された通信用領域CBUF01にデータが準備されているかどうかを検査するために、共有メモリSM上の排他制御用変数領域SEM_READY01を使ってOSの資源獲得待ちシステムコールwait_semを呼び出す。
【００９３】
OSの資源獲得待ちシステムコールwait_semは、共有メモリSM上の排他制御用変数領域SEM_READY01を参照して通信用領域CBUF01にデータが準備されているかどうか判断し、データが準備されていない場合は、待ち状態に移行する。データが準備されていた場合は、共有メモリSM上の排他制御用変数領域SEM_READY01に関連付けられたPU１−１のデータ読み込みコールバックルーチンを起動する。
【００９４】
PU１−１のデータ読み込みコールバックルーチンは、通信用領域CBUF01内の番号headbufnoで指定される転送データ領域のデータを、その転送データ領域内に書かれているデータサイズ分だけコピー領域LBUF1にコピーする。データサイズ２ａもコピーする。コピーは、プログラム転送またはDMAを起動して行う。コピーが完了したら、データ読み込みコールバックルーチンは終了する。
【００９５】
データ読み込みコールバックルーチンが終了したら、OSの資源獲得待ちシステムコールwait_semは呼び出し元に制御を返す。
【００９６】
OSの資源獲得待ちシステムコールwait_sem から戻り、受信データが準備されていることが確認できたならば、受信プログラムはコピー領域LBUF1から転送データをデータサイズ分読み込む。転送データの読み込みは、複数回に分けて行ってもよい。読み込みが完了したら、データサイズ２ａを０に更新する。
【００９７】
データの読み込みが完了したら、通信用領域CBUF01内の使用した転送データ領域２ｂを解放するため、共有メモリSM上の排他制御用変数領域SEM_EMPTY01を使ってOSの資源解放システムコールsig_semを呼び出す。
【００９８】
OSの資源解放システムコールsig_semは、使用した転送データ領域２ｂを解放する前にPU１−１のデータ書き込みコールバックルーチンを起動する。
【００９９】
PU１−１のデータ書き込みコールバックルーチンは、コピー領域LBUF1内のデータをコピー領域LBUF1内に書かれているデータサイズ分だけ、番号headbufnoで指定される転送データ領域２ｂにコピーする。データサイズ２ａは０に更新されているので、実際にはコピーは行われず、データサイズ２ａのみを番号headbufnoで指定される転送データ領域２ｂに書き込むことになる。その後、番号headbufnoの値が次のデータ格納領域を指すようにインクリメントする。リングバッファ２Ｂを構成するように番号headbufnoの値が（m-1）を超えていたら、その値を0にする。番号headbufnoの値の更新が完了したら、データ書き込みコールバックルーチンは終了する。
【０１００】
データ書き込みコールバックルーチンが終了したら、OSの資源解放システムコールsig_semは通信用領域CBUF01内の転送データ領域の解放を通知し、呼び出し元に制御を返す。
【０１０１】
次に、受信プログラムはPU１−１からPU１−０に割り込みをかけて、PU１−０に受信完了を通知する。
【０１０２】
受信プログラムは、すべてのデータを受信するまで上記の処理を繰り返す。
PU１−０、PU１−１間の割り込みは、OSの資源獲得待ちシステムコールwait_semで待ち状態になったプロセスに対し、待ち状態を解除できる状態になったことを通知するために使用する。
【０１０３】
（実施例２の効果）
本実施例２によれば、実施例１の効果（ａ）、（ｂ）と同様の効果があり、更に、次の（ｅ）、（ｆ）のような効果もある。
【０１０４】
（ｅ）  共有メモリアクセスに関して、キャッシュメモリのデータ一貫性を保持する仕組みを提供していないキャッシュ付プロセッサコアIPを使用する場合でも、プロセッサコアIPを変更することなく、簡単なハードウェア構成で、共有メモリSMを使用したプロセッサ間のストリームデータ転送を高速かつ効率よく行うことができる。
【０１０５】
（ｆ）  同期基本操作(wait_sem,sig_sem)のタイミングで共有メモリSMとのブロック転送あるいはDMAによるデータ転送を行うことで、ユーザのプログラムから実際に共有メモリSMに対してデータ転送を行う部分を分離することができ、プログラム全体の複雑さを低減できる。
【０１０６】
なお、本発明は、上記実施例１、２に限定されず、種々の変形や利用形態が可能である。この変形や利用形態としては、例えば、次の（I)、（II）のようなものがある。
【０１０７】
（I)  実施例１、２では、２つの典型的なプロセッサ間通信について説明したが、その通信の処理手順は図示以外の手順に変更でき、更に、２つのプロセッサ間通信以外の他のプロセッサ間通信についても適用可能である。
【０１０８】
（II)  ２台のPU間でのプロセッサ間通信について、例を用いて説明したが、３台以上で通信を行う場合についても適用可能である。
【図面の簡単な説明】
【０１０９】
【図１】本発明の実施例１に係るプロセッサ間通信方法を実現するマルチプロセッサシステムの構成例を示すブロック図である。
【図２】図１中の通信用領域CBUF01の構成を示す図である。
【図３−１】本発明の実施例１のプロセッサ間通信方法における処理手順を示す図である。
【図３−２】本発明の実施例１のプロセッサ間通信方法における処理手順を示す図である。
【図４】本発明の実施例２に係るプロセッサ間通信方法を実現するマルチプロセッサシステムの構成例を示すブロック図である。
【図５】図４中の通信用領域CBUF01の構成を示す図である。
【図６−１】本発明の実施例２のプロセッサ間通信方法における処理手順を示す図である。
【図６−２】本発明の実施例２のプロセッサ間通信方法における処理手順を示す図である。
【図６−３】本発明の実施例２のプロセッサ間通信方法における処理手順を示す図である。
【符号の説明】
【０１１０】
１−０〜１−ｎ      PU（プロセッシングユニット）
１ａ      プロセッサ
１ｂ      キャッシュメモリ
２ａ      データサイズ
２ｂ      転送データ領域
３      共有バス
LM      ローカルメモリ
SM      共有メモリ
【図１】
2007280127.tif 000003
【図２】
2007280127.tif 000004
【図３−１】
2007280127.tif 000005
【図３−２】
2007280127.tif 000006
【図４】
2007280127.tif 000007
【図５】
2007280127.tif 000008
【図６−１】
2007280127.tif 000009
【図６−２】
2007280127.tif 000010
【図６−３】
2007280127.tif 000011