コア番号指定機能とは,マルチコア利用時に,指定したコアのローカル・メモリや全コア共通のグローバル・メモリ上にデータを配置したり,指定したコアや任意のコアで関数を実行可能にする機能です。
ここで記述する#pragma とリンク・オプションを組み合わせて実現します。
例えば,ある変数x(データ・セクションに配置されると仮定)をコア番号1のローカル・メモリに配置したい場合は次のようにします。
(a) | 変数 x がファイル中,最も最初に定義・宣言されるより前に以下の pragma を置きます: |
すると,コンパイラとアセンブラは変数xをセクション .data.pm1 に配置します。
(b) | ユーザは以下のリンク・オプションを指定します: |
-start=.data.pm1/fe8f0000
|
すると,最適化リンカはセクション.data.pm1をコア番号1のローカル・メモリ内に配置します(0xfe8f0000はコア番号1のローカル・メモリ内のアドレスと仮定します)。
変数や関数にコア番号を指定することによって以下の利点が得られます。
- | セクションにコア番号が付くことで,どの変数をどのコアのローカル・メモリに割り付けたか,どの関数をどのコアで実行するのか,といった対応付けを整理することができます。
この情報はCS+で表示することも可能です。 |
- | デフォルト・セクションを含めたすべてのセクションにコア番号が付与されるので,コア毎にセクション名を変更する必要がなくなります。 |
- | データや関数とコア番号との関係をコンパイラがチェックすることができます(コア1でのみ実行する関数からコア2でのみ実行する関数を呼んでいるとエラーを出力,など)。 |
マルチコア利用時のコア指定は次の形式で指定します。
本pragma は,-Xmulti_levelオプションを指定した時のみ有効です。-Xmulti_levelオプションを指定しない場合は,警告メッセージを出力して,コア番号指定を無視します。
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 は,その宣言行以降に出現したすべての「静的変数の宣言」,「関数宣言」,「文字列リテラル注」に作用します。 |
注 | セクションに配置されるものすべてに作用するため,const に配置される文字列リテラルにも作用します。 |
- | #pragma pmoduleは,デフォルト・セクション名,およびユーザ指定セクション名の双方に,上に示した文字列を付加します。 |
例 | .data → .data.pm1
mydata.data → mydata.data.pm1 |
- | 同一翻訳単位内に,異なる#pragma pmodule指定がある場合エラーになります。 |
指定例を示します。
以下はすべて,-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 pm2
extern int i;
#pragma pmodule pm3
int i; //.bss.pm2(警告なし)
|