4.2.4.10 コア番号指定(マルチコア用)

コア番号指定機能とは,マルチコア利用時に,指定したコアのローカル・メモリや全コア共通のグローバル・メモリ上にデータを配置したり,指定したコアや任意のコアで関数を実行可能にする機能です。

ここで記述する#pragma とリンク・オプションを組み合わせて実現します。

 

例えば,ある変数x(データ・セクションに配置されると仮定)をコア番号1のローカル・メモリに配置したい場合は次のようにします。

(a)

変数 x がファイル中,最も最初に定義・宣言されるより前に以下の pragma を置きます:

#pragma pmodule pm1

すると,コンパイラとアセンブラは変数xをセクション .data.pm1 に配置します。

(b)

ユーザは以下のリンク・オプションを指定します:

-start=.data.pm1/fe8f0000

すると,最適化リンカはセクション.data.pm1をコア番号1のローカル・メモリ内に配置します(0xfe8f0000はコア番号1のローカル・メモリ内のアドレスと仮定します)。

 

変数や関数にコア番号を指定することによって以下の利点が得られます。

-

セクションにコア番号が付くことで,どの変数をどのコアのローカル・メモリに割り付けたか,どの関数をどのコアで実行するのか,といった対応付けを整理することができます。
この情報はCS+で表示することも可能です。

-

デフォルト・セクションを含めたすべてのセクションにコア番号が付与されるので,コア毎にセクション名を変更する必要がなくなります。

(1)

コア番号指定の形式

マルチコア利用時のコア指定は次の形式で指定します。

#pragma pmodule pm指定

本pragma は,-Xmulti_level=1オプションを指定した時のみ有効です。-Xmulti_level=1オプションを指定しない場合は,警告メッセージを出力して,コア番号指定を無視します。

 

pm指定に書くことが可能な書式とその時の配置セクション名は次の表のとおりです。

pm指定にはpm1〜pm255,またはcmn のみ書くことが可能です。pm指定された変数および関数の配置セクション名の末尾には「.」とpm 指定した文字列が付加されます。

-Xmulti_levelの値

pm 指定の値

意味

配置先セクション名

1

#pragma pmoduleの指定なし

デフォルト(cmn)を設定

***.cmn

cmn

-

データの場合

全コア共通のグローバル共有メモリに配置

-

関数の場合

どのコアで実行してもよい

***.cmn

pm1

コア1 用のデータ,または関数

***.pm1

pm255

コア255 用のデータ,または関数

***.pm255

0

警告メッセージを出力して,コア番号指定を無視

***

(セクション末尾に文字列を付加しない。)

-

cmn,pm1〜pm255 以外のpm 指定記述を行った場合は,コンパイル・エラーとなります。

-

#pragma pmodule は,その宣言行以降に出現したすべての「静的変数の宣言」,「関数宣言」,「文字列リテラル」に作用します。

構造体,共用体,配列型自動変数の初期値データには作用しません。

-

#pragma pmoduleは,デフォルト・セクション名,およびユーザ指定セクション名の双方に,上に示した文字列を付加します。

.data → .data.pm1
mydata.data → mydata.data.pm1

-

同一翻訳単位内に,cmn以外の異なる#pragma pmodule指定された変数や関数が混在する場合はエラーになります。

-

pm指定された変数,関数間の参照可能な組み合わせは次の通りです。

 

参照先オブジェクト

pmN指定関数

cmn指定関数

pmN指定関数

cmn指定関数

参照元オブジェクト

pmN指定関数

呼び出し可能

呼び出し可能

参照可能

参照可能

cmn指定関数

呼び出し不可能

呼び出し可能

R0相対参照のみ可能

参照可能

-

cmn指定変数は,r0相対セクションに配置する必要があります。そのため,#pragma section指令と組み合わせて使う場合は次の属性指定文字のみ指定可能です。

r0_disp16,r0_disp23,r0_disp32,const,zconst,zconst23,default

cmn指定関数には配置先セクションの制約はありません。

pmN指定変数,pmN指定関数には配置先セクションの制約はありません。

 

指定例を示します。

以下はすべて,-Xmulti_level=1オプションを指定した時の#pragma 指定例です。

例 1.

#pragma section r0_disp16
int     i;                      //.zbss.cmn
--------------------------------------------------------------------------------
#pragma pmodule pm2
int     i;                      //.bss.pm2
int     j = 5;                  //.data.pm2
const int       k = 10;         //.const.pm2
void func(void)                 //.text.pm2
{
        func2("abcde");         //"abcde"は.const.pm2
}
--------------------------------------------------------------------------------
#pragma pmodule pm2
#pragma section r0_disp16
int     i;                      //.zbss.pm2
--------------------------------------------------------------------------------
#pragma section r0_disp16
#pragma pmodule pm2
int     i;                      //.zbss.pm2

例 2.

extern  int     i;
#pragma pmodule pm2
int     i;                      //.bss.pm2(警告なし)
 

例 3.

#pragma pmodule pm2
extern  int     i;
int     i;                      //.bss.pm2(警告なし)

例 4.

#pragma pmodule cmn
extern  int     i;
#pragma pmodule pm2
int     i;                      //.bss.cmn(警告なし)