二値化処理 30倍速
カラーRGB単色抽出変換 7倍速
マルチCPU 3コア並列演算処理



 画像処理・処理速度の比較



記載項目
・二値化画像処理速度比較
・カラーRGB単色抽出処理速度比較

アセンブラ言語とC言語で画像処理プログラムの処理速度を計測しました。


カメラで生画を取得
カメラで生画を取得
二値画を200回実行し、平均処理時間を計測
平均処理時間を計測              
 
SIMD命令(Single Instruction Multiple Data)
インテルMMXテクノロジ対応 Pentium プロセッサ・ファミリ以降、 4つの拡張命令(MMX、SSE、SSE2、SSE3)が、IA-32アーキ テクチャに導入され、SIMD演算を実行できるようになりました。

MMX命令
MMX命令は、整数の64ビット長のパックドバイト整数、パックドワード整数、 パックドダブルワード整数、クワッドワード整数の値を演算できます。
画像処理のモノクロ画像など8ビットの整数演算が8個並列に処理できます。

SSE命令
SIMD命令は、パックド倍精度浮動小数点点数に加えて、128ビット長のパックドバイト整数、 パックドワード整数、パックドダブルワード整数、クワッドワード整数、ダブルクワッドワード整 数の値を演算できます。
このように、SIMD命令では8ビットの演算が16個並列に処理できます。

インテルAVX(Advanced Vector eXtentions)
256ビットのレジスタをもつSIMD拡張命令です。 単精度浮動小数点が8個、倍精度浮動小数点演算が4個並列に演算できます。
8ビットの整数演算が32個並列に処理できます。

マルチCPU 4コア並列演算処理(Advanced Vector eXtentions)
Corei7には物理的並列演算可能な4個のコアが存在します。それぞれのコア別に処理内容を指定し、分担させる事で 更に処理速度を高速化可能です。

アセンブラ  0.15ms
アセンブラ処理時間
C言語    1.72ms
C言語処理時間
Pentium(R)4 @3.00Ghz 32Bit Memory2GB WindowsXp (MMX 8バイト並列 200回平均)
処理内容 処理時間 比率
C言語二値化処理 1.25mS 1.0倍
アセンブラ二値化処理 0.16mS 7.8倍
 
 

二値化画像処理速度比較


改めて速度比較を行いました。
32bitのカラーグレー画像RGBからGをプレーンとして8bitに変換し、閾値を128として二値化処理を行いました。 各変換プログラムは比較のため、dllにて作成しています。

C言語 :二値化処理をリリースモードでコンパイルしました。
SSE :SIMD命令にて8バイト同時に並列演算処理を実行しています。
マルチCPU並列処理 :画像の領域を分割して3個のCPUに処理を分担、SIMD命令にて並列演算を実行しています。
32bit :転送、二値化ともにAVX命令を使用して32バイト同時に並列演算を実行しています。
64bit :転送、二値化ともにAVX命令を使用して32バイト同時に並列演算を実行しています。
 
並列演算処理
 一命令で8バイト同時に処理した場合。 SIMD命令
マルチCPU並列処理
マルチCPU並列処理
640*480画像
モノクロ画像640
1280*800画像
モノクロ画像1280
640*480画像二値化処理結果
二値化処理結果
二値化処理 Corei7-870 @2.93Ghz 32Bit Memory4GB Windows7 (SSE 8バイト並列 100回平均)
C言語
640*480画素
C言語
1280*800画素
SSEアセンブラ
640*480画素
SSEアセンブラ
1280*800画素
3CPU SSEアセンブラ
640*480画素
3CPU SSEアセンブラ
1280*800画素
430μs
432
429
429
428
1417μs
1416
1417
1415
1416
51μs
49
49
49
49
146μs
145
145
145
145
26μs
27
25
26
27
69μs
79
74
79
69


430/51=8.4倍

430/27=15.9倍

 
二値化処理 Corei7-4790 @3.6Ghz 32Bit Memory8GB Windows10 (AVX 32バイト並列 100回平均)
C言語
640*480画素
C言語
1280*800画素
AVXアセンブラ
640*480画素
AVXアセンブラ
1280*800画素
3CPU AVXアセンブラ
640*480画素
3CPU AVXアセンブラ
1280*800画素
352μs
350
351
351
351
1150μs
1151
1151
1154
1154
21μs
23
21
21
21
66μs
59
59
58
62
7μs
6
6
6
6
21μs
22
21
26
21


