(57)【特許請求の範囲】
【請求項１】
原ソースコードを、汎用演算部及び高速演算部を有するプロセッサデバイスに適応したソースコードに変換する変換手段として、コンピュータを機能させるプログラムにおいて、
前記変換手段は、前記原ソースコードを、前記高速演算部で実行すべき関数定義プログラムと、前記汎用演算部で実行すべき関数呼び出しプログラムとに変換するものであり、
前記関数定義プログラムは、当該原ソースコードに記述された演算入力数及び／又は演算出力数が、前記高速演算部の入力レジスタ数及び／又は出力レジスタ数以下である場合に、前記演算入力数の変数を持つ演算用関数、及び／又は、前記演算出力数の変数を持つ出力用関数とを定義したものであり、
前記関数呼び出しプログラムは、当該原ソースコードから、前記関数定義プログラムの前記演算用関数及び／又は前記出力用関数を呼び出すように変換されたものである
ようにコンピュータを機能させることを特徴とするソースコード変換プログラム。
【請求項２】
前記変換手段は、前記高速演算部の入力レジスタの入力データサイズ及び／又は出力レジスタの出力データサイズと、当該原ソースコードに記述された複数の演算入力データサイズ及び／又は演算出力データサイズとから、一度に入力及び／又は出力可能な変数の配列要素の個数を算出し、当該変数の配列要素の個数に応じて、前記関数定義プログラムと前記関数呼び出しプログラムとの間の前記演算用関数及び／又は前記出力用関数の変数の引き渡しを定義する
ようにコンピュータを機能させることを特徴とする請求項１に記載のソースコード変換プログラム。
【請求項３】
前記関数定義プログラム及び前記関数呼び出しプログラムは、前記プロセッサデバイスによって実行されることにより、ソフトウェア無線の無線インタフェース部として機能することを特徴とする請求項１又は２に記載のソースコード変換プログラム。
【請求項４】
原ソースコードを、汎用演算部及び高速演算部を有するプロセッサデバイスに適応したソースコードに変換するプログラム変換装置であって、
前記原ソースコードを、前記高速演算部で実行すべき関数定義プログラムと、前記汎用演算部で実行すべき関数呼び出しプログラムとに変換するものであり、
前記関数定義プログラムは、当該原ソースコードに記述された演算入力数及び／又は演算出力数が、前記高速演算部の入力レジスタ数及び／又は出力レジスタ数以下である場合に、前記演算入力数の変数を持つ演算用関数、及び／又は、前記演算出力数の変数を持つ出力用関数とを定義したものであり、
前記関数呼び出しプログラムは、当該原ソースコードから、前記関数定義プログラムの前記演算用関数及び／又は前記出力用関数を呼び出すように変換されたものである
ことを特徴とするプログラム変換装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード変換プログラム及び装置に関する。
【背景技術】
【０００２】
携帯電話、ＰＨＳ、無線ＬＡＮ等のような様々な無線通信方式は、出力レベル、周波数帯、変調方式等が異なっている。そのため、通信装置は、複数の通信方式に対応するために、通信方式毎に専用の信号処理回路（ハードウェア）を予め搭載する必要があった。しかしながら、ユーザの利用態様又は通信環境によっては、通信装置の通信方式も異なる場合が多い。ユーザが利用するであろう複数の通信方式を想定して、それらに対応するハードウェアを携帯電話機に予め搭載することは、携帯電話機の処理能力、容積及びコストの点から難しい。
【０００３】
これに対し、通信装置の無線インタフェース部のソフトウェアを書き換えることによって、異なる様々な無線通信方式に対応するソフトウェア無線（ＳＤＲ：Software Defined Radio）技術がある。この技術によれば、ソフトウェアモジュールを更新することによって通信装置の通信方式も更新することができるために、ハードウェアを予め搭載しておく必要がなく、容積及びコストの点からも有効といえる。
【０００４】
ソフトウェア無線技術によれば、通信装置は、汎用的なハードウェアを用いることができる一方で、通信方式に依存する処理の大部分をソフトウェアによって実現する。ソフトウェアモジュールは更新可能であって、新しい通信方式には、新しいソフトウェアモジュールをダウンロードして実行することによって対応でき、ハードウェアを交換する必要がない。
【０００５】
ここで、プログラムをハードウェア的に高速に実行するために、汎用演算部に加えて更に高速演算部を備えたＤＳＰ(Digital Signal Processor)プロセッサデバイスも市販されている（例えば非特許文献１参照）。
【０００６】
また、プログラムをソフトウェア的に高速に実行するために、原ソースコードを、最適なソースコードに変換する技術もある（例えば特許文献１参照）。この技術によれば、データ間の依存関係を解析し、その解析結果に基づいて最適化処理対象となる命令数を最適化因子として集計する。その最適化因子の集計結果に応じて、複数の最適化方法及びその実行順序を選択するように、原ソースコードを変換する。
【０００７】
【非特許文献１】ストレッチ株式会社、「Ｓ５５３０」、[online]、［平成１９年１２月１０日検索］、インターネット＜ＵＲＬ：http://www.stretchinc.co.jp/_files/s5530chip_J.pdf＞
【特許文献１】特開平９−３１９５８６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、ソフトウェア無線のソフトウェアモジュールを実行するプロセッサデバイスが汎用的であっても、全ての通信装置についてその特性まで統一することは難しい。現実的に、様々な種類の高速演算部を搭載したプロセッサデバイスが市販されている。一方で、プロセッサデバイスの高速演算部の特性が異なるにもかかわらず、ソフトウェア無線のソースコード自体は、全て同じである。特定の高速演算部に最適なソースコードを作成するには、人手によってソースコードを再コーディングする必要がある。また、そのような最適なソースコードを作成したとしても、他の高速演算部では利用できず、結局、汎用性を失うこととなる。
【０００９】
特許文献１に記載された技術によれば、原ソースコードの中だけで、プログラムを最適化するものであって、ハードウェアの特性を考慮して最適化するものではない。即ち、異なる高速演算部を用いたとしても、変換されるソースコードは同じものである。一方で、携帯電話機のような通信端末についてソフトウェア無線技術を普及させるためには、ベースとなる原ソースコードを、プロセッサデバイス毎の特性を活かしたプログラムに変換することが好ましい。
【００１０】
そこで、本発明は、プロセッサデバイスの高速演算部の特性に応じて、原ソースコードを高速に演算することができるソースコードに変換するソースコード変換プログラム及び装置を提供することを目的とする。
【課題を解決するための手段】
【００１１】
本発明によれば、原ソースコードを、汎用演算部及び高速演算部を有するプロセッサデバイスに適応したソースコードに変換する変換手段として、コンピュータを機能させるプログラムにおいて、
に対して、
変換手段は、原ソースコードを、高速演算部で実行すべき関数定義プログラムと、汎用演算部で実行すべき関数呼び出しプログラムとに変換するものであり、
関数定義プログラムは、当該原ソースコードに記述された演算入力数及び／又は演算出力数が、高速演算部の入力レジスタ数及び／又は出力レジスタ数以下である場合に、演算入力数の変数を持つ演算用関数、及び／又は、演算出力数の変数を持つ出力用関数とを定義したものであり、
関数呼び出しプログラムは、当該原ソースコードから、関数定義プログラムの演算用関数及び／又は出力用関数を呼び出すように変換されたものである
ようにコンピュータを機能させることを特徴とする。
【００１３】
本発明のソースコード変換プログラムにおける他の実施形態によれば、
変換手段は、高速演算部の入力レジスタの入力データサイズ及び／又は出力レジスタの出力データサイズと、当該原ソースコードに記述された複数の演算入力データサイズ及び／又は演算出力データサイズとから、一度に入力及び／又は出力可能な変数の配列要素の個数を算出し、当該変数の配列要素の個数に応じて、関数定義プログラムと関数呼び出しプログラムとの間の演算用関数及び／又は出力用関数の変数の引き渡しを定義する
ようにコンピュータを機能させることも好ましい。
【００１６】
本発明のソースコード変換プログラムにおける他の実施形態によれば、関数定義プログラム及び関数呼び出しプログラムは、プロセッサデバイスによって実行されることにより、ソフトウェア無線の無線インタフェース部として機能することも好ましい。
【００１７】
本発明によれば、原ソースコードを、汎用演算部及び高速演算部を有するプロセッサデバイスに適応したソースコードに変換するプログラム変換装置であって、
原ソースコードを、高速演算部で実行すべき関数定義プログラムと、汎用演算部で実行すべき関数呼び出しプログラムとに変換するものであり、
関数定義プログラムは、当該原ソースコードに記述された演算入力数及び／又は演算出力数が、高速演算部の入力レジスタ数及び／又は出力レジスタ数以下である場合に、演算入力数の変数を持つ演算用関数、及び／又は、演算出力数の変数を持つ出力用関数とを定義したものであり、
関数呼び出しプログラムは、当該原ソースコードから、関数定義プログラムの演算用関数及び／又は出力用関数を呼び出すように変換されたものである
ことを特徴とする。
【発明の効果】
【００１８】
本発明のソースコード変換プログラム及び装置によれば、原ソースコードを、その高速演算部の処理単位に応じて関数定義プログラムを記述したソースコードに変換するので、変換されたソースコードは、そのプロセッサデバイスで高速に演算することができる。
【発明を実施するための最良の形態】
【００１９】
以下では、図面を用いて、本発明を実施するための最良の形態について詳細に説明する。
【００２０】
図１は、ソフトウェア無線技術に基づくシステム構成図である。
【００２１】
図１によれば、通信端末１は、無線リンクで接続する基地局３を介して、ネットワーク４に接続される。また、ネットワーク４には、モジュール配信サーバ２が更に接続されている。
【００２２】
通信端末１の無線インタフェース部は、ソフトウェア無線として機能する。通信端末１は、そのソフトウェア無線のソフトウェアモジュールを、ネットワーク４を介してモジュール配信サーバ２から受信する。図１によれば、通信端末１は、通信状態情報をモジュール配信サーバ２へ送信する。これに対し、モジュール配信サーバ２は、その通信状態情報に最適となるソフトウェア無線のソフトウェアモジュールを、通信端末１へ送信する。これによって、通信端末１は、ハードウェアを変更することなく、異なる通信方式に対応することができる。
【００２３】
図１によれば、通信端末１は、ハードウェアに基づくＤＳＰチップであるプロセッサデバイス１０と、無線インタフェース部（ソフトウェア無線）部１１と、モジュール記憶部１２と、モジュール再構成部１３とを有する。
【００２４】
プロセッサデバイス１０は、汎用演算部１００と、高速演算部１０１とを有する。高速演算部１０１は、高速に演算するために、入力レジスタ数及び出力レジスタ数や、入力データサイズ及び出力データサイズが制約されている。汎用演算部１００は、高速演算部１０１に対して、その制約条件の範囲内で処理を実行させる。
【００２５】
無線インタフェース部１１は、プロセッサデバイス１０によってソフトウェアモジュールが実行されることによって機能する。モジュール記憶部１２は、モジュール配信サーバ２から受信したソフトウェアモジュールを記憶する。モジュール再構成部１３は、通信状態情報をモジュール配信サーバ２へ送信し、モジュール配信サーバ２から最適なソフトウェアモジュールを受信する。
【００２６】
図２は、本発明におけるソースコード変換の説明図である。
【００２７】
図２によれば、本発明に基づくソースコード変換プログラムをコンピュータで実行することによって、原ソースコードは、「関数定義プログラム」と、「関数呼び出しプログラム」とに変換される。関数定義プログラムに記述される各関数は、高速演算部で実行できる単位で生成される。また、関数呼び出しプログラムは、関数定義プログラムに記述される各関数を呼び出すことによって処理を実行する。
【００２８】
図３は、様々な高速演算部の説明図である。
【００２９】
プロセッサデバイスに内蔵される高速演算部は、高速に演算するが故に、様々な制約がある。図３によれば、２入力１出力や３入力２出力のタイプがある。また、入出力データサイズが１２８ビットのものから６４ビットのものまである。更に、高速演算部の内部メモリのサイズにも、２５６Ｋバイトのものから６４Ｋバイトのものまである。本発明によれば、このような高速演算部のタイプに応じて、関数定義プログラムに記述される各関数が定義される。
【００３０】
以下では、具体的に、原ソースコードから変換された「関数定義プログラム」及び「関数呼び出しプログラム」を明示しながら説明する。尚、高速演算部では、以下に示すような高速演算部固有の記述方式が存在する。
WR          ：高速演算部で利用する変数の型
WRGETINIT() ：高速演算部に渡す配列の先頭アドレスを設定する関数
WRGETI()    ：WRGETINIT()によって設定した先頭アドレスから何ビット分を、
高速演算部に渡すかを設定する関数
WRS16I()    ：高速演算部から配列を取り出す関数
【００３１】
最初に、２入力１出力の高速演算部に対する原ソースコードの例を表す。
［原ソースコード  （２入力１出力）］
start  Filtering Baseband                                       ［Ｓ１１］
alloc  int  TempI                                               ［Ｓ１２］
alloc  int  iDataI
alloc  int  iTap
for (i=0; i < (Num * CHIP_SAMP + TAP_NUM); i++) {
init  TempI = 0                                             ［Ｓ１３］
loop_init       j = 0                                       ［Ｓ１４］
loop_condition  j < 48
loop_renew      j += 1
calc_input  iDataI = FIDMADataI[DMAOffset + i - (2*TAP_NUM-1)+j]
calc_input  iTap = RxFilterFCHBBFTap[j]                 ［Ｓ１５］
calc_calc   TempI += iDataI * iTap
loop_end
output  DataI[i] = TempI >> 14
}
end
【００３２】
前述した原ソースコードは、標準のＣ言語で記述した上で、以下の表記を用いて拡張したものである。原ソースコードのこれら表記を逐次判定しながら変換する。
start          ：プログラム生成処理の開始
alloc          ：演算に利用する変数
init           ：変数の初期化
loop_init      ：ループの初期値
loop_condition ：ループの終了条件
loop_renew     ：繰り返し時に実行される処理
loop_end       ：ループの終了
calc_input     ：演算に利用する入力
calc_calc      ：演算処理
output         ：演算の出力
end            ：プログラム生成処理の終了
また、前述した原ソースコードによれば、「calc_input」表記が２個で、「output」表記が１個なので、２入力１出力であることが理解できる。
【００３３】
前述した２入力１出力の原ソースコードを変換した場合の関数定義プログラムである。
［関数定義プログラム  （２入力１出力）］
static  se_sint<32>  TempI;                                     ［Ｓ１２］
static  se_sint<32>  iDataI;
static  se_sint<32>  iTap;
SE_FUNC void Filtering_Baseband_init() {                        ［Ｓ１３］
TempI = 0;
}
SE_FUNC void Filtering_Baseband_calc (WR A, WR B) {             ［Ｓ１６］
int i;
for (i=0; i<4; i++) {
iDataI = A(32*i+32, 32*i);                              ［Ｓ１７］
iTap = B(32*i+32, 32*i);
Temp I += iData * iTap;
}
}
SE_FUNC void Filtering_Baseband_output (WR *A){                 ［Ｓ１８］
*A = TempI >> 14;
}
【００３４】
前述した２入力１出力の原ソースコードを変換した場合の関数呼び出しプログラムである。
［関数呼び出しプログラム  （２入力１出力）］
WR A, B;                                                        ［Ｓ１１］
for (i=0; i< (Num * CHIP_SAMP + TAP_NUM); i++) {
Filtering_Baseband_init();                                  ［Ｓ１３］
for (j=0; j<48; j+=4) {                                     ［Ｓ１４］
WRGETOINIT(WRGET_INIT_INCREMENT,
&FIDMADataI[DMAOffset + i - (2*TAP_NUM-1) + j]);
WRGETOI(&A, 32);                                        ［Ｓ１５］
WRGETO1INIT(WRGET_INIT_INCREMENT, &RxFilterFCHBBFTap[j]);
WRGETO1I(&B, 32);
Filtering_Baseband_calc(A, B);                          ［Ｓ１６］
}
Filtering_Baseband_output(&A);                              ［Ｓ１８］
WRS16I(A, &DataI[i],0);
}
【００３５】
以下では、前述した関数定義プログラム及び関数呼び出し定義プログラムが、どのように導出されたかについて説明する。
【００３６】
最初に、高速演算部の特性について規定する。非特許文献１に記載されたプロセッサデバイス（ＤＳＰ(Digital Signal Processor)チップ）によれば、汎用演算部と高速演算部とを有する。高速演算部は、以下のような制約がある。本発明によれば、これら制約の中で、原ソースコードを、最適に高速演算部を利用することができるソースコードに変換する。
（１）最大入力数（入力レジスタの数）＝３個
最大出力数（出力レジスタの数）＝２個
（２）入力レジスタのデータサイズ＝最大１２８ビット
出力レジスタのデータサイズ＝最大１２８ビット
【００３７】
［Ｓ１１］原ソースコードに「start」表記があった場合、「end」表記までの間で、「calc_input」表記を検索する。そして、「calc_input」表記に記述されている変数のデータサイズを抽出する。前述の原ソースコードによれば、「iDataI」「iTap」「TempI」の変数が検出されており、各変数のデータサイズは、「alloc」表記の記述から、以下のように抽出できる。
「iDataI」：int 32bit
「iTap」  ：int 32bit
「TempI」 ：int 32bit
【００３８】
次に、高速演算部の入力レジスタのデータサイズと、「calc_input」表記の中の全ての変数の中で最大のデータサイズ（３２ビット）とから、一度に入力可能な入力変数の配列要素の個数（以下「パッキング数」という）を算出する。前述の例によれば、入出力レジスタのデータサイズは、１２８ビットであり、パッキング数は、以下のように算出される。
１２８ビット（データサイズ）／３２ビット（int）＝４個
【００３９】
［Ｓ１２］次に、関数定義プログラムに、「alloc」表記の数だけの静的変数を確保する。これら変数は、関数定義プログラム内で用いられるものであり、高速演算部の内部メモリが用いられる。
【００４０】
［Ｓ１３］原ソースコードに「init」表記があった場合、関数定義プログラムに「初期化関数」(Filtering_Baseband_init())を定義する。また、関数呼び出しプログラムからその関数を呼び出すように記述する。
【００４１】
［Ｓ１４］原ソースコードに「loop_init」「loop_condition」「loop_renew」表記があった場合、関数呼び出しプログラムにfor文を記述する。前述したように、高速演算部に対して３２ビットの変数を、一度に４個入力することができる。その場合、４８回繰り返す演算は、４８回／４個＝１２回の演算に削減されることとなる。従って、「loop_renew」表記に基づく増分値を、パッキング数（４）に置き換える。
【００４２】
［Ｓ１５］次に、関数呼び出しプログラムにおけるそのfor文の中で、高速演算部に渡す配列の先頭アドレスの設定（WRGETINIT()）を記述し、先頭アドレスから何バイト渡すかの定義（WRGETI()）を記述する。
【００４３】
［Ｓ１６］原ソースコードに「calc_input」表記があった場合、「calc_input」表記の個数を検索する。「calc_input」の個数が、高速演算部の入力数（入力レジスタの数）の最大値よりも多い場合、ソースコード変換の対象外とする。例えば、高速演算部の入力数の最大値が３であって、「calc_input」表記の個数が４である場合、ソースコード変換の対象外とする。
【００４４】
一方、例えば、高速演算部の入力数の最大値が３であって、「calc_input」表記の個数が２であるとする。この場合、関数定義プログラムに、「calc_input」の数に相当する変数を持ったcalc関数を定義する（Filtering_Baseband_calc(WR A, WR B)）。calc関数では、一度に高速演算部に渡す配列の要素の数だけループするようにfor文を記述する。また、関数呼び出しプログラムに、「calc_input」表記の数だけの入力変数を持ったcalc関数の呼び出しを記述する。
【００４５】
［Ｓ１７］原ソースコードの「calc_calc」表記の演算内容を、関数定義プログラムのcalc関数のfor文の中にコピーする。
【００４６】
［Ｓ１８］原ソースコードに「output」表記があった場合、「output」表記の個数を検索する。「output」表記の個数が、高速演算部の出力数（出力レジスタの数）の最大値よりも多い場合、ソースコード変換の対象外とする。例えば、高速演算部の出力数の最大値が２であって、「output」表記の個数が３である場合、ソースコード変換の対象外とする。
【００４７】
一方、例えば、高速演算部の出力数の最大値が２であって、「output」表記の個数が１であるとする。この場合、関数定義プログラムに、関数定義プログラムに「output」表記の数だけの変数を持ったoutput関数（Filtering_Baseband_output(WR *A)）を定義する。そして、原ソースコードの「output」表記の処理内容を、関数定義プログラムのその関数内にコピーする。関数呼び出しプログラムには、「output」表記の数だけの変数を持ったoutput関数の呼び出しを記述し、最終的な出力を受け渡すように記述する(WRS16I())。
【００４８】
次に、３入力２出力の高速演算部に対する原ソースコードの例を表す。前述した２入力１出力のソースコードと比較することによって、入出力数に応じたプログラムの差異を明示する。
［原ソースコード  （３入力２出力）］
start  Filtering Baseband                                       ［Ｓ２１］
alloc  int  TempI                                               ［Ｓ２２］
alloc  int  TempQ
alloc  short  iDataI
alloc  short  iDataQ
alloc  short  iTap
for (i=0; i < (Num * CHIP_SAMP + TAP_NUM); i++) {
init  TempI = 0                                             ［Ｓ２３］
init  TempQ = 0
loop_init       j = 0                                       ［Ｓ２４］
loop_condition  j < 48
loop_renew      j += 1
calc_input  iDataI = FIDMADataI[DMAOffset + i - (2*TAP_NUM-1)+j]
calc_input  iTap = RxFilterFCHBBFTap[j]                 ［Ｓ２５］
calc_input  iDataQ = FIDMADataQ[DMAOffset + i - (2*TAP_NUM-1)+j]
calc_calc   TempI += iDataI * iTap
calc_calc   TempQ += iDataQ * iTap
loop_end
output  DataI[i] = TempI >> 14
output  DataQ[i] = TempQ >> 14
}
end
【００４９】
前述した原ソースコードによれば、「calc_input」表記が３個で、「output」表記が２個なので、３入力２出力であることが理解できる。
【００５０】
前述した３入力２出力の原ソースコードを変換した場合の関数定義プログラムである。
［関数定義プログラム  （３入力２出力）］
static  se_sint<32>  TempI;                                     ［Ｓ２２］
static  se_sint<32>  TempQ;
static  se_sint<16>  iDataI;
static  se_sint<16>  iDataQ;
static  se_sint<16>  iTap;
SE_FUNC void Filtering_Baseband_init() {                        ［Ｓ２３］
TempI = 0;
TempQ = 0;
}
SE_FUNC void Filtering_Baseband_calc (WR A, WR B, WR C) {       ［Ｓ２６］
int i;
for (i=0; i < 8; i++) {
iDataI = A(16*i+15, 16*i);
iTap   = B(16*i+15, 16*i);
iDataQ = C(16*i+15, 16*i);
TempI += iDataI * iTap;                                 ［Ｓ２７］
TempQ += iDataQ * iTap;
}
}
SE_FUNC void Filtering_Baseband_output (WR *A, WR *B){          ［Ｓ２８］
*A = TempI >> 14;
*B = TempQ >> 14;
}
【００５１】
前述した３入力２出力の原ソースコードを変換した場合の関数呼び出しプログラムである。
［関数呼び出しプログラム  （３入力２出力）］
WR A, B, C;                                                     ［Ｓ２１］
for (i=0; i< (Num * CHIP_SAMP + TAP_NUM); i++) {
Filtering_Baseband_init();                                  ［Ｓ２３］
for (j=0; j<48; j+=8) {                                     ［Ｓ２４］
WRGETOINIT(WRGET_INIT_INCREMENT,                        ［Ｓ２５］
&FIDMADataI[DMAOffset + i - (2*TAP_NUM-1) + j]);
WRGETOI(&A, 16);
WRGET2INIT(WRGET_INIT_INCREMENT, &RxFilterFCHBBFTap[j]);
WRGET2I(&B, 16);
WRGETO1INIT(WRGET_INIT_INCREMENT, 
&FIDMADataQ[DMAOffset + i - (2*TAP_NUM-1) + j]);
WRGETO1I(&C, 16);
Filtering_Baseband_calc(A, B, C);                       ［Ｓ２７］
}
Filtering_Baseband_output(&A, &B);                          ［Ｓ２８］
WRS16I(A, &DataI[i],0);
WRS16I(B, &DataQ[i],0);
}
【００５２】
［Ｓ２１］原ソースコードに「start」表記があった場合、「calc_input」表記に記述されている変数のデータサイズを抽出する。前述の原ソースコードによれば、「iDataI」「iDataQ」「iTap」の変数が検出されており、各変数のデータサイズは、「alloc」表記の記述から、以下のように抽出できる。
「iDataI」「iDataQ」：short 16bit
「iTap」            ：short 16bit 
【００５３】
次に、高速演算部の入力レジスタのデータサイズと、「calc_input」表記の中の全ての変数の中で最大のデータサイズ（１６ビット）とから、一度に入力可能な入力変数の配列要素のパッキング数を算出する。前述の例によれば、入出力レジスタのデータサイズは、１２８ビットであり、パッキング数は、以下のように算出される。
１２８ビット（データサイズ）／１６ビット（int）＝８個
【００５４】
［Ｓ２２］次に、関数定義プログラムに、「alloc」表記の数だけの静的変数を確保する。これら変数は、関数定義プログラム内で用いられるものであり、高速演算部の内部メモリが用いられる。
【００５５】
［Ｓ２３］原ソースコードに「init」表記があった場合、関数定義プログラムに「初期化関数」(Filtering_Baseband_init())を定義する。また、関数呼び出しプログラムからその関数を呼び出すように記述する。
【００５６】
［Ｓ２４］原ソースコードに「loop_init」「loop_condition」「loop_renew」表記があった場合、関数呼び出しプログラムにfor文を記述する。前述したように、高速演算部に対して１６ビットの変数を、一度に８個入力することができる。その場合、４８回繰り返す演算は、４８回／８個＝６回の演算に削減されることとなる。従って、「loop_renew」表記に基づく増分値を、パッキング数（８）に置き換える。
【００５７】
［Ｓ２５］次に、関数呼び出しプログラムにおけるそのfor文の中で、高速演算部に渡す配列の先頭アドレスの設定（WRGETINIT()）を記述し、先頭アドレスから何バイト渡すかの定義（WRGETI()）を記述する。
【００５８】
［Ｓ２６］原ソースコードに「calc_input」表記があった場合、「calc_input」表記の個数を検索する。「calc_input」の個数が、高速演算部の入力数（入力レジスタの数）の最大値（３）が、「calc_input」表記の個数（３）と等しいので、この場合、関数定義プログラムに、「calc_input」の数に相当する変数を持ったcalc関数を定義する（Filtering_Baseband_calc(WR A, WR B, WR C)）。calc関数では、一度に高速演算部に渡す配列の要素の数だけループするようにfor文を記述する。また、関数呼び出しプログラムに、「calc_input」表記の数だけの入力変数を持ったcalc関数の呼び出しを記述する。
【００５９】
［Ｓ１７］原ソースコードの「calc_calc」表記の演算内容を、関数定義プログラムのcalc関数のfor文の中にコピーする。
【００６０】
［Ｓ２８］原ソースコードに「output」表記があった場合、「output」表記の個数を検索する。「output」表記の個数（２）が、高速演算部の出力数（出力レジスタの数）の最大値（２）と等しい。この場合、関数定義プログラムに、関数定義プログラムに「output」表記の数だけの変数を持ったoutput関数（Filtering_Baseband_output(WR *A, WR *B)）を定義する。そして、原ソースコードの「output」表記の処理内容を、関数定義プログラムのその関数内にコピーする。関数呼び出しプログラムには、「output」表記の数だけの変数を持ったoutput関数の呼び出しを記述し、最終的な出力を受け渡すように記述する(WRS16I())。
【００６１】
以上、詳細に説明したように、本発明のソースコード変換プログラム及び装置によれば、原ソースコードを、その高速演算部の処理単位に応じて関数定義プログラムを記述したソースコードに変換するので、変換されたソースコードは、そのプロセッサデバイスで高速に演算することができる。
【００６２】
特に、本発明によれば、高速演算部の入出力数及び／又は入出力データサイズに応じて、一度に配列要素を複数個まとめて入力し、まとめた形式のまま処理を実行させることができる。これにより、ある配列の要素を１個ずつ演算する場合と比較して大幅な処理速度の改善が見込まれる。但し、高速演算部は、高速に演算するが故、入出力数及び／又は入出力データサイズに制約がある。本発明によれば、この制約を考慮した上で、最適なソースコードに変換することにより、プロセッサデバイスとしての演算速度を高めることができる。
【００６３】
前述した本発明の種々の実施形態において、本発明の技術思想及び見地の範囲の種々の変更、修正及び省略は、当業者によれば容易に行うことができる。前述の説明はあくまで例であって、何ら制約しようとするものではない。本発明は、特許請求の範囲及びその均等物として限定するものにのみ制約される。
【図面の簡単な説明】
【００６４】
【図１】ソフトウェア無線技術に基づくシステム構成図である。
【図２】本発明におけるソースコード変換の説明図である。
【図３】様々な高速演算部の説明図である。
【符号の説明】
【００６５】
１  通信端末
１０  プロセッサデバイス
１００  汎用演算部
１０１  高速演算部
１１  無線インタフェース部（ソフトウェア無線）
１２  モジュール記憶部
１３  モジュール再構成部
２  モジュール配信サーバ
３  基地局
４  ネットワーク
【図１】
0005143542.tif 000002
【図２】
0005143542.tif 000003
【図３】
0005143542.tif 000004