FC2カウンター FPGAの部屋 2015年07月08日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

gcc の最適化と自動ベクトル化を使用した時の性能2

(2015/07/11:タイトルが間違っていたので変更しました)

2015/07/12:修正 時間計測にバグがあったので、全面的に記事を修正しました。miyox さん、ありがとうございました)

実行環境はZYBOで、Dual Cortex-A9 650 MHz プロセッサを持ち、Ubuntu 14.04 LTS が動作している。

gcc の最適化と自動ベクトル化を使用した時の性能”の続き。

gcc の最適化とNEON 最適化ライブラリを使用した時の性能”の時は、gcc 4.6 でコンパイルしていたが、今回は gcc 4.8 にアップグレードして同様にラプラシアンフィルタの異なるソフトウェアをコンパイルして実行時間を比較してみた。
NEON_11_150708.png

使用したラプラシアンフィルタのソフトウェアの詳細については、”gcc の最適化とNEON 最適化ライブラリを使用した時の性能”を参照のこと。

最初は、 laplacian_filter1 を -O オプション無し、-O1、-O2、-O3、-Os、NEON最適化ライブラリ・オプションを付けてコンパイルし、実行してラプラシアンフィルタ処理のみの経過時間を測定した。
NEON_12_150708.png

次に、 laplacian_filter2 を -O オプション無し、-O1、-O2、-O3、-Os、NEON最適化ライブラリ・オプションを付けてコンパイルし、実行してラプラシアンフィルタ処理のみの経過時間を測定した。
NEON_13_150708.png

laplacian_filter3 を -O オプション無し、-O1、-O2、-O3、-Os、NEON最適化ライブラリ・オプションを付けてコンパイルし、実行してラプラシアンフィルタ処理のみの経過時間を測定した。
NEON_14_150708.png

laplacian_filter4 を -O オプション無し、-O1、-O2、-O3、-Os、NEON最適化ライブラリ・オプションを付けてコンパイルし、実行してラプラシアンフィルタ処理のみの経過時間を測定した。
NEON_15_150708.png

NEONを使用するように自動ベクトル化を行った場合に -O3 を付けてコンパイルしていた。これも -O3 が適当かどうかを調べるために -O オプション無し、-O1、-O2、-O3、-Os オプションを付けてラプラシアンフィルタ処理時間を測定した。(-mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math)

laplacian_filter1 の場合の結果を下に示す。
NEON_16_150708.png

laplacian_filter2 の場合の結果を下に示す。
NEON_17_150708.png

laplacian_filter3 の場合の結果を下に示す。
NEON_18_150708.png

laplacian_filter4 の場合の結果を下に示す。
NEON_19_150708.png

自動ベクトル化のオプションを付けてコンパイルした実行ファイルがNEON命令を使用しているのか?を検証した。
objdump -S -d <実行ファイル名> | grep "vmov" -c
コマンドの値が 0 だったらNEON命令を使用していない。0 以外だったらNEON命令を使用している。
NEON_37_150713.png

NEON_38_150713.png

次に、-mfloat-abi=hard オプションを付けた時の各ラプラシアンフィルタ・ソフトウェアをコンパイルした時の結果を示す。(-mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -mfloat-abi=hard -ffast-math)
NEON_20_150708.png

最後に、上のコマンドから、-ftree-vectorize オプションを取り除いた時の各ラプラシアンフィルタ・ソフトウェアをコンパイルした時の結果を示す。
NEON_21_150708.png

上の2つの場合もNEON命令を使用しているのか?を確かめたが、以前と同じだった。
NEON_39_150713.png

AXI4-Stream版 laplacian filterのCソースコードの違いと最適化オプションの違いによる処理時間の表を下に示す。gcc 4.6 と gcc 4.8 の処理時間も書いた。
NEON_22_150708.png
gcc-4.8 での最速は、、laplacian_filter3 の 自動ベクトル化、-O3 を付けた場合だった。ラプラシアンフィルタ処理時間は、約 74.4 ms だった。これは、Vivado HLSでCソースコードのみ書き換えた(1.)の 80.0 ms を上回る性能だった。

gcc 4.6 と gcc 4.8 では、細かな違いはあるが大きな性能差や傾向の差は無いようだ。
  1. 2015年07月08日 04:53 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0