351/23=15.2倍

351/7==50.1倍

 
二値化処理 Corei7-4790 @3.6Ghz 64Bit Memory8GB Windows10 (AVX 32バイト並列 100回平均)
C言語
640*480画素
C言語
1280*800画素
AVXアセンブラ
640*480画素
AVXアセンブラ
1280*800画素
3CPU AVXアセンブラ
640*480画素
3CPU AVXアセンブラ
1280*800画素
192μs
192
192
192
192
624μs
630
625
624
623
21μs
23
21
21
21
66μs
59
59
58
62
7μs
6
6
6
6
21μs
22
21
26
21


192/23=8.3倍

192/7==27.4倍

32bitと64bitでは、AVX使用時の処理速度で若干のバラツキはありますが、近い値を示しました。誤差範囲内なので同じ値を記載しました。
64bitではインラインアセンブラが使用できないのでアセンブラにてプログラムしました。32bit,64bit共にAVXを使用した プログラムの処理内容が同じなので、処理速度の差は発生しませんでした。

カラーRGB単色抽出処理速度比較


32bitのカラー画像RGBからGをプレーンとして8bitに変換する処理を実行しました。
各画素はメモリ上でR1,G1,B1,A1,R2,G2,B2,A2,R3,G3,B3,A3.....のように並んでいますが、Greenの画素のみを抽出し G1,G2,G3......のように並べ直す処理を行うことになります。 各変換プログラムは実行速度比較のため呼び出し側のプログラムの影響を受けないようdllにて作成しています。
 
カラーRGB単色抽出処理
カラーRGB単色抽出処理
640*480画像
カラーバー画像640
1280*800画像
カラーバー画像1280
640*480画像32To8G抽出結果
G抽出像処理結果
カラー画像RGBがらGを抽出しました。
32To8BitGreen抽出 Corei7-870 @2.93Ghz 32Bit Memory4GB Windows7 (SSE 8バイト並列 100回平均)
C言語
640*480画素
C言語
1280*800画素
SSEアセンブラ
640*480画素
SSEアセンブラ
1280*800画素
3CPU SSEアセンブラ
640*480画素
3CPU SSEアセンブラ
1280*800画素
340μs
340
343
340
341
1107μs
1103
1103
1105
1102
127μs
126
126
126
127
389μs
386
384
383
384
46μs
61
51
62
48
132μs
164
160
162
169


340/127=2.7倍

340/62==5.5倍

 
32To8BitGreen抽出 Corei7-4790 @3.6Ghz 32Bit Memory8GB Windows10 (AVX 32バイト並列 100回平均)
C言語
640*480画素
C言語
1280*800画素
AVXアセンブラ
640*480画素
AVXアセンブラ
1280*800画素
3CPU AVXアセンブラ
640*480画素
3CPU AVXアセンブラ
1280*800画素
218μs
215
215
223
226
793μs
793
747
760
786
57μs
62
85
78
80
182μs
179
180
181
179
30μs
25
25
25
25
85μs
76
72
84
70


215/85=2.5倍

215/30==7.1倍

 
32To8BitGreen抽出 Corei7-4790 @3.6Ghz 64Bit Memory8GB Windows10 (AVX 32バイト並列 100回平均)
C言語
640*480画素
C言語
1280*800画素
AVXアセンブラ
640*480画素
AVXアセンブラ
1280*800画素
3CPU AVXアセンブラ
640*480画素
3CPU AVXアセンブラ
1280*800画素
218μs
216
219
214
219
756μs
741
764
770
757
57μs
62
85
78
80
182μs
179
180
181
179
30μs
25
25
25
25
85μs
76
72
84
70


214/85=2.5倍

214/30==7.1倍

 
32bitと64bitでは、AVX使用時の処理速度で若干のバラツキはありますが、近い値を示しました。誤差範囲内なので同じ値を記載しました。
64bitではインラインアセンブラが使用できないのでアセンブラにてプログラムしました。32bit,64bit共にAVXを使用した プログラムの処理内容が同じなので、処理速度の差は発生しませんでした。

 

Top項目へのアクセス