クロスプラットフォーム C 用に、ウェブカメラ画像に対してさまざまなことを行うためのライブラリをプログラミングしています。すべての操作はピクセル単位で高度に並列化可能です。たとえば、ビット マスクの適用、色値と定数の乗算などです。したがって、SSE/SSE2 組み込み関数を使用することでパフォーマンスを向上できると思います。
ただし、データ形式に問題があります。私の Web カメラ ライブラリは、ABGR または BGR 形式の 24 ビットまたは 32 ビットのバイト ピクセルを含むバッファーへのポインター (void*) として Web カメラ フレームを提供します。ptr++ などが正しく動作するように、これらを char* にキャストしています。ただし、すべての SSE/SSE2 操作では、__m128 または __m64 データ型で 4 つの整数または 4 つの浮動小数点数が必要です。これを行うと (バッファから文字 r、g、および b に色の値を読み取ったと仮定して):
float pixel[] = {(float)r, (float)g, {float)b, 0.0f};
次に、定数でいっぱいの別の float 配列をロードします
float 定数[] = {0.299, 0.587, 0.114, 0.0f};
両方の float ポインターを __m128 にキャストし、__mm_mul_ps 組み込み関数を使用して r * 0.299、g * 0.587 などを実行します。すべてのシャッフルに時間がかかるため、全体的なパフォーマンスは向上しません。
これらのバイトピクセル値をSSEレジスタにすばやく効率的にロードして、実際にそれらを操作することでパフォーマンスを向上させる方法について誰か提案がありますか?