大堀/研究/データ/PROGRAPE-画像ぼかし用回路
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[大堀/研究/データ]]
//研究室限定
#contents
*画像ぼかし用回路 [#s10788d8]
**目的と問題 [#x4047b5f]
PROGRAPEを使ったぼかし処理は、現在REAL-time処理を行える性能ではない。理由は、
FPGAボードとのI/O部分がクリティカルパスとなっているからである。I/O部分ではなく、
回路自体を変更することで、Real-time処理を行える性能を得ることを目的とする。方法
として、多量のデータを1ブロックとして考え、1ブロック毎に回路で処理を行うこと
を考える。
フィルタ値を変更すれば、ぼかし以外の処理をさせることも可能。
例えば、鮮明化、2値化など。
**試したこと [#v091064f]
-解像度640x480の画像を処理させることを目標に1ブロックを64x48サイズのデータとした。
-回路内部でぼかし処理行った。
***回路モデル [#b3f3e588]
#ref(rgb.png)
-記号説明
--Ri, Gi, Bi : 元画像データ
--Rj, Gj, Bj : 処理後画像データ
--xi, yi:元画像の座標データ
--xj, yj:処理後の座標データ
--xk : ぼかし処理用フィルタ
--1 : 1
--0 : 0
--c1: 入力値二つを比較する部分。
--c2: 入力値が0より大きいか、0以下か比較する部分。
--acc:アキュムレータ
**前提 [#f622ec3b]
***どのように高速化するのか [#w0d92d1a]
- 今までは、回路に1個のデータを送り、回路で処理されたデータを受信した後、新しいデータを回路に送るという方式をとっていた。
- 今回、64x48個のデータを一つのブロックとして考え、回路に1ブロックのデータ送り、回路で処理されたデータを受信したあと、新しいブロックを回路に送るという方式で、高速化を計ることにした。
***ぼかし用回路をつくってどうしたいか [#wb38fcf8]
- 前段階として、今までのぼかし用回路は、effectvを実行するときに使われていた。
- 今回は、そのぼかし用回路との比較をとり、どれだけ高速に処理できているのか、またeffectvでReal-time処理するのは可能かということを考えたい。
- さらに、1ブロック毎に処理するという方式を他の処理にも活用したい。ぼかし用回路は、その第一段階として実装する。
***用途 [#dda094dd]
- effectvのReal-time処理
- 他のPROGRAPEようアプリケーションの高速化
**回路作成の手順 [#uf5562b3]
*** 実装環境 [#be07fb89]
|OS|SuSE Linux 9.3 (x86-64)|
|FPGA board|PROGRAPE-4|
|Language| C, PGDL|
*** 回路実装 [#sca5aeb3]
|使用言語|PGDL|
[[参照:大堀/研究/データ/PROGRAPE-画像ぼかし用回路#b3f3e588]]
*** 実行例 [#t6edbe84]
pgrv rgb_list
cd ISE_PROJECT
make
config_fpga top.bit
cd ../
make vhd
./run.vhd < inputfilename > outputfilename
***実行例の説明 [#w57cf637]
-pgrv
--PGDL記述から、VHDLによる回路記述などを自動生成する。
-ISE_PROJECT:VHDLによる回路記述などがあるディレクトリ
-ISE_PROJECT内でのmake:top.bitというFPGAボートに書き込める形式の回路データを生成
-make vhd:実行ファイルrun.vhdを生成する。
-./run.vhd < inputfilename > outputfilename
--./run.vhd:run.vhdを実行
--inputfilename:PPM形式の画像ファイル
--outputfilename:PPM形式で出力されたデータを書き込むファイル
**結果 [#s7d452e6]
***速度からみた回路評価 [#hedaecda]
- 計測値は、平均。
-- PIPE 1
0.04183361000 sec / 1 block
1 block = 64 x 48
640x480画像の場合、100 blockあるので、処理には、
4.18336100 sec / 100 block
100 block = 640 x 480
かかることになる。
-- PIPE 8
0.00698893 sec / 1 block
1 block = 64 x 48
640x480画像の場合、100 blockあるので、処理には、
0.698893 sec / 100 block
100 block = 640 x 480
かかることになる。
|>|H/W type|speed|accuracy|
|PC |AMD Opteron(tm) Processor 250 |約 0.036 sec|double in C|
|PROGRAPE|design on effectv with PIPE 1|約 3.36 sec|NFLO 26, NMAN 16, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 1|約 4.183361 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 2|約 2.125677 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 3|約 1.551763 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 4|約 1.090836 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 5|約 0.978850 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 6|約 0.801878 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 7|約 0.771883 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 8|約 0.698893 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 9|約 0.546916 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 10|zxp020:abort, zxp007:success 約 0.548915 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 16|zxp020:abort, zxp007:success 約 0.425933 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 20|zxp020:abort, zxp007:success 約 0.368944 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 23|zxp020:abort, zxp007:success 約 0.313951 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 24|zxp020:abort, zxp007:error|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 32|zxp020:abort, zxp007:error|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 1|約 4.21336 sec|NFLO 18, NMAN 8, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 8|約 0.815877 sec|NFLO 18, NMAN 8, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 16|abort|NFLO 18, NMAN 8, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 1|約 4.25835 sec|NFLO 16, NMAN 6, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 8| |NFLO 16, NMAN 6, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 16| |NFLO 16, NMAN 6, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 32| |NFLO 16, NMAN 6, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 1| 誤値 |NFLO 14, NMAN 4, NFIX 49, NACC 57|
- PIPE 24で resource 限界. [#k751c303]
Selected Device : 3s5000fg900-5
Number of Slices: 36436 out of 33280 109% (*)
Number of Slice Flip Flops: 25827 out of 66560 38%
Number of 4 input LUTs: 64466 out of 66560 96%
Number used as logic: 61380
Number used as Shift registers: 3086
Number of bonded IOBs: 76 out of 633 12%
IOB Flip Flops: 180
Number of BRAMs: 64 out of 104 61%
Number of MULT18X18s: 72 out of 104 69%
Number of GCLKs: 2 out of 8 25%
Number of DCM_ADVs: 1 out of 4 25%
WARNING:Xst:1336 - (*) More than 100% of Device resources are used
***データ量からみた回路評価 [#gec21ecc]
未評価。10/21
**考察 [#z04f1741]
***速度について [#e94b85a4]
--パイプラインの段数が低かったためだった。
%%- 前述の回路よりも遅くなってしまった原因は、いくつか考えられる。%%
%%--(1)処理後の画素値一つを出すのに9x9の計算でいいところを、1ブロックの画素値全てに対して処理している所。%%
%%---普通の処理 : out = in[0]*fil[0] + in[1]*fil[1] + ・・・ + in[8]*fil[8];%%
%%---今回の処理 : out = in[0]*fil[0] + in[1]*fil[1] + ・・・ + in[3071]*fil[3071];%%
%%---今回は、1画素を求めるのに9画素のみを使用する処理だったが、1画素(または1粒子)をもとめるのに、すべての画素(または粒子)のデータを使用しなければならない時、この考え方は有効だと思われる(未検証)。今後、検証していきたい。%%
%%--(2)回路に座標データも送っている所。%%
%%---前回の回路は、純粋にRGBデータとフィルタ値のみを送り結果を受け取っていた。%%
%%---今回は、どの画素データを計算に使うかという座標計算の部分も回路を使って求めている。%%
%%---転送速度の問題があるならば、画素データを送る部分で遅くなっていると思われる(未検証)%%
***思いつき [#m6aea15c]
- フィルタ値xkを流す部分を、変更できる気がする。
-- エッジ用関数を作成する場合に有効→その他何個かの処理を重ね合わせることも可能?
-- floatの計算ではないので、計算量も減る…と思う。
終了行:
[[大堀/研究/データ]]
//研究室限定
#contents
*画像ぼかし用回路 [#s10788d8]
**目的と問題 [#x4047b5f]
PROGRAPEを使ったぼかし処理は、現在REAL-time処理を行える性能ではない。理由は、
FPGAボードとのI/O部分がクリティカルパスとなっているからである。I/O部分ではなく、
回路自体を変更することで、Real-time処理を行える性能を得ることを目的とする。方法
として、多量のデータを1ブロックとして考え、1ブロック毎に回路で処理を行うこと
を考える。
フィルタ値を変更すれば、ぼかし以外の処理をさせることも可能。
例えば、鮮明化、2値化など。
**試したこと [#v091064f]
-解像度640x480の画像を処理させることを目標に1ブロックを64x48サイズのデータとした。
-回路内部でぼかし処理行った。
***回路モデル [#b3f3e588]
#ref(rgb.png)
-記号説明
--Ri, Gi, Bi : 元画像データ
--Rj, Gj, Bj : 処理後画像データ
--xi, yi:元画像の座標データ
--xj, yj:処理後の座標データ
--xk : ぼかし処理用フィルタ
--1 : 1
--0 : 0
--c1: 入力値二つを比較する部分。
--c2: 入力値が0より大きいか、0以下か比較する部分。
--acc:アキュムレータ
**前提 [#f622ec3b]
***どのように高速化するのか [#w0d92d1a]
- 今までは、回路に1個のデータを送り、回路で処理されたデータを受信した後、新しいデータを回路に送るという方式をとっていた。
- 今回、64x48個のデータを一つのブロックとして考え、回路に1ブロックのデータ送り、回路で処理されたデータを受信したあと、新しいブロックを回路に送るという方式で、高速化を計ることにした。
***ぼかし用回路をつくってどうしたいか [#wb38fcf8]
- 前段階として、今までのぼかし用回路は、effectvを実行するときに使われていた。
- 今回は、そのぼかし用回路との比較をとり、どれだけ高速に処理できているのか、またeffectvでReal-time処理するのは可能かということを考えたい。
- さらに、1ブロック毎に処理するという方式を他の処理にも活用したい。ぼかし用回路は、その第一段階として実装する。
***用途 [#dda094dd]
- effectvのReal-time処理
- 他のPROGRAPEようアプリケーションの高速化
**回路作成の手順 [#uf5562b3]
*** 実装環境 [#be07fb89]
|OS|SuSE Linux 9.3 (x86-64)|
|FPGA board|PROGRAPE-4|
|Language| C, PGDL|
*** 回路実装 [#sca5aeb3]
|使用言語|PGDL|
[[参照:大堀/研究/データ/PROGRAPE-画像ぼかし用回路#b3f3e588]]
*** 実行例 [#t6edbe84]
pgrv rgb_list
cd ISE_PROJECT
make
config_fpga top.bit
cd ../
make vhd
./run.vhd < inputfilename > outputfilename
***実行例の説明 [#w57cf637]
-pgrv
--PGDL記述から、VHDLによる回路記述などを自動生成する。
-ISE_PROJECT:VHDLによる回路記述などがあるディレクトリ
-ISE_PROJECT内でのmake:top.bitというFPGAボートに書き込める形式の回路データを生成
-make vhd:実行ファイルrun.vhdを生成する。
-./run.vhd < inputfilename > outputfilename
--./run.vhd:run.vhdを実行
--inputfilename:PPM形式の画像ファイル
--outputfilename:PPM形式で出力されたデータを書き込むファイル
**結果 [#s7d452e6]
***速度からみた回路評価 [#hedaecda]
- 計測値は、平均。
-- PIPE 1
0.04183361000 sec / 1 block
1 block = 64 x 48
640x480画像の場合、100 blockあるので、処理には、
4.18336100 sec / 100 block
100 block = 640 x 480
かかることになる。
-- PIPE 8
0.00698893 sec / 1 block
1 block = 64 x 48
640x480画像の場合、100 blockあるので、処理には、
0.698893 sec / 100 block
100 block = 640 x 480
かかることになる。
|>|H/W type|speed|accuracy|
|PC |AMD Opteron(tm) Processor 250 |約 0.036 sec|double in C|
|PROGRAPE|design on effectv with PIPE 1|約 3.36 sec|NFLO 26, NMAN 16, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 1|約 4.183361 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 2|約 2.125677 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 3|約 1.551763 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 4|約 1.090836 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 5|約 0.978850 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 6|約 0.801878 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 7|約 0.771883 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 8|約 0.698893 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 9|約 0.546916 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 10|zxp020:abort, zxp007:success 約 0.548915 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 16|zxp020:abort, zxp007:success 約 0.425933 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 20|zxp020:abort, zxp007:success 約 0.368944 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 23|zxp020:abort, zxp007:success 約 0.313951 sec|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 24|zxp020:abort, zxp007:error|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 32|zxp020:abort, zxp007:error|NFLO 18, NMAN 8, NFIX 57, NACC 64|
|PROGRAPE|design with PIPE 1|約 4.21336 sec|NFLO 18, NMAN 8, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 8|約 0.815877 sec|NFLO 18, NMAN 8, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 16|abort|NFLO 18, NMAN 8, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 1|約 4.25835 sec|NFLO 16, NMAN 6, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 8| |NFLO 16, NMAN 6, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 16| |NFLO 16, NMAN 6, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 32| |NFLO 16, NMAN 6, NFIX 49, NACC 57|
|PROGRAPE|design with PIPE 1| 誤値 |NFLO 14, NMAN 4, NFIX 49, NACC 57|
- PIPE 24で resource 限界. [#k751c303]
Selected Device : 3s5000fg900-5
Number of Slices: 36436 out of 33280 109% (*)
Number of Slice Flip Flops: 25827 out of 66560 38%
Number of 4 input LUTs: 64466 out of 66560 96%
Number used as logic: 61380
Number used as Shift registers: 3086
Number of bonded IOBs: 76 out of 633 12%
IOB Flip Flops: 180
Number of BRAMs: 64 out of 104 61%
Number of MULT18X18s: 72 out of 104 69%
Number of GCLKs: 2 out of 8 25%
Number of DCM_ADVs: 1 out of 4 25%
WARNING:Xst:1336 - (*) More than 100% of Device resources are used
***データ量からみた回路評価 [#gec21ecc]
未評価。10/21
**考察 [#z04f1741]
***速度について [#e94b85a4]
--パイプラインの段数が低かったためだった。
%%- 前述の回路よりも遅くなってしまった原因は、いくつか考えられる。%%
%%--(1)処理後の画素値一つを出すのに9x9の計算でいいところを、1ブロックの画素値全てに対して処理している所。%%
%%---普通の処理 : out = in[0]*fil[0] + in[1]*fil[1] + ・・・ + in[8]*fil[8];%%
%%---今回の処理 : out = in[0]*fil[0] + in[1]*fil[1] + ・・・ + in[3071]*fil[3071];%%
%%---今回は、1画素を求めるのに9画素のみを使用する処理だったが、1画素(または1粒子)をもとめるのに、すべての画素(または粒子)のデータを使用しなければならない時、この考え方は有効だと思われる(未検証)。今後、検証していきたい。%%
%%--(2)回路に座標データも送っている所。%%
%%---前回の回路は、純粋にRGBデータとフィルタ値のみを送り結果を受け取っていた。%%
%%---今回は、どの画素データを計算に使うかという座標計算の部分も回路を使って求めている。%%
%%---転送速度の問題があるならば、画素データを送る部分で遅くなっていると思われる(未検証)%%
***思いつき [#m6aea15c]
- フィルタ値xkを流す部分を、変更できる気がする。
-- エッジ用関数を作成する場合に有効→その他何個かの処理を重ね合わせることも可能?
-- floatの計算ではないので、計算量も減る…と思う。
ページ名: