2013 年電子情報通信学会基礎・ 境界ソ サイ エ テ ィ 大会

A-3-7

再リンク可能なハードウェアを合成する高位合成系の実装
Implementation of High-Level Synthesis System that Generates Relinkable Hardware
竹林陽 1
Hinata Takebayashi

石浦菜岐佐 1
Nagisa Ishiura

冨山宏之 2
Hiroyuki Tomiyama

神原弘之 3
Hiroyuki Kanbara

関西学院大学 理工学部 1 School of Science and Technology, Kwansei Gakuin University
立命館大学 理工学部 2 College of Science and Engineering, Ritsumeikan University
京都高度技術研究所 3 Advanced Scientific Technology & Management Research Institute of KYOTO

はじめにソフトウェア (以下 SW) の一部を高位合成でハードウェア (以下 HW) 化し, SW と結合して実行する場合,SW に変更があると HW の再合成が必要になることがある. この問題を解決するため, 再リンク可能な HW の合成手法が提案されている [1]. 本稿では, この手法に基づき SW と再リンク可能な HW を合成する高位合成系を実装した.

成系で行う. (a) から (c) への変換は単純な書き換えである. (b) から (d)(e) への変換では, (b) のコンパイル結
果 (オブジェクトコード) からグローバル変数を抽出し,(1)(2) のアドレス表の処理部を生成する. (e) 中の関数
f1 におけるグローバル変数 (g) へのアクセスは, アドレ
ス表から読み出したポインタ ( g sub) を用いたものに変換する必要がある. この処理は図 2 のように高位合成系中でデータフローグラフの変換により行う. g sub のロードは, 関数 f1 の中で 1 回だけ行うようにする.

1

再リンク可能なハードウェアの合成与えられたプログラム (a)(b) のうち, (b) を HW 化し,CPU で実行する (a) から呼び出すものとする. (b) は複数の関数を含んでもよく, その場合には関数併合 [2] により 1 つの HW に変換する. (a) を変更したり, (b) を別のSW と結合して実行する場合に, グローバル変数のアドレスが変化すると, HW を再合成する必要が生じる. これを解決するため, [1] ではグローバル変数のアドレス表を SW から HW に渡す手法を提案している. 図 (b) から
SW とのインタフェース関数を含む (d) と, HW に合成される (e) が生成される. 図中 (1) の部分でアドレス表を渡し, (2) でこれを受け取る. (a) は初期化関数 INI subを呼び出すよう (c) に変換される. (c) と (d) がリンクされ CPU 上で実行される.

2(a) main.c (SW)int g;
int f1(int);
int main(void){...
int r = f1(a1);...
return 0;}(b) sub.c (HW)
extern int g;
int f1(int a){...
r = g *2;
return r;}

int g;
int f1(int);}

START:
while(!_RUN_sub){;}if(_RUN_sub == (int*)1){
int a = *_arg*f1_a;*_ret_f1 = f1(a);}_RUN_sub = (int*)0;
goto START;

ld_g

図2

ld

グローバル変数のアクセスの変換

実験結果
高位合成システム ACAP [3] に提案手法を実装し, ISE14.3 によるシミュレーションと論理合成を行った. HW化したプログラムは 2 つの 1 次元配列 (サイズ 5) の内積を計算する関数である. 結果を表 1 に示す. アドレス表の作成と受け取りのために, 本手法では SW と HW 初期化のサイクル数が増加している. また, アドレス表からグローバル変数のアドレスをロードするために HW 本体のサイクル数も増加している. しかし, 本手法の HWを再合成することなく他の SW と結合して実行できることが確認できた.
表 1 実験結果

4SW

int _main(void){...
int r = f1(a1);...
return 0;}

サイクル数
HW HW Total FFs LUTs 遅延
初期化 本体[ns]
再リンク無 56
196 252 424 3270 16.941
再リンク有 9418
211 323 513 3826 17.406

SW

int main(void){_INI_sub();_main();
return 0;}(d) sub_sw.c
void* volatile _RUN_sub = 0
int _ARG_f1_a = 0;
int _RET_f1 = 0;
SW
extern int g;

むすび
本稿では SW と再リンク可能な HW の高位合成を実装した. 詳細なテストと性能評価が今後の課題である.

5(1)void _INI_sub(void){
void* volatile addr_table[] ={&g;&_ARG_f1_a;&_RET_f1;};_RUN_sub = (void*)addr_table;
while(_RUN_sub){;}}

参考文献[1] 織野, 石浦, 冨山, 高島, 神原: “ソフトウェアと再リンク可
能なハードウエアの高位合成,” 信学技報, VLD2011-107,(Jan. 2012).

int f1(int a){_ARG_f1_a = a;
_RUN_sub = (int*)1;
while(_RUN_sub){;}return _RET_f1;}

int f1(int a){...
r = g *2;
return r;}_g_subld(c) main’.c(e) sub_hw.c
void* volatile _RUN_sub = 0;
static void* _g_sub;
extern int g;
HWvoid HW_stub(void){(2)
while(!_RUN_sub){;}_g_sub= *((void**)_RUN_sub);int* _arg_f1_a= *((void**)_RUN_sub+1);
int* _ret_f1= *((void**)_RUN_sub+2);_RUN_sub = (void*);g[2] 高島, 石浦, 織野, 冨山, 神原: “アセンブリコードを中間表現とする高位合成における関数の併合,” 信学技報, VLD2010106, (Jan. 2012).
[3] 池上, 石浦: “MIPS アセンブリを中間表現とする高位合成,” 情処関西支部大会, A-03 (Oct. 2008).

図 1 再リンク可能ハードウェア合成のための変換
コード変換の実装
本稿では, 図 1 の変換処理を実装する. 変換の大部分はソースレベルで実現するが, 一部の変換処理は高位合350
2013/9/17 〜 20

福岡市

（ 基礎・ 境界講演論文集）

Copyright © 2013 IEICE