コア番号指定機能とは,マルチコア利用時に,指定したコアのローカル・メモリや全コア共通のグローバル・メモリ上にデータを配置したり,指定したコアや任意のコアで関数を実行可能にする機能です。
ここで記述する#pragma とリンク・オプションを組み合わせて実現します。
例えば,ある変数x(データ・セクションに配置されると仮定)をコア番号1のローカル・メモリに配置したい場合は次のようにします。
(a) | 変数 x がファイル中,最も最初に定義・宣言されるより前に以下の pragma を置きます: |
すると,コンパイラとアセンブラは変数xをセクション .data.pm1 に配置します。
(b) | ユーザは以下のリンク・オプションを指定します: |
-start=.data.pm1/fe8f0000
|
すると,最適化リンカはセクション.data.pm1をコア番号1のローカル・メモリ内に配置します(0xfe8f0000はコア番号1のローカル・メモリ内のアドレスと仮定します)。
変数や関数にコア番号を指定することによって以下の利点が得られます。
- | セクションにコア番号が付くことで,どの変数をどのコアのローカル・メモリに割り付けたか,どの関数をどのコアで実行するのか,といった対応付けを整理することができます。
この情報はCS+で表示することも可能です。 |
- | デフォルト・セクションを含めたすべてのセクションにコア番号が付与されるので,コア毎にセクション名を変更する必要がなくなります。 |
マルチコア利用時のコア指定は次の形式で指定します。
本pragma は,-Xmulti_level=1オプションを指定した時のみ有効です。-Xmulti_level=1オプションを指定しない場合は,警告メッセージを出力して,コア番号指定を無視します。
pm指定に書くことが可能な書式とその時の配置セクション名は次の表のとおりです。
pm指定にはpm1〜pm255,またはcmn のみ書くことが可能です。pm指定された変数および関数の配置セクション名の末尾には「.」と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指定関数
|
呼び出し不可能
|
呼び出し可能
|
R0相対参照のみ可能
|
参照可能
|
- | cmn指定変数は,r0相対セクションに配置する必要があります。そのため,#pragma section指令と組み合わせて使う場合は次の属性指定文字のみ指定可能です。 |
r0_disp16,r0_disp23,r0_disp32,const,zconst,zconst23,default
cmn指定関数には配置先セクションの制約はありません。
pmN指定変数,pmN指定関数には配置先セクションの制約はありません。
- | -pic,-pirod,-pidのいずれかのオプションを指定している場合,cmn指定の変数や関数を定義するとエラーとなります。 |
指定例を示します。
以下はすべて,-Xmulti_level=1オプションを指定した時の#pragma 指定例です。
#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
|
extern int i;
#pragma pmodule pm2
int i; //.bss.pm2(警告なし)
|
#pragma pmodule pm2
extern int i;
int i; //.bss.pm2(警告なし)
|
#pragma pmodule cmn
extern int i;
#pragma pmodule pm2
int i; //.bss.cmn(警告なし)
|