FC2カウンター FPGAの部屋 OpenMPでのラプラシアンフィルタの実行速度3

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

FPGAの部屋

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

OpenMPでのラプラシアンフィルタの実行速度3

OpenMPでのラプラシアンフィルタの実行速度2”の続き。

前回は、laplacian_fiter1 と laplacian_fiter2 のOpenMP を使うようにコンパイルして、実行した結果をブログに書いた。今回は、laplacian_fiter3 と laplacian_fiter4 をやってみた。

laplacian_fiter3.c を下に示すように、Cソースコードを修正した。
OpenMP_20_150717.png

2つ目の for ループの前に、

#ifdef _OPENMP
#pragma omp parallel for private(lap_fil_val, a, b, cam_fb_addr, lap_fb_addr)
#endif

を置いた。

このCソースコードを以下のコマンドで、コンパイル、実行、NEON命令の有無を調査した。

gcc -fopenmp laplacian_filter3.c -o laplacian_filter3_mp
gcc -fopenmp -O1 laplacian_filter3.c -o laplacian_filter3_mpO1
gcc -fopenmp -O2 laplacian_filter3.c -o laplacian_filter3_mpO2
gcc -fopenmp -O3 laplacian_filter3.c -o laplacian_filter3_mpO3
gcc -fopenmp -Os laplacian_filter3.c -o laplacian_filter3_mpOs
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math laplacian_filter3.c -o laplacian_filter3_mpn
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O1 laplacian_filter3.c -o laplacian_filter3_mpn1
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O2 laplacian_filter3.c -o laplacian_filter3_mpn2
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O3 laplacian_filter3.c -o laplacian_filter3_mpn3
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -Os laplacian_filter3.c -o laplacian_filter3_mpns
./laplacian_filter3_mp
./laplacian_filter3_mpO1
./laplacian_filter3_mpO2
./laplacian_filter3_mpO3
./laplacian_filter3_mpOs
./laplacian_filter3_mpn
./laplacian_filter3_mpn1
./laplacian_filter3_mpn2
./laplacian_filter3_mpn3
./laplacian_filter3_mpns
objdump -S -d laplacian_filter3_mp | grep "vmov" -c
objdump -S -d laplacian_filter3_mpO1 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpO2 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpO3 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpOs | grep "vmov" -c
objdump -S -d laplacian_filter3_mpn | grep "vmov" -c
objdump -S -d laplacian_filter3_mpn1 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpn2 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpn3 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpns | grep "vmov" -c

を実行した。
結果を示す。
OpenMP_12_150717.png

laplacian_fiter2.c の時と同様に、ラプラシアンフィルタの画像的には、左側はそれなりだが、右側が強調されている気がする。
OpenMP_17_150717.jpg


laplacian_fiter4.c を下に示すように、Cソースコードを修正した。
OpenMP_21_150717.png

filter_line() 関数の for () 文の前に、

#ifdef _OPENMP
#pragma omp parallel for private(lap_fil_val, current, next, prev)
#endif

を置いた。

このCソースコードを以下のコマンドで、コンパイル、実行、NEON命令の有無を調査した。

gcc -fopenmp laplacian_filter4.c -o laplacian_filter4_mp
gcc -fopenmp -O1 laplacian_filter4.c -o laplacian_filter4_mpO1
gcc -fopenmp -O2 laplacian_filter4.c -o laplacian_filter4_mpO2
gcc -fopenmp -O3 laplacian_filter4.c -o laplacian_filter4_mpO3
gcc -fopenmp -Os laplacian_filter4.c -o laplacian_filter4_mpOs
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math laplacian_filter4.c -o laplacian_filter4_mpn
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O1 laplacian_filter4.c -o laplacian_filter4_mpn1
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O2 laplacian_filter4.c -o laplacian_filter4_mpn2
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O3 laplacian_filter4.c -o laplacian_filter4_mpn3
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -Os laplacian_filter4.c -o laplacian_filter4_mpns
./laplacian_filter4_mp
./laplacian_filter4_mpO1
./laplacian_filter4_mpO2
./laplacian_filter4_mpO3
./laplacian_filter4_mpOs
./laplacian_filter4_mpn
./laplacian_filter4_mpn1
./laplacian_filter4_mpn2
./laplacian_filter4_mpn3
./laplacian_filter4_mpns
objdump -S -d laplacian_filter4_mp | grep "vmov" -c
objdump -S -d laplacian_filter4_mpO1 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpO2 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpO3 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpOs | grep "vmov" -c
objdump -S -d laplacian_filter4_mpn | grep "vmov" -c
objdump -S -d laplacian_filter4_mpn1 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpn2 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpn3 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpns | grep "vmov" -c

を実行した。
結果を示す。
OpenMP_13_150717.png

ラプラシアンフィルタ処理後の画像は、真ん中に縦に線が入ってしまった。それ以外は普通だ。
OpenMP_18_150717.jpg

OpenMP を使用したラプラシアンフィルタのみの各最適化オプションでの実行時間を表にまとめたので、下に示す。使用したコンパイラは gcc-4.8 だ。
OpenMP_22_150717.png

OpenMP を使用しない gcc の各最適化オプションのラプラシアンフィルタのみの処理時間の表を下に示す。
NEON_48_150714.png

上の2つの表を比較してみると、-O無しの場合は OpenMP が明らかに速いが、それ以外の場合はあまり速くなっていないことが分かる。
  1. 2015年07月18日 04:31 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3202-398c617f
この記事にトラックバックする(FC2ブログユーザー)