SSE用いたアルファブレンドの高速化4 アライメントがずれている画像同士のアルファブレンド
Posted on Sat 03 December 2011 in ペイントツール
↓の続き
今回はアライメントをずらした場合での計測をします。
_mm_loadu_si128などアライメントをあわせる必要がないロード・ストア命令を使用する場合は、
前回と同じ様に何も考えずに読み込んでアルファブレンドを行い、書きこむという順で処理を行うことができます。
しかし、アライメントを合わせる必要があるロード・ストア命令を使用する場合は、
処理方法をアライメントのズレによって変える必要があります。
今回のアルファブレンド処理では、
- 入出力メモリともアライメントが揃っている場合
- 入出力メモリともアライメントから同じだけずれている場合
- 入力、出力メモリのアライメントのずれ量が違う場合
の3通りに分けてコードを実装しました。
1の場合は、前回と同様のコードで処理します。
2の場合は、ずれてる分を処理して入出力ともアライメントを合わせた状態にして、1と同じように処理します。
3の場合は、ずれてる分をシフト演算を使用してずれを合わせる処理をいれて、
ロード・ストア命令がアライメントが合った状態で実行されるようにします。
計測方法
32bit,64bit向けに2通りに実行ファイルを作成、それぞれについて
- SSEを使わない処理
- _mm_loadu_si128でメモリ読み込み、_mm_storeu_si128でメモリ書き込み
- _mm_load_si128でメモリ読み込み、_mm_store_si128でメモリ書き込み
- _mm_load_si128でメモリ読み込み、_mm_stream_si128でメモリ書き込み
の4通りの処理の処理速度を計測する。
前回までは間違えて浮動小数点用の_mm_loadu_ps等を使っていたので、今回は_mm_loadu_si128等を使います。
- チャンネルサイズ8bit 5700x5700BGR画像を2枚読み込み、アルファ値を指定してアルファブレンドを行う。
- 画像の保存、読み込みは …
Continue reading