自動車制御ソフトウェアではリアルタイム性の確保が必要であるため,データ キャッシュメモリを使わずにローカルデータメモリを使うことが一般的である.一 方で,このローカルデータメモリを有効利用するにはユーザーによる明示的な割 り当てが必要である.このローカルデータメモリへの割り当てが自動でできるよ うに,アクセス頻度に基づく配置を行う.はじめに自動車制御向けのマルチコア
1 count = 1;
2 for (...) {
3 ...
4
5 if (count % 2 == 0) {
6 ...
7 }
8
9 if (count % 4 == 0) {
10 ...
11 }
12
13 if (count % 8 == 0) {
14 ...
15 }
16
17 ...
18 count++;
19 }
図3.17: 等確率ではない分岐構造
プロセッサについて述べる.次に,ローカルメモリを有効利用するための構造体 変数の分解方法について述べる.その後,ローカルメモリ有効利用手法について 述べる.
3.7.1 自動車制御ソフトウェア向けマルチコアプロセッサ
近年の自動車エンジン制御では処理の複雑化に伴い,プロセッサの性能向上す なわちプロセッサの高速化が必要となっている.高速化が必要な一方で,消費電
力や熱の影響で車載用プロセッサの動作周波数は300MHz程度が限界で,現時点 でプロセッサの動作周波数の向上の限界が来ていると言われている[MGW15].
そのため,携帯電話や家電やパーソナルコンピュータにおいてマルチコアプロ セッサが使われてきたように,自動車制御分野でもマルチコアプロセッサへの移行 が期待されている.また,マルチコアプロセッサへの移行がECU(Electronic Control
Units)の数の削減やECU間の通信の削減の面においても有効であると述べられて
いる[GASS12].
[MGW15]によると,2015年から2016年にはミッドレンジとハイエンドの車載
アプリケーションにマルチコアプロセッサを使ったECUの開発が始まると言われ ている.また,2020年前後に使用が想定される車載用マルチコアプロセッサは2 コアから3コア程度で,2.5MB-8MBの命令用フラッシュメモリと命令用もしくは データ用の192MB-576MBのRAMがローカルRAMや共有RAMに分配されると 言われている[MGW15].また,少なくとも1コアは故障検出を検知できるように ロックステップコアを持つようである[MGW15].例えば,Infinion製のAU RIXT M ファミリのTriCoreT M [Tec, PLS08]のマルチコアプロセッサが挙げられる.この マルチコアプロセッサでは共有メモリと各コアに小容量高速アクセス可能なロー カルメモリを持つ構成となっている.このようなローカルメモリを持つマルチコ アプロセッサ上で最大限の性能を得るためには,明示的なローカルメモリの割り 当てを要する.
3.7.2 ローカルメモリ活用のための構造体の分解
Embedded Coderのようなコード生成ツールから生成されたコードのデータは基
本的に構造体扱いになる.例として,図3.18に示すサブシステムが4並列の簡単 なモデルを挙げる.
を使った自動生成コードを図 に示す.このコードでは入力
図3.18: 自動生成コードの変数が構造体管理されるモデル
端子に該当する変数がMode U構造体,出力端子に該当する変数がModel Y構造 体,ブロック結線に該当する変数がModel B構造体,ブロック内のパラメータに 外とする変数がModel P構造体となっている.異なった入力端子,出力端子,ブ ロック結線,ブロックパラメータであっても,同一の構造体にまとまっている.そ のため,構造体の単位でのローカルメモリ配置しかできず,そのままではローカ ルメモリを有効活用できない.そこで,OSCAR自動並列化コンパイラでローカル メモリ割り当てができるように,下記のMATLAB/Simulinkのオプションで構造体 を分解する.
1 /* Block signals (auto storage) */
2 B_Model_T Model_B;
3 /* External inputs (root inport signals with auto storage) */
4 ExtU_Model_T Model_U;
5 /* External outputs (root outports fed by signals with auto storage) */
6 ExtY_Model_T Model_Y;
7 /* Block parameters (auto storage) */
8 extern P_Model_T Model_P;
9
10 /* Model step function */
11 void Model_step(void)
12 {
13 Model_Subsystem();
14 Model_Subsystem1();
15 Model_Y.Out1 = Model_B.DLookupTable_kz - Model_B.DLookupTable_k;
16
17 Model_Subsystem2();
18 Model_Subsystem3();
19 Model_Y.Out2 = Model_B.DLookupTable_d - Model_B.DLookupTable;
20 }
図3.19: 変数が構造体管理される自動生成コード
・各信号線のパッケージをmpt,ストレージクラスをGlobal(Custom)にする.
・サブシステムを別々のデータを持つ関数にする.
これにより図3.20に示すように,各信号線は固有の変数になり,サブシステム内 のパラメータは固有の構造体になる.例えば,図3.19の15行目,19行目の計算 では同一構造体内アクセスであるのに対して,図3.20の18行目,22行目では固 有の変数アクセスになっていることがわかる.このように,あらかじめ構造体を 固有の変数に設定した後に,後述するローカルメモリへの割り当てを行う.
1 real_T A;
2 real_T B;
3 real_T C;
4 real_T D;
5 real_T In1;
6 real_T In2;
7 real_T Out1;
8 real_T Out2;
9 extern P_Subsystem_Model_T Model_Subsystem_P;
10 extern P_Subsystem1_Model_T Model_Subsystem1_P;
11 extern P_Subsystem2_Model_T Model_Subsystem2_P;
12 extern P_Subsystem3_Model_T Model_Subsystem3_P;
13 /* Model step function */
14 void Model_step(void)
15 {
16 Model_Subsystem();
17 Model_Subsystem1();
18 Out1 = A - B;
19
20 Model_Subsystem2();
21 Model_Subsystem3();
22 Out2 = C - D;
23 }
図3.20: 設定により各変数が固有になった自動生成コード
3.7.3 非共有変数のローカルメモリへの割り当て
自動車分野のようなリアルタイム制御向けのマルチコアプロセッサ上でローカ ルメモリを有効利用するためのローカルメモリ割り当てを提案する.
step 1 スタティックタスクスケジューリング結果から各プロセッサコアから実行さ
れるMTを集計する
step 2 各プロセッサコアのMT内でdefまたはuseされる回数を変数毎にカウント
する
step 3 複数プロセッサコアでアクセスされない変数をアクセス回数が多い順でロー
カルデータメモリに収まるだけ配置する
上記のようにスタティックスケジューリング後のアクセス頻度に基づくメモリ割 り当てを行うことで,自動でローカルメモリを有効利用することができる.