SSE

SIMDで並列演算をする時に、SSE2の128bit整数命令で、128ビットレジスタの4つの32bit符号無し整数同士の足し算があるのに掛け算が無い、という事で悩んだ。128bitの掛け算の結果が256bitになるとかそういう事は措いて、目的の処理を行えるインストラクションが無い時にどうしていいかわからなくなってしまった。しばらくレファレンスを漁りながら思いついた方法としては、SSEの32bitのfloat4つの方でなら掛け算を一気に4要素に対して行えるので、もし計算にフルに32bit精度を求めないのであれば、floatでどんどん計算していって最後にメモリにしまう前に整数に変えれば良いのでは無いかなと…。

prefixに_mm_が付いているintrinsicで組んでいるんだけれど、_mm_cvtpu8_psとかは命令を組み合わせて作られたもので、しかもinline化されないでcallされてしまったりで、通常版のプログラムよりなんだか速度が遅くなってしまう。

並列演算を行うなら、一度に1ピクセルじゃなくて2,4ピクセルずつ処理したりとか、メモリ転送意識したりとか、色々とやら無いとコンパイラの最適化に勝てなそうだ…。