(57)【要約】マルチコアシステムにおけるコアが非同期に動作する場合おいても、コアによる処理のリアルタイム性を向上させつつ、同時性が確保されたデータセットをコア間で伝達する。バンクメモリＢ［１］〜Ｂ［５］と、これらのバンクメモリＢ［１］〜Ｂ［５］にアクセス可能な書き込みコア６０１および読み出しコア６０２−１、６０２−２、６０２−３が設けられ、アクセス制御部６０３は、書き込みが行われるバンクメモリＢ［１］〜Ｂ［５］には、１個の書き込みコア６０１のみを割り当て、読み出しが行われるバンクメモリＢ［１］〜Ｂ［５］には、１以上の読み出しコア６０２−１、６０２−２、６０２−３読を割り当て、書き込みが行われているバンクメモリＢ［１］〜Ｂ［５］と読み出しが行われているバンクメモリＢ［１］〜Ｂ［５］とが同一にならないようにバンクメモリＢ［１］〜Ｂ［５］へのアクセスを排他的に制御する。
2019065302.tif 000002
【特許請求の範囲】
【請求項１】
Ｍ（Ｍは２以上の整数）個のバンクメモリと、前記バンクメモリにアクセス可能なＮ（Ｎは２以上の整数）個のプロセッサとが設けられた車載マルチコア制御用データ伝達装置であって、
前記Ｍ個のバンクメモリが配置され、前記Ｎ個のプロセッサからアクセス可能な共有メモリと、
前記バンクメモリを特定する識別情報に基づいて、前記プロセッサから前記バンクメモリへのアクセスを制御するアクセス制御部とを備える車載マルチコア制御用データ伝達装置。
【請求項２】
前記アクセス制御部は、
書き込みが行われるバンクメモリには、書き込みに使われる１個のプロセッサのみを割り当て、
読み出しが行われるバンクメモリには、読み出しに使われるＫ（Ｋは１以上Ｎ−１以下の整数）個のプロセッサを割り当て、
書き込みが行われているバンクメモリと読み出しが行われているバンクメモリとが同一にならないように前記バンクメモリへのアクセスを排他的に制御する請求項１に記載の車載マルチコア制御用データ伝達装置。
【請求項３】
前記アクセス制御部は、
前記プロセッサによる読み出し時には、最後に書き込みが行われたバンクメモリの識別情報を返し、
前記プロセッサによる書き込み時には、最後に書き込みが行われたバンクメモリ以外で、かついずれのプロセッサによる読み出しにも使用されていないバンクメモリの識別情報を返す請求項２に記載の車載マルチコア制御用データ伝達装置。
【請求項４】
前記プロセッサによる書き込みが行われるバンクメモリは、前記プロセッサに前記バンクメモリが割り当てられる前に、最後に書き込みが行われたバンクメモリの内容がコピーされる請求項２に記載の車載マルチコア制御用データ伝達装置。
【請求項５】
書き込みに使われるプロセッサの個数は１、読み出しに使われるプロセッサの個数はＮ−１、前記バンクメモリの個数ＭはＮ＋１に設定される請求項２に記載の車載マルチコア制御用データ伝達装置。
【請求項６】
前記バンクメモリをＭ個のごとにまとめたＮ個のスクラッチパッド・メモリを備え、
書き込みに使われるＮ個のプロセッサと前記Ｎ個のスクラッチパッド・メモリとは１対１に対応づけられている請求項１に記載の車載マルチコア制御用データ伝達装置。
【請求項７】
前記スクラッチパッド・メモリに対して行われる書き込み操作および読み出し操作を実現する実行コードおよびこの実行コードを含む関数は、各プロセッサに対してローカルに設けられた実行コード格納領域に保持される請求項６に記載の車載マルチコア制御用データ伝達装置。
【請求項８】
前記スクラッチパッド・メモリに対して対応づけられた書き込みに使われるプロセッサに関しては書き込みコードおよび書き込み関数のみを実装し、前記スクラッチパッド・メモリに対して対応づけられた読み出しに使われるプロセッサに関しては読み出しコードおよび読み出し関数のみを実装する請求項７に記載の車載マルチコア制御用データ伝達装置。
【請求項９】
前記共有メモリに配置されたカウンタ配列領域と第１レジスタと第２レジスタを備え、
前記カウンタ配列領域は、読み出しに使用されるプロセッサから前記バンクメモリへのアクセス数を前記バンクメモリごとに記憶し、
前記第１レジスタは、最後に書き込みが行われたバンクメモリを特定する識別情報を記憶し、
前記第２レジスタは、前記カウンタ配列領域および前記第１レジスタの参照結果に基づいて、最後に書き込みが行われたバンクメモリ以外で、かつどのプロセッサからもアクセスされていないバンクメモリを特定する識別情報を記憶し、
前記アクセス制御部は、前記カウンタ配列領域に記憶されたアクセス数および前記第１レジスタに記憶された識別情報および前記第２レジスタに記憶された識別情報に基づいて、前記プロセッサから前記バンクメモリへのアクセスを制御する請求項１に記載の車載マルチコア制御用データ伝達装置。
【請求項１０】
Ｍ（Ｍは２以上の整数）個のバンクメモリと、前記バンクメモリにアクセス可能なＮ（Ｎは２以上の整数）個のプロセッサとが設けられた電子制御装置であって、
前記Ｍ個のバンクメモリが配置され、前記Ｎ個のプロセッサからアクセス可能な共有メモリと、
前記バンクメモリを特定する識別情報に基づいて、前記プロセッサから前記バンクメモリへのアクセスを制御するアクセス制御部とを備え、
前記アクセス制御部は、
書き込みが行われるバンクメモリには、書き込みに使われる１個のプロセッサのみを割り当て、
読み出しが行われるバンクメモリには、読み出しに使われるＫ（Ｋは１以上Ｎ−１以下の整数）個のプロセッサを割り当て、
書き込みが行われているバンクメモリと読み出しが行われているバンクメモリとが同一にならないように前記バンクメモリへのアクセスを排他的に制御し、
前記書き込みに使われるプロセッサは、車載制御の制御量の算出に用いられる1以上複数の入力値を計算し、その入力値を前記バンクメモリに書き込み、
前記読み出しに使われるプロセッサは、前記書き込みが行われたバンクメモリから前記入力値を読み出し、前記入力値に基づいて車載制御の制御量を算出する電子制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、エンジンの燃料制御などに適用可能な車載マルチコア制御用データ伝達装置および電子制御装置に関する。
【背景技術】
【０００２】
高性能化への要求に応えるため、組込みシステムではこれまでＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）のクロック周波数を高めることで処理能力の向上を図ってきた。しかしその結果、ＣＰＵの消費電力、発熱量およびノイズなどの増加を招いていた。これに対して近年注目されているのが、ＣＰＵのコアをチップ内に複数実装し、各コアの負荷を減少させるマルチコアシステムである。【０００３】
マルチコアシステムでは、今までシングルコアで実行してきた制御をコアごとに分割・分散し、並列処理を行うことによって処理スループットを向上させる。しかしながら、シングルコアの制御で行われていたＯＳ（Ｏｐｅｒａｔｉｏｎｇ  Ｓｙｓｔｅｍ）によるタスク間排他制御および割込み禁止によるクリティカル区間の割込み禁止制御がマルチコアにおいては成立しない。マルチコアシステムにおいて、同時性を確保しつつデータの組（データセット）を送り手ＣＰＵから受け手ＣＰＵに伝達する場合がある。この時、何らかの保護機構を設定しないと、受け手のＣＰＵがデータセットの一部のデータを読みだしている最中に、送り手のＣＰＵがそのデータセットの他のデータを書き換える現象が起こり得る。これは複数のＣＰＵが各々独自の実行コードを保有し、基本的に非同期で動作を行うためである。【０００４】
このような現象を排除する手法として、従来からロック変数によるスピンロック制御が知られている。これはテスト・アンド・セット命令のようなアトミック（不可分）な変数チェック＆書き込み命令を用いて、特定のロック変数に使用中を示す鍵をかけ、鍵をかけ得たＣＰＵのみが特定メモリ領域にアクセスできるプロセッサ間排他制御システムである。【０００５】
しかしながら、スピンロック制御でプロセッサ間排他制御を行う資源に関わる実行区間は、マルチコアにとって並列実行区間ではなく、直列実行区間となる。従って、この直列実行時間が長くなればなるほど、アムダールの法則によってマルチコア全体として見た場合の並列実行性能が低下する。なお、アムダールの法則とは、複数のプロセッサを使い、並列計算によってプログラムの高速化を図る場合、そのプログラムの中で逐次的に実行しなければならない部分の時間によって、高速化が制限される現象を記述したものである。【０００６】
スピンロックを行うメモリ粒度を大きく取り、複数のＣＰＵが関与すればするほど、ロック待ちに要する時間が増加（スケーラブル性に考慮したスピンロック機構の場合はＣＰＵ数に比例）し、ＣＰＵによる処理のリアルタイム性を損なう。【０００７】
一方、メモリ粒度を下げ、ロック変数（および該当排他資源）の個数を増加させると、管理が煩雑になって各ＣＰＵの制御に対する最悪実行時間を見積もること（および仕様変更に対する波及効果を予測すること）が困難になる。【０００８】
実際にはメモリ粒度を下げる方法はモチベーションが逆で、システムやマルチコアＯＳの制約上、設定できるロック変数の上限数が決められていることと、同一変数で異なるロック向けに値をコピーする等の管理が煩雑になるため、設計的にロック粒度が大きくなりがちである。極論すれば、細粒度ロックを多用するより、グローバル変数を丸ごとロック単位として扱った方が設計の見通し良くなる。（これをジャイアントロックと称する。）従って、この手法の帰結としてロックを取り合うＣＰＵの個数が増え、ロック待ち時間が見過ごせなくなる傾向にある。【０００９】
以上の観点からハードリアルタイム性を重視する車載制御用のマルチコアでは、スピンロック制御を採用しないことが好ましい。特に、マルチコアシステムでは、ＣＰＵ数を増やすと、ロック待ち時間が程度の良い方式（これはスケーラブルな方式と呼ばれる）においても比例的に増加する。【００１０】
そのためには、以下の先行技術で示すようなスピンロックを用いないＣＰＵ間データ伝達方式が考案されている。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２００９−２１７７２１号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、特許文献１に開示された技術は、データの送り手のＣＰＵをサーバ、受け手のＣＰＵをクライアントとみなして、サーバ−クライアント・モデルによるデータの授受を図るものである。【００１３】
受け手のＣＰＵは通知領域（共有メモリ）にデータ要求の指令を書き、送り手のＣＰＵは、その指令を解釈して受け手の割り当て領域（共有メモリ）に要求されたデータを書込み、その指令を完了済みの値に書き換える。【００１４】
すなわち、完全なハンドシェーク動作であって、受け手のＣＰＵの要求頻度と送り手のＣＰＵのデータ生成頻度が完全に同期しないと、方式が破綻する。受け手の要求頻度が大きい時に適度に同一データを重ね読みしたり、送り手のデータ生成頻度が大きい時に受け手は適度にデータを読み飛ばしたりすることができない。これは、非同期のＣＰＵ間データ授受システムおいて負担になる。（データの授受が疎結合でない。）【００１５】
また、サーバ−クライアント・モデルは、操作対象のオブジェクトが所属するＣＰＵ（送り手のＣＰＵ）に対する遠隔呼び出し法である。このため、データを生成するＣＰＵ（送り手のＣＰＵ）の動作を阻害し、操作を依頼したＣＰＵ（受け手のＣＰＵ）も操作完了通知を待つ必要があるため、送り手のＣＰＵも受け手のＣＰＵもリアルタイム性が悪くなる。【００１６】
本発明は、上記事情に鑑みなされたものであり、その目的は、マルチコアシステムにおけるコアが非同期に動作する場合おいても、コアによる処理のリアルタイム性を向上させつつ、同時性が確保されたデータセットをコア間で伝達することが可能な車載マルチコア制御用データ伝達装置および電子制御装置を提供することにある。
【課題を解決するための手段】
【００１７】
上記目的を達成するため、第１の観点に係る車載マルチコア制御用データ伝達装置は、Ｍ（Ｍは２以上の整数）個のバンクメモリと、前記バンクメモリにアクセス可能なＮ（Ｎは２以上の整数）個のプロセッサとが設けられた車載マルチコア制御用データ伝達装置であって、前記Ｍ個のバンクメモリが配置され、前記Ｎ個のプロセッサからアクセス可能な共有メモリと、前記バンクメモリを特定する識別情報に基づいて、前記プロセッサから前記バンクメモリへのアクセスを制御するアクセス制御部とを備える。
【発明の効果】
【００１８】
本発明によれば、マルチコアシステムにおけるコアが非同期に動作する場合おいても、コアによる処理のリアルタイム性を向上させつつ、同時性が確保されたデータセットをコア間で伝達することができる。
【図面の簡単な説明】
【００１９】
【図１】図１は、実施形態に係るマルチコア制御装置のハードウェア構成を示すブロック図である。
【図２】図２は、実施形態に係る電子制御装置が適用されるエンジンの燃料噴射系の構成例を示すブロック図である。
【図３】図３の（ａ）は、実施形態に係るデータ伝達装置に適用可能な単精度浮動小数点数のデータ構造を示す図、図３の（ｂ）は、実施形態に係るデータ伝達装置に適用可能な倍精度浮動小数点数のデータ構造を示す図、図３の（ｃ）は、図３の（ａ）および図３の（ｂ）のデータ構造のビットの割り当て方法を示す図である。
【図４】図４は、実施形態の比較例に係るスピンロック制御方法を示すフローチャートである。
【図５】図５は、実施形態の比較例に係るスピンロック制御と割込み禁止の関係を示すフローチャートである。
【図６】図６は、実施形態に係るデータ伝達装置の構成例を示すブロック図である。
【図７】図７は、実施形態に係るデータ伝達装置の読み出し手続きを示すフローチャートである。
【図８】図８は、実施形態に係るデータ伝達装置の書き込み手続きを示すフローチャートである。
【図９】図９は、実施形態に係るデータ伝達装置がエンジンの燃料噴射系に適用された時のデータ伝達手順を示すフローチャートである。
【図１０】図１０は、実施形態に係るデータ伝達装置がエンジンの燃料噴射系に適用された時のデータ伝達方法を時系列的に示すシーケンス図である。
【図１１】図１１（ａ）は、実施形態に係るデータ伝達装置の書き込みコアとスクラッチパッド・メモリとの占有関係を示す図、図１１（ｂ）は、実施形態に係るデータ伝達装置のスクラッチパッド・メモリごとのコアへの関数の割り当て方法を示す図である。
【図１２】図１２は、実施形態に係るデータ伝達装置のスクラッチパッド・メモリのバンク数とコア数との関係を示す図である。
【発明を実施するための形態】
【００２０】
実施形態について、図面を参照して説明する。なお、以下に説明する実施形態は特許請求の範囲に係る発明を限定するものではなく、また実施形態の中で説明されている諸要素及びその組み合わせの全てが発明の解決手段に必須であるとは限らない。また、実施例開示分野の一例としてエンジン制御を挙げているが、エンジン制御に限らず変速機制御などのドライブトレイン制御、防振やダンパーに関連するシャーシ制御、アンチロックブレーキシステムや衝突安全などのアクティブセーフティ、トラクションコントロールシステムなどの駆動力制御、および自動走行制御など車載用リアルタイム制御が要求される各分野に適用可能であることは言うまでもない。
【００２１】
図１は、実施形態に係るマルチコア制御装置のハードウェア構成を示すブロック図である。なお、図1では、エンジンの燃料制御装置を２コアにて実現した構成を例にとった。
【００２２】
図１において、この燃料制御装置には、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１００、１１０、実行コード１０１、１１１が格納された実行コード格納領域、ローカルＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０２、１１２および共有ＲＡＭ１２０が設けられている。
【００２３】
ＣＰＵ１００にはセンサ入力として、エアフローメータ１０３、圧力センサ１０４、スロットルセンサ１０５、回転数センサ１０６が接続されている。エアフローメータ１０３は、空気吸入量Ｑを計算するためのセンサ値を出力する。圧力センサ１０４は、吸気管圧力Ｐを計算するためのセンサ値を出力する。スロットルセンサ１０５は、スロットル開度αを計算するためのセンサ値を出力する。回転数センサ１０６は、エンジン回転数Ｎｅを計算するためのセンサ値を出力する。
【００２４】
ＣＰＵ１１０にはアクチュエータ出力として、燃料噴射量指示装置１１３が接続されている。燃料噴射量指示装置１１３は、エンジンの燃料噴射量ｑを出力する。
【００２５】
ＣＰＵ１００は主にセンサ入力の処理を担当し、実行コード１０１およびローカルＲＡＭ１０２を用いて処理を実行する。ローカルＲＡＭ１０２は、ＣＰＵ１００のみからアクセスできるメモリ資源である。
【００２６】
ＣＰＵ１１０は主に数値演算と出力アクチュエータ操作を担当し、実行コード１１１およびローカルＲＡＭ１１２を用いて処理を実行する。ローカルＲＡＭ１１２は、ＣＰＵ１１０のみからアクセスできるメモリ資源である。
【００２７】
ＣＰＵ１００、１１０には、共通してアクセス可能な資源として共有ＲＡＭ１２０がバス１０７を介して接続されている。共有ＲＡＭ１２０上には、全体としての制御を成立させる上で一方のＣＰＵ１００、１１０から他方のＣＰＵ１１０、１００に開示することが必要なデータの格納領域が設けられている。この格納領域には、ＣＰＵ開示データ１２１、１２２が格納される。ＣＰＵ開示データ１２１には、空気吸入量Ｑ、吸気管圧力Ｐ、スロットル開度αおよびエンジン回転数Ｎｅを設定することができる。ＣＰＵ開示データ１２２には、燃料噴射量ｑを設定することができる。
【００２８】
図２は、実施形態に係る電子制御装置が適用されるエンジンの燃料噴射系の構成例を示すブロック図である。図２では、燃料噴射系で主に用いられている３方式を示した。図２の（ａ）ではマスフロー方式、図２の（ｂ）ではスピードデンシティ方式、図２の（ｃ）ではα−Ｎ方式を示した。
【００２９】
図２の（ａ）〜（ｃ）において、エンジン２０３には吸気管２０２が接続され、吸気管２０２には燃料噴射装置２０５が接続されている。吸気管２０２の上流には、スロットルチャンバ２０１が設けられている。エンジン２０３には回転数センサ１０６が設けられている。さらに、燃料噴射系には、燃料制御を行うＥＣＵ（Ｅｌｅｃｔｒｏｎｉｃ  Ｃｏｎｔｒｏｌ  Ｕｎｉｔ）２０４が設けられている。ＥＣＵ２０４は、図１のＣＰＵ１００、１１０、実行コード１０１、１１１が格納された実行コード格納領域、ローカルＲＡＭ１０２、１１２および共有ＲＡＭ１２０を備えることができる。
【００３０】
また、図２の（ａ）に示すように、マスフロー方式では、エアフローメータ１０３がスロットルチャンバ２０１の上流に設けられる。
そして、ＥＣＵ２０４のＣＰＵ１００には、吸入空気量Ｑを計算するためのセンサ値がエアフローメータ１０３から入力されるとともに、エンジン回転数Ｎｅを計算するためのセンサ値が回転数センサ１０６から入力される。そして、ＣＰＵ１００において、これらのセンサ値から吸入空気量Ｑおよびエンジン回転数Ｎｅが計算され、共有ＲＡＭ１２０に格納される。
【００３１】
次に、ＣＰＵ１１０において、吸入空気量Ｑおよびエンジン回転数Ｎｅが共有ＲＡＭ１２０から読み出される。そして、燃料噴射量ｑがｑ∝Ｑ／Ｎｅとして計算される。
【００３２】
一方、図２の（ｂ）に示すように、スピードデンシティ方式では、圧力センサ１０４が吸気管２０２に設けられる。
そして、ＥＣＵ２０４のＣＰＵ１００には、吸気管圧力Ｐを計算するためのセンサ値が圧力センサ１０４から入力されるとともに、エンジン回転数Ｎｅを計算するためのセンサ値が回転数センサ１０６から入力される。そして、ＣＰＵ１００において、これらのセンサ値から吸気管圧力Ｐおよびエンジン回転数Ｎｅが計算され、共有ＲＡＭ１２０に格納される。
【００３３】
次に、ＣＰＵ１１０において、吸気管圧力Ｐおよびエンジン回転数Ｎｅが共有ＲＡＭ１２０から読み出される。そして、燃料噴射量ｑがｑ∝ｆ１（Ｐ，Ｎｅ）として計算される。なお、ｆ１（）はエンジン特性より決定される関数である。
【００３４】
一方、図２の（ｃ）に示すように、α−Ｎ方式では、スロットルセンサ１０５がスロットルチャンバ２０１に設けられる。
そして、ＥＣＵ２０４のＣＰＵ１００には、スロットル開度αを計算するためのセンサ値がスロットルセンサ１０５から入力されるとともに、エンジン回転数Ｎｅを計算するためのセンサ値が回転数センサ１０６から入力される。そして、ＣＰＵ１００において、これらのセンサ値からスロットル開度αおよびエンジン回転数Ｎｅが計算され、共有ＲＡＭ１２０に格納される。
【００３５】
次に、ＣＰＵ１１０において、スロットル開度αおよびエンジン回転数Ｎｅが共有ＲＡＭ１２０から読み出される。そして、燃料噴射量ｑがｑ∝ｆ２（α，Ｎｅ）として計算される。なお、ｆ２（）はエンジン特性より決定される関数である。
【００３６】
ここで、センサ入力処理を行うＣＰＵ１００で計算されたデータセット｛Ｑ，Ｐ，α，Ｎｅ｝が、燃料噴射量ｑを計算するＣＰＵ２で使われる場合、データセット｛Ｑ，Ｐ，α，Ｎｅ｝の各値が、ほとんど同時刻に計測されたセンサ値から得られたデータであることが重要である。この関係をデータセットの同時性と言う。このデータセット内のデータ間の同時性を巨視的な同時性と言う。このデータセットの同時性が崩れると、データセット｛Ｑ，Ｐ，α，Ｎｅ｝に応じた燃料噴射量ｑの算出精度が低下する。
【００３７】
例えば、図２の（ａ）のマスフロー方式において、ＣＰＵ１１０がＣＰＵ開示データ１２１の吸入空気量Ｑを読み出している間に、ＣＰＵ１００がＣＰＵ開示データ１２１のエンジン回転数Ｎｅを別時刻の値に勝手に書き換えると、ＣＰＵ１１０にとって吸入空気量Ｑとエンジン回転数Ｎｅの同時性が崩れる。この時、ｑ∝Ｑ／Ｎｅとして計算された燃料噴射量ｑは間違った制御データとなる。このため、マルチコアシステムでは、データセットの同時性を確保し、データセットの同時性が崩れないように注意する必要がある。
【００３８】
図３の（ａ）は、実施形態に係るデータ伝達装置に適用可能な単精度浮動小数点数のデータ構造を示す図、図３の（ｂ）は、実施形態に係るデータ伝達装置に適用可能な倍精度浮動小数点数のデータ構造を示す図、図３の（ｃ）は、図３の（ａ）および図３の（ｂ）のデータ構造のビットの割り当て方法を示す図である。なお、図３の（ａ）および図３の（ｂ）では、アドレス昇順を縦軸にとった。
【００３９】
図３の（ａ）および図３の（ｂ）の例では、ビッグエンディアン形式のデータ格納順とし、ＩＥＥＥ７５４規格（ＩＥＥＥ  Ｓｔａｎｄａｒｄ  ｆｏｒ  Ｆｌｏａｔｉｎｇ−Ｐｏｉｎｔ  Ａｒｉｔｈｍｅｔｉｃ  （ＡＮＳＩ／ＩＥＥＥ  Ｓｔｄ  ７５４−２００８））に準拠した。
【００４０】
図３の（ａ）には、４バイトの単精度データ３０１を示した。図３の（ｂ）には、８バイトの倍精度データ３０２を示した。単精度データ３０１および倍精度データ３０２において、ｓは符号ビットを、ｅは指数部のビットを、ｆは仮数部のビットを示す。
【００４１】
図３の（ｃ）に示すように、単精度データ３０１では、符号ビットに１ビット、指数部に８ビット、仮数部に２３ビットが割り当てられる。倍精度データ３０２では、符号ビットに１ビット、指数部に１１ビット、仮数部に５２ビットが割り当てられる。
【００４２】
単精度データ３０１（または倍精度データ３０２）が１つの数値であるといっても、その数値の書き換えはアドレスにマッピングされたバイトごとに行われる。このため、単精度データ３０１（または倍精度データ３０２）の一部が部分的に書き換わっている最中に、その単精度データ３０１（または倍精度データ３０２）にアクセスすると、データとして意味をなさない数値が取り込まれる。
【００４３】
複数バイトにまたがるデータ構造のデータは、すべてのバイトのデータの書き換えが終わってから取り込まなければならない。また、読み手がデータを読んでいる最中に、そのデータの一部のバイトを書き換えてはならない。複数バイトにまたがるデータ構造を持つ１つのデータの中のバイト間の一貫した同時性を微視的な同時性と言う。
【００４４】
マルチコアシステムにおいて取り込まれるデータが意味を持つためには、巨視的な同時性だけでなく、微視的な同時性も確保する必要がある。
【００４５】
以上述べたようなデータの同時性の破壊は、複数のＣＰＵによる同一メモリ領域への読み書きの競合に起因する。このような競合を回避するために、複数のＣＰＵが同一メモリ領域に同時にアクセスできないＣＰＵ間排他制御を行うことがある。
【００４６】
図４は、実施形態の比較例に係るスピンロック制御方法を示すフローチャートである。
図４では、ＣＰＵ間排他制御を行うために、スピンロック制御方法を用いる場合を示した。図４において、ＣＰＵはロック変数を読み込む（Ｓ４０１）。ロック変数は、排他制御される共有資源と同様に共有メモリ上に確保される。
【００４７】
次に、このロック変数がテストされ、解放されているか（値がゼロか）がチェックされる（Ｓ４０２）。ロック変数が解放されていれば、ＣＰＵはロック変数を取得し、ロック変数へ値を書き込む（Ｓ４０３）。ロック変数が解放されていなければ、Ｓ４０１へ戻り、ＣＰＵはロック変数を再び読み込み、テストを繰り返す。
【００４８】
次に、ＣＰＵはロック変数を取得すると、共有資源にアクセスする（Ｓ４０４）。その後、ＣＰＵはロック変数を解放する（Ｓ４０５）。
【００４９】
この動作は、ロック変数が解放されるまで、ループ操作によって変数を読み込み、テストを続行しつつ待ちを続けるのでスピンロックと呼ばれる。
Ｓ４０１、Ｓ４０２およびＳ４０３の一連の動作はテスト・アンド・セット命令のようなアトミック命令Ｂ４００を用いて実装される。アトミック命令とは、あるＣＰＵが命令実行中に他のＣＰＵが干渉できない不可分な複合命令セットのことである。
【００５０】
図５は、実施形態の比較例に係るスピンロック制御と割込み禁止の関係を示すフローチャートである。図５では、図４で示したスピンロック制御と割込み禁止区間とのネスト関係を示した。
図５において、プロセッサ内排他制御区間Ｂ５００には、割込み禁止（Ｓ５０１）と割込み許可（Ｓ５０５）とが設けられている。割込み禁止（Ｓ５０１）と割込み許可（Ｓ５０５）とで挟まれた区間は、割込み禁止区間である。プロセッサ間排他制御区間Ｂ５１０は、この割込み禁止区間に設けられている。プロセッサ間排他制御区間Ｂ５１０では、ＣＰＵがロックを取得すると（Ｓ５０２）、そのＣＰＵが共有資源へアクセスし（Ｓ５０３）、その後、ＣＰＵはロックを開放（Ｓ５０４）する。
【００５１】
この時、あるＣＰＵが共有資源へアクセスしている間は、他のＣＰＵから共有資源へのアクセスが禁止される。また、プロセッサ内排他制御Ｂ５００の中にプロセッサ間排他制御Ｂ５１０が入り、このネスト関係が維持される。
このネスト関係を維持することにより、あるＣＰＵがロックを取得してからロックを開放するまでは、そのＣＰＵは割込み制御ができなくなる。割込み制御は、そのＣＰＵ独自の都合で行われるので、複数ＣＰＵ間のロック実行時間・待ち時間の量的関係に含ませるべきではないからである。
【００５２】
したがって、あるＣＰＵのロック取得中の割込み制御を禁止することにより、その割込み制御によって、そのＣＰＵからロックが解放されるまでの時間が延びるのを防止することができる。このため、他のＣＰＵのロック待ち時間の増加を抑制することができ、リアルタイム制御の実効性を確保することができる。また、ロック待ちのＣＰＵは、ロック待ち時間の最悪値を正しく見積もることができる。逆に、ＣＰＵのロック取得中の割込み制御を許すと、ロック待ち時間を管理することが困難になってしまう。
【００５３】
図５のネスト関係を維持したまスピンロックを行う方法は、ロック待ちをするＣＰＵが増加すると、ロック待ち時間が増加する。このロック待ち時間は、最善手法でロック待ちをするＣＰＵ数に対して比例的に増加し、最悪手法で指数関数的に増加する。ロック待ち時間の増加をＣＰＵ数に比例的にする手法は、ＣＰＵ数に対してスケーラブルな手法と呼ばれる。この手法では、ロック待ちをするＣＰＵの要求が待ち行列で記憶され、要求順にロック権利が与えられる。
【００５４】
ここで、図５に示すように、ロック待ちを行うプロセッサ間排他制御Ｂ５１０は、割込みを禁止するプロセッサ内排他制御Ｂ５００の中に位置している。このため、ロック待ち時間（Ｓ５０２〜Ｓ５０４）が増加すると、割込み禁止時間（Ｓ５０１〜Ｓ５０５）も必然的に増加する。
【００５５】
すなわち、ＥＣＵ２０４の処理性能を上げるために、マルチコア化されたＣＰＵ１００、１１０を用いると、スピンロック制御では、ＣＰＵ数の増加に従って割込み禁止時間も増加する。割込み禁止時間の増加は、車載用途におけるハードリアルタイム制御の破綻を招く。ハードリアルタイム制御の破綻を防止するため、ＣＰＵ数を制限すると、ＥＣＵ２０４の処理性能を上げるのが困難となる。
【００５６】
ＣＰＵ数を制限することなく、ハードリアルタイム制御の破綻を防止するため、ロック変数を用いた待ち合わせが生じないロックレス方式が望ましい。
【００５７】
図６は、実施形態に係るデータ伝達装置の構成例を示すブロック図である。なお、以下の説明では、５個のバンクメモリと、これらのバンクメモリにアクセス可能な４個のＣＰＵとが設けられた構成を例にとる。ＣＰＵは、プロセッサとして用いることができる。プロセッサは、ＭＰＵ（Ｍｉｃｒｏ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）またはＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）などであってもよい。
【００５８】
図６において、データ伝達装置には、５個のバンクメモリＢ［１］〜Ｂ［５］と、これらのバンクメモリＢ［１］〜Ｂ［５］にアクセス可能な書き込みコア６０１および読み出しコア６０２−１、６０２−２、６０２−３が設けられている。書き込みコア６０１は、書き込みに使われるＣＰＵに設けることができる。読み出しコア６０２−１、６０２−２、６０２−３は、読み出しに使われるＣＰＵに設けることができる。
【００５９】
バンクメモリＢ［１］〜Ｂ［５］は共有メモリ６１０に設けることができる。共有メモリ６１０は、書き込みコア６０１および読み出しコア６０２−１、６０２−２、６０２−３からアクセス可能である。バンクメモリＢ［１］〜Ｂ［５］は、同一の変数内容および先頭から同一オフセットアドレスを持つように構成することができる。バンクメモリＢ［１］〜Ｂ［５］には、バンクメモリＢ［１］〜Ｂ［５］を特定する識別情報としてバンク番号＃１〜＃５がそれぞれ付加されている。
【００６０】
バンクメモリＢ［１］〜Ｂ［５］をまとめることでスクラッチパッド・メモリ６１１を構成することができる。スクラッチパッド・メモリ６１１は、データの一時的な受け渡しに使うことができる。スクラッチパッド・メモリ６１１は、バンクメモリ群すなわちバンクメモリＢ［１］〜Ｂ［５］をまとめて指し示す時の呼称である。
【００６１】
さらに、データ伝達装置には、アクセス制御部６０３が設けられている。アクセス制御部６０３は、バンクメモリＢ［１］〜Ｂ［５］を特定するバンク番号＃１〜＃５に基づいて、書き込みコア６０１および読み出しコア６０２−１、６０２−２、６０２−３からバンクメモリＢ［１］〜Ｂ［５］へのアクセスを制御する。この時、アクセス制御部６０３は、対象のバンクメモリＢ［１］〜Ｂ［５］を対応付けたバンク番号＃１〜＃５を用いて管理することができる。
【００６２】
具体的には、アクセス制御部６０３は、書き込みが行われるバンクメモリＢ［１］〜Ｂ［５］には、１個の書き込みコア６０１のみを割り当てる。読み出しが行われるバンクメモリＢ［１］〜Ｂ［５］には、１以上の読み出しコア６０２−１、６０２−２、６０２−３を割り当てる。そして、書き込みが行われているバンクメモリＢ［１］〜Ｂ［５］と読み出しが行われているバンクメモリＢ［１］〜Ｂ［５］とが同一にならないようにバンクメモリＢ［１］〜Ｂ［５］へのアクセスを排他的に制御することができる。
【００６３】
なお、アクセス制御部６０３は、書き込みコア６０１または読み出しコア６０２−１、６０２−２、６０２−３が設けられたＣＰＵがアクセス制御に関するプログラムを実行することにより、各々のＣＰＵのソフトウェア上またはファームウェア上で分散して実現することができる。
【００６４】
この時、書き込みコア６０１が設けられたＣＰＵに対し、書き込み操作を実現する実行コードおよびこの実行コードを含む関数がローカルに保持される。そして、書き込みコア６０１が設けられたＣＰＵが、書き込み操作を実現する実行コードおよびこの実行コードを含む関数を実行することでアクセス制御部６０３を実現することができる。
【００６５】
また、読み出しコア６０２−１、６０２−２、６０２−３が設けられたＣＰＵに対し、読み出し操作を実現する実行コードおよびこの実行コードを含む関数がローカルに保持される。そして、読み出しコア６０２−１、６０２−２、６０２−３が設けられたＣＰＵが、読み出し操作を実現する実行コードおよびこの実行コードを含む関数を実行することでアクセス制御部６０３を実現することができる。
【００６６】
さらに、共有メモリ６１０には、カウンタ配列領域６１２およびレジスタ６１３、６１４が設けられている。カウンタ配列領域６１２は、読み出しコア６０２−１、６０２−２、６０２−３からバンクメモリＢ［１］〜Ｂ［５］への現在のアクセス数のカウント値ＵＢＣ［１］〜ＵＢＣ［５］をバンクメモリＢ［１］〜Ｂ［５］ごとに対応して記憶する。カウンタ配列領域６１２のＵＢＣ［１］〜ＵＢＣ［５］をバンク使用中カウンタと呼ぶ。
【００６７】
レジスタ６１３は、書き込みコア６０１によって最後に書き込みが行われたバンクメモリＢ［１］〜Ｂ［５］を特定するバンク番号＃１〜＃５を記憶する。レジスタ６１３で示されるバンクメモリＢ［１］〜Ｂ［５］を最新データバンクと言う。レジスタ６１４は、最後に書き込みが行われたバンクメモリＢ［１］〜Ｂ［５］（すなわちレジスタ６１３で示されるバンクメモリ）以外で、かついずれの読み出しコア６０２−１、６０２−２、６０２−３からもアクセスされていないバンクメモリＢ［１］〜Ｂ［５］を特定するバンク番号＃１〜＃５を記憶する。レジスタ６１４で示されるバンクメモリＢ［１］〜Ｂ［５］をフリーバンクと言う。
【００６８】
この時、書き込みコア６０１および読み出しコア６０２−１、６０２−２、６０２−３は、カウンタ配列領域６１２に記憶されたカウント値ＵＢＣ［１］〜ＵＢＣ［５］およびレジスタ６１３、６１４に記憶されたバンク番号＃１〜＃５を参照したり、変更したりすることができる。
【００６９】
カウンタ配列領域６１２に記憶されたカウント値ＵＢＣ［１］〜ＵＢＣ［５］およびレジスタ６１３、６１４に記憶されたバンク番号＃１〜＃５を変更する場合、他の書き込みコア６０１および読み出しコア６０２−１、６０２−２、６０２−３からの干渉（競合）を排除できるようにアトミック命令を使用することができる。
【００７０】
読み出しコア６０２−１、６０２−２、６０２−３からの読み出し要求があると、アクセス制御部６０３は、レジスタ６１３に記憶されたバンク番号＃１〜＃５を参照する。そして、その参照結果に基づいて、最後に書き込みが行われたバンクメモリＢ［１］〜Ｂ［５］を特定し、そのバンク番号＃１〜＃５を読み出しコア６０２−１、６０２−２、６０２−３に通知する。さらに、アクセス制御部６０３は、レジスタ６１３に記憶されたバンク番号＃１〜＃５に対応するバンクメモリＢ［１］〜Ｂ［５］のカウント値ＵＢＣ［１］〜ＵＢＣ［５］を１だけインクリメントする。
【００７１】
次に、読み出しコア６０２−１、６０２−２、６０２−３からバンクメモリＢ［１］〜Ｂ［５］の返却要求があると、アクセス制御部６０３は、そのバンクメモリＢ［１］〜Ｂ［５］のカウント値ＵＢＣ［１］〜ＵＢＣ［５］を１だけデクリメントする。そして、そのバンクメモリＢ［１］〜Ｂ［５］のカウント値ＵＢＣ［１］〜ＵＢＣ［５］が０、かつバンク番号＃１〜＃５がレジスタ６１３に記憶されたバンク番号＃１〜＃５と不一致の場合、そのバンクメモリＢ［１］〜Ｂ［５］のバンク番号＃１〜＃５をレジスタ６１４に登録する。
【００７２】
一方、書き込みコア６０１からの書き込み要求があると、アクセス制御部６０３は、レジスタ６１４に記憶されたバンク番号＃１〜＃５を参照する。そして、その参照結果に基づいて、最後に書き込みが行われたバンクメモリＢ［１］〜Ｂ［５］（すなわちレジスタ６１３で示されるバンクメモリ）以外で、かついずれの読み出しコア６０２−１、６０２−２、６０２−３による読み出しにも使用されていないバンクメモリＢ［１］〜Ｂ［５］を特定する。そして、アクセス制御部６０３は、その特定されたバンクメモリＢ［１］〜Ｂ［５］のバンク番号＃１〜＃５を書き込みコア６０１に通知する。さらに、アクセス制御部６０３は、書き込みコア６０１に通知したバンク番号＃１〜＃５をレジスタ６１４から削除する。
【００７３】
書き込みが行われるバンクメモリＢ［１］〜Ｂ［５］のバンク番号＃１〜＃５が書き込みコア６０１に通知される前に、最新のデータを保持しているバンクメモリＢ［１］〜Ｂ［５］（すなわちレジスタ６１３で示されるバンクメモリ）のデータが、書き込みコア６０１に通知されるバンク番号＃１〜＃５に対応したバンクメモリＢ［１］〜Ｂ［５］にコピーされる。この時、書き込みコア６０１は、前回の書き込み時から値が変化した差分のみを書き換えることができる。
【００７４】
書き込みコア６０１が最新のデータを書いたバンクメモリＢ［１］〜Ｂ［５］を公開する場合、レジスタ６１３に今まで記憶されたバンク番号＃１〜＃５が、最新のデータが書かれたバンクメモリＢ［１］〜Ｂ［５］のバンク番号＃１〜＃５に書き換えられる。レジスタ６１３に今まで記憶されたバンク番号＃１〜＃５に対応するバンクメモリＢ［１］〜Ｂ［５］のカウント値ＵＢＣ［１］〜ＵＢＣ［５］が０の場合、そのバンクメモリＢ［１］〜Ｂ［５］のバンク番号＃１〜＃５がレジスタ６１４に登録される。
【００７５】
以下、書き込みコア６０１および読み出しコア６０２−１、６０２−２、６０２−３の動作について時系列順に説明する。各バンクメモリＢ［１］〜Ｂ［５］の左下に表記した添え字付きのＷの数字の順番でバンクメモリＢ［１］〜Ｂ［５］の値が更新された（書き込まれた）ものとする。この時、バンクメモリＢ［１］〜Ｂ［５］の読み出しコアからの被参照数に対応してカウント値ＵＢＣ［１］〜ＵＢＣ［５］が設定される。
【００７６】
Ｗ−２で２回前に書き込まれたバンクメモリＢ［２］のカウント値ＵＢＣ［２］は２である。この時、２個の読み出しコア６０２−１、６０２−２がバンクメモリＢ［２］にアクセス中である。Ｗ−３で３回前に書き込まれたバンクメモリＢ［３］のカウント値ＵＢＣ［３］は１である。この時、１個の読み出しコア６０２−３がバンクメモリＢ［３］にアクセス中である。
【００７７】
Ｗ−１で前回に最新のデータとして書き込まれたバンクメモリＢ［４］のカウント値ＵＢＣ［４］は０であり、まだどの読み出しコア６０２−１〜６０２−３も読み出していない。この時、バンクメモリＢ［４］のバンク番号＃４はレジスタ６１３に登録される。
【００７８】
Ｗ−∞で少なくとも注目している時間帯では、書き込まれていないバンクメモリＢ［５］のカウント値ＵＢＣ［５］は０であり、どの読み出しコア６０２−１〜６０２−３からもアクセスされていない。この時、バンクメモリＢ［５］はフリーバンクとなり、そのバンク番号＃５はレジスタ６１４に登録される。
【００７９】
ここで、書き込みコア６０１からの書き込み要求があると、それまでレジスタ６１４に登録されていたバンク番号＃１のバンクメモリＢ［１］が書き込み用に予約バンクとして確保され、書き込みコア６０１に提供される。この時、バンクメモリＢ［１］のカウント値ＵＢＣ［１］は０である。バンクメモリＢ［１］が書き込みコア６０１に提供する前に、それまでの最新のデータが記憶されていたバンクメモリＢ［４］（すなわちレジスタ６１３で示されるバンクメモリ）のデータがバンクメモリＢ［１］にコピーされる（６１５）。
【００８０】
書き込みコア６０１からバンクメモリＢ［１］への書き込みが終わり、そのバンクメモリＢ［１］が読み出しコア６０２−１〜６０２−３に公開されると、レジスタ６１３にそれまで登録されていたバンク番号＃４がバンク番号＃１に書き換えられる。前回までの（一段古い）最新のデータが格納されていたバンクメモリＢ［４］のカウント値ＵＢＣ［４］は０であり、どの読み出しコア６０２−１〜６０２−３からも読み出し中ではない。このため、バンクメモリＢ［４］はフリーバンクとなり、バンクメモリＢ［４］のバンク番号＃４がレジスタ６１４に登録される。すなわち、レジスタ６１４に登録されたバンク番号は｛＃１，＃５｝から｛＃４，＃５｝に変化する。
【００８１】
ここで、読み出しコア６０２−１〜６０２−３は、バンクメモリＢ［１］〜Ｂ［５］にアクセスする時に、レジスタ６１３に登録されたバンク番号＃１〜＃５を参照することにより、書き込みコア６０１による書き込みと競合することなく、バンクメモリＢ［１］〜Ｂ［５］から最新のデータを読み出すことができる。書き込みコア６０１は、バンクメモリＢ［１］〜Ｂ［５］にアクセスする時に、レジスタ６１４に登録されたバンク番号＃１〜＃５を参照することにより、読み出しコア６０２−１〜６０２−３による読み出しと競合することなく、バンクメモリＢ［１］〜Ｂ［５］に最新のデータを書き込むことができる。
【００８２】
この時、バンクメモリＢ［１］〜Ｂ［５］に書き込める書き込みコア６０１を１個のみに制限することにより、バンクメモリＢ［１］〜Ｂ［５］に書きこまれたデータセットの同時性を確保しつつ、最新のデータが書き込まれたバンクメモリＢ［１］〜Ｂ［５］を正確に指定することが可能となる。
【００８３】
これにより、ロックレスで書き込みコア６０１と読み出しコア６０２−１〜６０２−３との間でのデータ伝達の最新性および同時性を保証することができる。すなわち、マルチコアシステムによる処理のリアルタイム性を向上させつつ、同時性が確保された最新データセットをコア間で伝達することが可能となる。読み出しコアの個数が増加しても、スクラッチパッド・メモリ６１１内のメモリバンクの個数を増加させることで対処できる。したがって、スピンロックによる待ち時間を必要としない１対ｎの同報データ伝達装置を実現することができる。
【００８４】
書き込みコア６０１と読み出しコア６０２−１〜６０２−３の動作タイミングは非同期である。読み出し周期より書き込み周期の方が早ければ、読み出し側で適宜データを読み飛ばすことができ、書き込み周期より読み出し周期の方が早ければ、同一データを適宜重ね読みすることができる。このため、マルチコアシステムの書き込み周期と読み出し周期とを一致させる必要がなくなり、各コアに対するデータ入出力期間の柔軟性を向上させることができる。
【００８５】
図７は、実施形態に係るデータ伝達装置の読み出し手続きを示すフローチャートである。
図７において、読み出し手続きＳ７００が開始されると、読み出しコア６０２−１〜６０２−３は、Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０を呼び、戻り値よりアクセス可能なバンク番号ｉｄを取得する（ステップＳ７１０）。なお、図６の例では、バンク番号ｉｄは、＃１〜＃５のいずれかの値に設定される。
【００８６】
次に、読み出しコア６０２−１〜６０２−３は、ｒｅａｄ（ｉｄ，ｏｆｆｓｅｔ）を実行する。この時、そのバンク番号ｉｄで指定されるバンクメモリＢ［ｉｄ］の先頭よりのオフセットアドレスｏｆｆｓｅｔで所望の変数値ｄａｔａを読み出す（ステップＳ７２０）。ステップＳ７２０は、所望の変数値ｄａｔａをすべて読み出すまで繰り返し実行することができる。
【００８７】
次に、読み出しコア６０２−１〜６０２−３は、Ｒｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０を呼び出し、Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０で確保したバンクの返却を行う（ステップＳ７３０）。Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０のコールとＲｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０のコールとの間では、Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０で確保されたバンクメモリＢ［ｉｄ］のデータはキャプチャされ、他の要因で変更されることはない。このため、演算処理などに使われるデータセットの同時性を確保することができる。
【００８８】
上述した実施形態では、一連の読み出し手続きＳ７００が、コアごとに１か所で使われる前提で説明したが、同一コアのプリエンプション可能な別タスクの複数個所で使われてもよい。その場合は、読み出し複数個所に相当する分読み出しコア数が増えたものと見なし、バンクメモリの数を増加させて対応することができる。ただし、メモリ資源の節約の観点から、同一コアの主たる１か所のタスクがアクセスし、値はローカル変数にコピーして複数のタスクで使いまわす方がよい。この［１外部入力インターフェース／１コア］の手法により、管理上の煩雑さの低減、デバッグおよび変更の容易化を図ることができる。
【００８９】
Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０では、レジスタ６１３より最新のデータが存在するバンクメモリＢ［１］〜Ｂ［５］のバンク番号＃１〜＃５を取得する。この時、最新のデータが存在するバンクメモリＢ［１］〜Ｂ［５］のバンク番号＃１〜＃５をＬＩＢＲ（Ｌａｔｅｓｔ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｂａｎｋ  Ｒｅｇｉｓｔｅｒ）とすると、変数ｘにＬＩＢＲを設定する。
【００９０】
そして、そのバンクメモリＢ［１］〜Ｂ［５］のカウント値ＵＢＣ［ｘ］を１だけインクリメントする（ステップＳ７１１）。レジスタ６１３およびカウント値ＵＢＣ［１］〜ＵＢＣ［５］は共有メモリ６１０上に存在しているため、これらの操作はアトミック命令で実行される。
【００９１】
次に、最新のデータが存在するバンクメモリＢ［１］〜Ｂ［５］のバンク番号＃１〜＃５を特定する変数ｘを戻り値として、メインルーチンにリターンを行う（ステップＳ７１２）。
【００９２】
Ｒｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０では、バンク番号ｉｄで指定されるバンクメモリＢ［ｉｄ］の返却に先立って、そのバンクメモリＢ［ｉｄ］のカウント値ＵＢＣ［ｉｄ］を１だけデクリメントする（ステップＳ７３１）。カウント値ＵＢＣ［ｉｄ］は共有メモリ６１０上に存在しているため、この操作はアトミック命令で実行される。
【００９３】
次に、カウント値ＵＢＣ［ｉｄ］が０となり、かつバンク番号ｉｄがレジスタ６１３に登録されたバンク番号＃１〜＃５とが一致しない（すなわち最新データではない）場合、バンク番号ｉｄで指定されるバンクメモリＢ［ｉｄ］をフリーバンクとみなし、そのバンク番号ｉｄをレジスタ６１４に登録する（ステップＳ７３２）。レジスタ６１３、６１４およびカウント値ＵＢＣ［１］〜ＵＢＣ［５］は共有メモリ６１０上に存在しているため、これらの操作はアトミック命令で実行される。
【００９４】
次に、メインルーチンにリターンし、一連の読み出し手続きＳ７００を終了する（ステップＳ７３３）。
【００９５】
図８は、実施形態に係るデータ伝達装置の書き込み手続きを示すフローチャートである。
図８において、書き込み手続きＳ８００が開始されると、書き込みコア６０１は、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０を呼び、戻り値よりアクセス可能なバンク番号ｉｄを取得する（ステップＳ８１０）。なお、図６の例では、バンク番号ｉｄは、＃１〜＃５のいずれかの値に設定される。
【００９６】
次に、書き込みコア６０１は、ｗｒｉｔｅ（ｉｄ，ｏｆｆｓｅｔ，ｄａｔａ）を実行する。この時、そのバンク番号ｉｄで指定されるバンクメモリＢ［ｉｄ］の先頭よりのオフセットアドレスｏｆｆｓｅｔで所望の変数値ｄａｔａを書き換える（ステップＳ８２０）。ステップＳ８２０は、要求する変数値ｄａｔａをすべて書き換えるまで繰り返し実行することができる。
【００９７】
値に変化のない変数は、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０で前回の最新のデータがあらかじめコピーされており、何も操作を行う必要がない。
【００９８】
次に、Ｐｕｔ＿Ｂａｎｋ関数ｆ８３０を呼び出し、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０で確保したバンクメモリＢ［ｉｄ］の公開を行う（ステップＳ８３０）。Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０のコールとＰｕｔ＿Ｂａｎｋ関数ｆ８３０のコールとの間では、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０で確保したバンクメモリＢ［ｉｄ］のデータは、読み出しコア６０２−１〜６０２−３のアクセスから保護され、他の要因で参照されることはない。このため、読み出しコア６０２−１〜６０２−３の視点で、演算処理などに使われるデータセットの同時性を確保することができる。
【００９９】
Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０では、レジスタ６１４よりフリーバンクのバンク番号＃１〜＃５を取得し、そのバンク番号＃１〜＃５をレジスタ６１４から削除する（スステップＳ８１１）。図８では、レジスタ６１４をＦＢＲ（Ｆｒｅｅ  Ｂａｎｋ  Ｒｅｇｉｓｔｅｒ）として表し、ＦＢＲからバンク番号を1つ選択して変数ｘに設定している。ＦＢＲから選択して取り出したバンク番号は、ＦＢＲ自体からは削除される。レジスタ６１４は共有メモリ６１０上に存在しているため、これらの操作はアトミック命令で実行される。
【０１００】
次に、最新データが確保されているバンクメモリＢ［ＬＩＢＲ］から、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０で確保されたバンクメモリＢ［ｘ］にデータのコピーを行う（ステップＳ８１２）。
【０１０１】
次に、フリーバンクのバンク番号＃１〜＃５を特定する変数ｘを戻り値として、メインルーチンにリターンを行う（ステップＳ８１３）。
【０１０２】
Ｐｕｔ＿Ｂａｎｋ関数ｆ８３０では、バンク番号で指定されるバンクメモリＢ［ｉｄ］の公開に先立って、今までのＬＩＢＲの値を呼び出し、変数ｏｌｄに一旦保存する（ステップＳ８３１）。変数ｏｌｄは、書き込みコア６０１のローカルＲＡＭ（１０２、１１２）に格納するため、アトミック命令を使わなくてよい。
【０１０３】
次に、レジスタ６１３に登録されているＬＩＢＲの値を今回公開するバンクメモリＢ［ｉｄ］のバンク番号ｉｄで書き換える（ステップＳ８３２）。レジスタ６１３は共有メモリ６１０上に位置しているが、値を書き換える関数はこのＰｕｔ＿Ｂａｎｋ関数ｆ８３０しか存在しないため、アトミック命令を使わなくてもよい。また、この時点では、最新のデータの準備が完了しているため、任意の読み出しコア６０２−１〜６０２−３から値を参照することができる。
【０１０４】
次に、一つ前の最新データが確保されていたバンクメモリＢ［ｏｌｄ］のカウント値ＵＢＣ［ｏｌｄ］がチェックされる（ステップＳ８３３）。このカウント値ＵＢＣ［ｏｌｄ］が０であった場合、そのバンクメモリＢ［ｏｌｄ］は、どの読み出しコア６０２−１〜６０２−３からも参照されておらず、データが古くなっている。このため、バンクメモリＢ［ｏｌｄ］をフリーバンクとみなし、この変数ｏｌｄをレジスタ６１４（図８ではＦＢＲと表記）に登録する。レジスタ６１４およびカウント値ＵＢＣ［１］〜ＵＢＣ［５］は共有メモリ６１０上に存在しているため、これらの操作はアトミック命令で実行される。
【０１０５】
次に、メインルーチンにリターンし、一連の書き込み手続きＳ８００を終了する（ステップＳ８３４）。
【０１０６】
以下、図６から図８で説明した実施形態をマルチコア組み込み制御ソフトに適用した例を示す。この適用例として、図１のエンジンの燃料噴射系を例にとる。この時、図１のＣＰＵ１００には、図６の書き込みコア６０１を設けることができる。図１のＣＰＵ１１０には、図６の読み出しコア６０２−１を設けることができる。図１の共有ＲＡＭ１２０には、図６のバンクメモリＢ［１］〜Ｂ［３］（なぜ３つのバンクメモリが必要かは図１２で示す）およびレジスタ６１３、６１４を設けるとともに、カウント値ＵＢＣ［１］〜ＵＢＣ［３］を記憶することができる。バンクメモリＢ［１］〜Ｂ［３］を束ねることでスクラッチパッド・メモリ６１１を構成することができる。
【０１０７】
Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０およびＰｕｔ＿Ｂａｎｋ関数ｆ８３０は、実行コード１０１が格納された実行コード格納領域に実装することができる。Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０およびＲｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０は、実行コード１１１が格納された実行コード格納領域に実装することができる。
【０１０８】
図９は、実施形態に係るデータ伝達装置がエンジンの燃料噴射系に適用された時のデータ伝達手順を示すフローチャートである。なお、図９では、図１のエンジンの燃料噴射系に図２の（ａ）のマスフロー方式が適用された場合を示した。
【０１０９】
図９において、ＣＰＵ１００には、リアルタイムＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）９００が実装されている。ＣＰＵ１００は、このＯＳ９００の指揮下のもとに５ｍｓと１０ｍｓのタスクを周期的に実行することができる。ＯＳ９００は、図１の実行コード１０１に実装することができる。なお、５ｍｓというタスクの実行時間は、吸入空気量Ｑの計算９０１に用いられるデジタルフィルタのサンプリング周期に基づいて設定することができる。１０ｍｓというタスクの実行時間は、エンジン回転数Ｎｅの計算９０２に用いられるデジタルフィルタのサンプリング周期に基づいて設定することができる。
【０１１０】
ＣＰＵ１００は、主にセンサからの入力処理を担当する。５ｍｓのタスクでは、吸入空気量Ｑの計算９０１を行う。１０ｍｓのタスクでは、エンジン回転数Ｎｅの計算９０２を行う。この計算９０１、９０２の結果として、｛Ｑ，Ｎｅ｝のデータセットの瞬時値が確定する。吸入空気量Ｑの計算９０１およびエンジン回転数Ｎｅの計算９０２は、実行コード１０１を用いてローカルＲＡＭ１０２のメモリ資源を利用しつつ行われる。
【０１１１】
次に、ＣＰＵ１００は、図８の書き込み手続きＳ８００を実行することにより、共有ＲＡＭ１２０に設けられたバンクメモリＢ［１］〜Ｂ［３］に最新の｛Ｑ，Ｎｅ｝のデータセットを書き込むことができる（９０３）。
【０１１２】
この時、ＣＰＵ１００は、書き込み手続きＳ８００においてＲｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０およびＰｕｔ＿Ｂａｎｋ関数ｆ８３０を呼び出すことにより、カウント値ＵＢＣ［１］〜ＵＢＣ［３］およびレジスタ６１３、６１４の値の参照や更新を行いつつ、書き込みバンクメモリＢ［１］〜Ｂ［３］を確保したり、バンクメモリＢ［１］〜Ｂ［３］を公開したりすることができる。Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０およびＰｕｔ＿Ｂａｎｋ関数ｆ８３０の処理は、実行コード１０１を用いて、カウント値ＵＢＣ［１］〜ＵＢＣ［３］およびレジスタ６１３、６１４の値の参照や更新を行いつつ、共有ＲＡＭ１２０上のスクラッチパッド・メモリ６１１に対して行われる。最新の｛Ｑ，Ｎｅ｝のデータセットの準備時間および送信時間（書き込み手続きＳ８００にかかる時間）を延長しても、他の読み出しコアの動作遅延を引き起こすことはない。
【０１１３】
ＣＰＵ１１０には、リアルタイムＯＳ９１０が実装されている。ＣＰＵ１１０は、このＯＳ９１０の指揮下のもとに１５ｍｓのタスクを周期的に実行することができる。ＯＳ９１０は、図１の実行コード１１１に実装することができる。なお、１５ｍｓというタスクの実行時間は、出力アクチュエータの動作時間（要求される時間分解能）に基づいて設定することができる。
【０１１４】
ＣＰＵ１１０は、主に演算と出力アクチュエータの指示値計算を担当する。１５ｍｓのタスクでは、スクラッチパッド・メモリ６１１の読み出しと、燃料噴射量ｑの計算９１２を行う。燃料噴射量ｑの計算９１２は、実行コード１１１を用いてローカルＲＡＭ１１２のメモリ資源を利用しつつ行われる。
【０１１５】
燃料噴射量ｑの計算９１２を行うために、ＣＰＵ１１０は、図７の読み出し手続きＳ７００を実行することにより、共有ＲＡＭ１２０に設けられたバンクメモリＢ［１］〜Ｂ［３］から最新の｛Ｑ，Ｎｅ｝のデータセットを読み出すことができる（９１１）。
【０１１６】
この時、ＣＰＵ１１０は、読み出し手続きＳ７００においてＧｅｔ＿Ｂａｎｋ関数ｆ７１０およびＲｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０を呼び出すことにより、カウント値ＵＢＣ［１］〜ＵＢＣ［３］およびレジスタ６１３、６１４の値の参照や更新を行いつつ、読み出しバンクメモリＢ［１］〜Ｂ［３］を確保したり、バンクメモリＢ［１］〜Ｂ［３］を返却したりすることができる。Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０およびＲｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０の処理は、実行コード１１１を用いて、カウント値ＵＢＣ［１］〜ＵＢＣ［３］およびレジスタ６１３、６１４の値の参照や更新を行いつつ、共有ＲＡＭ１２０上のスクラッチパッド・メモリ６１１に対して行われる。
【０１１７】
Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０の処理と、Ｒｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０の処理との間は、バンクメモリＢ［１］〜Ｂ［３］の内容がそのまま保持されるので、そのバンクメモリＢ［１］〜Ｂ［３］上の任意の変数を任意の回数だけ読み出すことができる。
また、この保持時間（読み出し手続きＳ７００にかかる時間）をどれだけ延長しても、他の書き込みコアおよび読み出しコアの動作遅延を引き起こすことはない。
【０１１８】
図１０は、実施形態に係るデータ伝達装置がエンジンの燃料噴射系に適用された時のデータ伝達方法を時系列的に示すシーケンス図である。
図１０において、ＣＰＵ１００のＱ計算９０１では、吸入空気量Ｑ１〜Ｑ１０が５ｍｓごとに計算される。ＣＰＵ１００のＮｅ計算９０２では、エンジン回転数Ｎｅ１〜Ｎｅ５が１０ｍｓごとに計算される。バンク出力９０３では、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０およびＰｕｔ＿Ｂａｎｋ関数ｆ８３０が１０ｍｓごとに呼び出され、バンクメモリＢ［１］〜Ｂ［３］に｛Ｑ，Ｎｅ｝のデータセットが書き込まれる。
【０１１９】
スクラッチパッド・メモリ６１１のバンクメモリＢ［１］〜Ｂ［３］に最新の｛Ｑ，Ｎｅ｝のデータセットが書き込まれると、この最新の｛Ｑ，Ｎｅ｝のデータセットが書き込まれたバンクメモリＢ［１］〜Ｂ［３］のバンク番号＃１〜＃３がレジスタ６１３に登録される。図１０ではレジスタ６１３がＬＩＢＲと表現されている。この最新データによるバンク内容のデータ変化を１０００で示す。
【０１２０】
Ｑ計算９０１は５ｍｓごとであり、Ｎｅ計算９０２は１０ｍｓごとである。このため、バンク出力９０３からは、Ｑ計算９０１による吸入空気量Ｑ１〜Ｑ１０は２回に１回読み飛ばしが起こっているように見える。しかしながら、実際には、Ｑ計算９０１の出力はデジタルフィルタの出力値である。このため、デジタルフィルタのサンプリングタイムでＱ計算９０１の計算周期が決定され、Ｑ計算９０１による吸入空気量Ｑ２、Ｑ４、Ｑ６、Ｑ８、Ｑ１０はバンク出力９０３として採用されなくても、バンク出力９０３として採用される吸入空気量Ｑ１、Ｑ３、Ｑ５、Ｑ７、Ｑ９に影響を与えるサンプル値である。このため、吸入空気量Ｑ２、Ｑ４、Ｑ６、Ｑ８、Ｑ１０のＱ計算９０１は無駄ではない。
【０１２１】
バンク入力９１１では、Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０およびＲｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０が１５ｍｓごとに呼び出され、バンクメモリＢ［１］〜Ｂ［３］から最新の｛Ｑ，Ｎｅ｝のデータセットが読み出される。ＣＰＵ１１０のｑ計算９１２では、最新の｛Ｑ，Ｎｅ｝のデータセットに基づいて燃料噴射量ｑ１〜ｑ３が１５ｍｓごとに計算される。
【０１２２】
例えば、ＣＰＵ１００が吸入空気量Ｑ１およびエンジン回転数Ｎｅ１を計算した時にバンクメモリＢ［３］がフリーバンクであるものとすると、ＣＰＵ１００は、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０にてバンクメモリＢ［３］を確保し、｛Ｑ１，Ｎｅ１｝のデータセットをバンクメモリＢ［３］に書き込む。そして、Ｐｕｔ＿Ｂａｎｋ関数ｆ８３０にてバンクメモリＢ［３］を公開する。この時、最新のデータが登録されたバンクメモリＢ［３］のバンク番号＃３がＬＩＢＲ（レジスタ６１３）で示される。
【０１２３】
次に、ＣＰＵ１１０は、Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０にてバンクメモリＢ［３］を確保し、｛Ｑ１，Ｎｅ１｝のデータセットをバンクメモリＢ［３］から読み出す。そして、ＣＰＵ１１０は、｛Ｑ１，Ｎｅ１｝のデータセットに基づいて燃料噴射量ｑ１を計算し、Ｒｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０にてバンクメモリＢ［３］を返却する。
【０１２４】
ＣＰＵ１１０がバンクメモリＢ［３］を返却する前に、ＣＰＵ１００は吸入空気量Ｑ３およびエンジン回転数Ｎｅ２を計算する。この時、バンクメモリＢ［２］がフリーバンクであるものとすると、ＣＰＵ１００は、バンクメモリＢ［３］の返却を待つことなく、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０にてバンクメモリＢ［２］を確保し、｛Ｑ３，Ｎｅ２｝のデータセットをバンクメモリＢ［２］に書き込む。そして、Ｐｕｔ＿Ｂａｎｋ関数ｆ８３０にてバンクメモリＢ［２］を公開する。この時、最新のデータが登録されたバンクメモリＢ［２］のバンク番号＃２がＬＩＢＲ（レジスタ６１３）で示される。
【０１２５】
次に、ＣＰＵ１１０は、Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０にてバンクメモリＢ［２］を確保し、｛Ｑ３，Ｎｅ２｝のデータセットをバンクメモリＢ［２］から読み出す。そして、ＣＰＵ１１０は、｛Ｑ３，Ｎｅ２｝のデータセットに基づいて燃料噴射量ｑ２を計算し、Ｒｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０にてバンクメモリＢ［２］を返却する。
【０１２６】
ＣＰＵ１１０がバンクメモリＢ［２］を返却する前に、ＣＰＵ１００は吸入空気量Ｑ５およびエンジン回転数Ｎｅ３を計算する。この時、バンクメモリＢ［１］がフリーバンクであるものとすると、ＣＰＵ１００は、バンクメモリＢ［２］の返却を待つことなく、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０にてバンクメモリＢ［１］を確保し、｛Ｑ５，Ｎｅ３｝のデータセットをバンクメモリＢ［１］に書き込む。そして、Ｐｕｔ＿Ｂａｎｋ関数ｆ８３０にてバンクメモリＢ［１］を公開する。この時、最新のデータが登録されたバンクメモリＢ［１］のバンク番号＃１がＬＩＢＲ（レジスタ６１３）で示される。
【０１２７】
この時、ＣＰＵ１１０は、最新のデータが登録されたバンクメモリＢ［１］がＬＩＢＲで示されている場合においても、ＣＰＵ１１０は、バンクメモリＢ［２］を返却する前に、それより古い｛Ｑ３，Ｎｅ２｝のデータセットに基づいて燃料噴射量ｑ２の計算を続行することができる。
【０１２８】
次に、ＣＰＵ１００が吸入空気量Ｑ７およびエンジン回転数Ｎｅ４を計算した時にバンクメモリＢ［３］がフリーバンクであるものとすると、ＣＰＵ１００は、Ｒｅｓｅｒｖｅ＿Ｂａｎｋ関数ｆ８１０にてバンクメモリＢ［３］を確保し、｛Ｑ７，Ｎｅ４｝のデータセットをバンクメモリＢ［３］に書き込む。そして、Ｐｕｔ＿Ｂａｎｋ関数ｆ８３０にてバンクメモリＢ［３］を公開する。この時、最新のデータが登録されたバンクメモリＢ［３］のバンク番号＃３がＬＩＢＲ（レジスタ６１３）で示される。
【０１２９】
次に、ＣＰＵ１１０は、Ｇｅｔ＿Ｂａｎｋ関数ｆ７１０にてバンクメモリＢ［３］を確保し、｛Ｑ７，Ｎｅ４｝のデータセットをバンクメモリＢ［３］から読み出す。そして、ＣＰＵ１１０は、｛Ｑ７，Ｎｅ４｝のデータセットに基づいて燃料噴射量ｑ３を計算し、Ｒｅｌｅａｓｅ＿Ｂａｎｋ関数ｆ７３０にてバンクメモリＢ［３］を返却する。
【０１３０】
この時、バンクメモリＢ［１］に書き込まれた｛Ｑ５，Ｎｅ３｝のデータセットは、バンクメモリＢ［３］に書き込まれた｛Ｑ７，Ｎｅ４｝のデータセットより古くなっている。このため、ＣＰＵ１１０は、バンクメモリＢ［１］に書き込まれた｛Ｑ５，Ｎｅ３｝のデータセットを読み出すことなく、｛Ｑ７，Ｎｅ４｝のデータセットをバンクメモリＢ［３］から読み出すことができる。この時、｛Ｑ５，Ｎｅ３｝のデータセットの読み飛ばし１００１を行うことができる。
【０１３１】
すなわち、ＣＰＵ１００がスクラッチパッド・メモリ６１１に対して行うバンク出力９０３は１０ｍｓの周期で実行される。スクラッチパッド・メモリ６１１からＣＰＵ１１０へのバンク入力９１１は１５ｍｓの周期で実行される。この時、スクラッチパッド・メモリ６１１のデータ変化１０００に着目すると、バンク出力９０３が３回だけ行われるごとに、バンク入力９１１に対するデータセットの読み飛ばし１００１を１回だけ行うことができる。
【０１３２】
このように、送り手と受け手が非同期でデータの授受を可能とすることで、受け手は要求すれば少なくとも最新のデータセットを常時取得することができる。また、送り手は受け手の都合を考慮せずに最新値の更新に専念できる。したがって、データの送り手と受け手とが疎結合であり、一方の動作のタイミングに他方の動作が引きずられることがないので、ロバスト性を確保することができる。
【０１３３】
図１１（ａ）は、実施形態に係るデータ伝達装置の書き込みコアとスクラッチパッド・メモリとの占有関係を示す図である。
【０１３４】
図１１（ａ）において、４個のスクラッチパッド・メモリＰ１〜Ｐ４と、これらのスクラッチパッド・メモリＰ１〜Ｐ４にアクセス可能な４個のコアＣ１〜Ｃ４が設けられている。この時、スクラッチパッド・メモリＰ１〜Ｐ４の個数と、コアＣ１〜Ｃ４の個数とは等しくすることができる。各スクラッチパッド・メモリＰ１〜Ｐ４には、５個のバンクメモリを設けることができる。例えば、スクラッチパッド・メモリＰ１は、図６のスクラッチパッド・メモリ６１１と同様に構成することができる。各スクラッチパッド・メモリＰ１〜Ｐ４のバンク数は、総コア数＋１に設定することができる。スクラッチパッド・メモリＰ１〜Ｐ４は、共有メモリ６１０に配置することができる。
【０１３５】
コアＣ１〜Ｃ４は、書き込みにおよび読み出し使われるＣＰＵに設けることができる。この時、各コアＣ１〜Ｃ４は、アクセスするスクラッチパッド・メモリＰ１〜Ｐ４に応じて書き込みコアとして動作したり、読み出しコアとして動作したりすることができる。
【０１３６】
ここで、コアＣ１は、スクラッチパッド・メモリＰ１に対しては書き込みコアとして動作し、スクラッチパッド・メモリＰ２〜Ｐ４に対しては読み出しコアとして動作することができる。コアＣ２は、スクラッチパッド・メモリＰ２に対しては書き込みコアとして動作し、スクラッチパッド・メモリＰ１、Ｐ３、Ｐ４に対しては読み出しコアとして動作することができる。コアＣ３は、スクラッチパッド・メモリＰ３に対しては書き込みコアとして動作し、スクラッチパッド・メモリＰ１、Ｐ２、Ｐ４に対しては読み出しコアとして動作することができる。コアＣ４は、スクラッチパッド・メモリＰ４に対しては書き込みコアとして動作し、スクラッチパッド・メモリＰ１〜Ｐ３に対しては読み出しコアとして動作することができる。
【０１３７】
すなわち、各コアＣ１〜Ｃ４は、自分がライト・オーナーであるスクラッチパッド・メモリＰ１〜Ｐ４に関しては書き込みコア６０１であり、他のコアＣ１〜Ｃ４がライト・オーナーであるスクラッチパッド・メモリＰ１〜Ｐ４に関しては読み出しコア６０２−１〜６０２−３の一つである関係が成立する。
【０１３８】
図１１（ｂ）は、実施形態に係るデータ伝達装置の各コアごとのスクラッチパッド・メモリへの操作関数の割り当て方法を示す図である。これらの操作関数は、各コアのローカルな実行コード格納領域に格納することができる。
【０１３９】
自分がライト・オーナーであるスクラッチパッド・メモリに関しては書き込み系関数Ｒｅｓｅｒｖｅ＿Ｂａｎｋ＿Ｐ（）およびＰｕｔ＿Ｂａｎｋ＿Ｐ（）が実装され、その他のスクラッチパッド・メモリに関しては読み出し系関数Ｇｅｔ＿Ｂａｎｋ＿Ｐ（）およびＲｅｌｅａｓｅ＿Ｂａｎｋ＿Ｐ（）が実装される。ただし、Ｐはスクラッチパッド・メモリＰ１〜Ｐ４のメモリ番号である。
【０１４０】
ここで、スクラッチパッド・メモリＰ１〜Ｐ４を複数設け、スクラッチパッド・メモリＰ１〜Ｐ４の個数とコアＣ１〜Ｃ４の個数とを等しくすることにより、一つのスクラッチパッド・メモリに書き込みコアが一つしか割り当てられないシステムを構成すると、複数のコアＣ１〜Ｃ４が同時に書き込み動作を実行することが可能となる。
【０１４１】
また、自分がライト・オーナーであるスクラッチパッド・メモリＰ１〜Ｐ４以外についての書き込み系関数Ｒｅｓｅｒｖｅ＿Ｂａｎｋ＿Ｐ（）およびＰｕｔ＿Ｂａｎｋ＿Ｐ（）を保持しないことにより、ライト・オーナーでないスクラッチパッド・メモリに間違って書き込むことを防ぐことができる。
【０１４２】
また、自分がライト・オーナーであるスクラッチパッド・メモリＰ１〜Ｐ４については読み出し系関数Ｇｅｔ＿Ｂａｎｋ＿Ｐ（）およびＲｅｌｅａｓｅ＿Ｂａｎｋ＿Ｐ（）を保持しないことによって、誤読み出しを防止する（読み出しバンクの勘違いを防ぐ）ことができる。
【０１４３】
以上のように、上述した実施形態によれば、スクラッチパッド・メモリＰ１〜Ｐ４を用いてコアＣ１〜Ｃ４間でデータ伝達可能とすることで、マルチコアにおいても、非同期でコア間のデータの授受を図ることができる。スクラッチパッド・メモリＰ１〜Ｐ４の操作においては、スピンロック方式を用いる必要がなくなり、ロック待ち時間なしにデータ伝達の高速化を図ることができる。
【０１４４】
また、例示したコア数より、コア数をもっと増加させたマルチコアに関しても、スクラッチパッド・メモリを増加させるだけで対応可能であり、実行遅延の発生を防止することができる。
【０１４５】
スクラッチパッド・メモリ内のバンク数を設計する指針として、スクラッチパッド・メモリにアクセス可能なコアの個数がＮ個（そのうち１個がライト・オーナーである）であるとすると、合計Ｎ＋１個のバンクメモリを設けることができる。
【０１４６】
図１２は、実施形態に係るデータ伝達装置のスクラッチパッド・メモリのバンク数とコア数との関係を示す図である。なお、図１２は、図６の書き込みコア６０１と読み出しコア６０２−１、６０２−２、６０２−３とで、バンクメモリＢ［１］〜Ｂ［５］が最大限使用されている状態を示した。
【０１４７】
図１２において、読み出しコア６０２−１、６０２−２、６０２−３からバンクメモリＢ［３］〜Ｂ［５］に対してＧｅｔ＿Ｂａｎｋ（）関数がそれぞれ呼び出され、読み出しコア６０２−１、６０２−２、６０２−３がそれぞれ別個のバンクメモリＢ［３］〜Ｂ［５］を使用中である。この時、読み出しだけで最大で（Ｎ−１）個のバンクメモリＢ［３］〜Ｂ［５］が占有される。
【０１４８】
この状態で、書き込みコア６０１が連続して二度書きを行う場合を想定する。すなわち、読み出しコア６０２−１、６０２−２、６０２−３がそれぞれ別個のバンクメモリＢ［３］〜Ｂ［５］を使用中に、書き込みコア６０１によるバンクメモリＢ［２］への書き込みが終了したものとする。この時、レジスタ６１３には、最新のデータが書き込まれたバンクメモリＢ［２］のバンク番号＃２が登録される。
【０１４９】
ここで、コアの個数よりも、バンクメモリの個数を１個だけ多くすることにより、バンクメモリＢ［２］に最新のデータが書き込まれ、かつ読み出しコア６０２−１、６０２−２、６０２−３がバンクメモリＢ［３］〜Ｂ［５］を使用中である場合においても、バンクメモリＢ［１］をフリーバンクとして登録することがきる。
【０１５０】
このため、書き込みコア６０１は、バンクメモリＢ［２］への書き込みの終了後に、読み出しコア６０２−１、６０２−２、６０２−３からのバンクメモリＢ［３］〜Ｂ［５］の返却を待つことなく、バンクメモリＢ［１］に対してＲｅｓｅｒｖｅ＿Ｂａｎｋ（）関数を呼び出し、バンクメモリＢ［１］に書き込みを行うことができる。バンクメモリＢ［１］に書き込み中に、読み出しコア６０２−１、６０２−２、６０２−３がバンクメモリＢ［３］〜Ｂ［５］のいずれかを返却し、新たな読み出し要求をした場合は、最新のデータバンクＢ［２］を提供することができる。
【０１５１】
この時、前回と今回の書き込み用に１バンクずつ必要なため、書き込み用に２バンクが必要となる。すなわち、読み出しだけで最大で（Ｎ−１）個のバンクが必要なので、全体として合計で（Ｎ−１）＋２＝（Ｎ＋１）バンクが必要であることが分かる。
【０１５２】
書き込みコア６０１がバンクメモリＢ［１］に書き込んでいる間に、新たに読み出し要求が来た時に備えて、バンクメモリＢ［１］への書き込みが終了し、バンクメモリＢ［１］が公開される（Ｐｕｔ＿Ｂａｎｋ（）関数が呼び出される）まで、バンクメモリＢ［２］の状態を保持する。これ以降、読み出しコア６０２−１、６０２−２、６０２−３のバンクメモリＢ［３］〜Ｂ［５］の占有状態に変化がなく、新たな書き込み要求が発生した場合には、レジスタ６１３にて示されるバンクメモリと、書き込みコア６０１がＲｅｓｅｒｖ＿Ｂａｎｋ（）関数で占有するバンクメモリとを交互に切り替えて、読み出し用最新データの保持と書き込み要求の実行とを両立させることができる。
【０１５３】
以上述べたように、上述した実施形態によれば、ロック待ち時間なく、かつデータセットの同時性を破綻させることなく、コア間のデータ伝達を行うことができる。また、コア数を増加させたマルチコアにおいても、バンク数を増やすことで、２コアの時とほとんど同等な伝達時間を維持しつつ、コア間のデータ伝達を行うことができ、遅延時間増加によるマルチコアシステムの破綻を防止することができる。
【０１５４】
以上、本発明に係る実施形態について具体的に説明したが、本発明は、上述した実施形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能である。特に、ＣＰＵのコア数は、実施形態で述べたような２個および４個に限定するものではなく、Ｎ（Ｎは２以上の整数）個のマルチコアであってもよい。
【０１５５】
また、上記各構成、機能、処理部などは、それらの全部または一部を、例えば集積回路で設計することによりハードウェアとして実現することもできるし、プロセッサがそれぞれの機能を実現するプログラムを実行することによりソフトウェアとして実現することもできるし、集積回路と密接に関連したデバイス制御言語もしくはファームウェアとして実現することもできる。
【符号の説明】
【０１５６】
１００、１１０…ＣＰＵ、１０１、１１１…実行コード、１０２、１１２…ローカルＲＡＭ、１２０…共有ＲＡＭ、６０１…書き込みコア、６０２−１、６０２−２、６０２−３…読み出しコア、６１０…共有メモリ、６１１…スクラッチパッド・メモリ、６１２…カウンタ配列領域、ＵＢＣ［１］〜ＵＢＣ［５］…カウント値、６１３、６１４…レジスタ、Ｂ［１］〜Ｂ［５］…バンクメモリ
【図１】
2019065302.tif 000003
【図２】
2019065302.tif 000004
【図３】
2019065302.tif 000005
【図４】
2019065302.tif 000006
【図５】
2019065302.tif 000007
【図６】
2019065302.tif 000008
【図７】
2019065302.tif 000009
【図８】
2019065302.tif 000010
【図９】
2019065302.tif 000011
【図１０】
2019065302.tif 000012
【図１１】
2019065302.tif 000013
【図１２】
2019065302.tif 000014
【国際調査報告】
2019065302.tif 000015
2019065302.tif 000016
2019065302.tif 000017
2019065302.tif 000018