SSE/AVX (組み込み関数またはアセンブリのいずれか) を使用してLanczos 画像リサンプリング(アップスケーリングおよびダウンスケーリング) アルゴリズムを実装する方法に関するヒントはありますか?
いくつかの C 実装を調べましたが、多くの分岐があり、SSE/AVX を使用してスマートに実装する方法がよくわかりません。
例 - 正規化された枢機卿の罪:
// C implementation
if (!x)
return sin(x*M_PI)/(x*M_PI);
else
return 1;
// AVX implementation
PXOR ymm0, ymm0
MOVAPD ymm1, [x] // x - array of double
CMPPD ymm0, ymm1, 0 // if (!x)
// what now?
MOVAPD ymm3, [pi] // pi - array of double = M_PI - is there better way?
PMULPD ymm1, ymm3 // ymm1 = x*pi
(SINPD ymm2, ymm1) // found intrinsic _mm256_sin_pd - Intel math library, intrinsic functions are OK with me
DIVPD ymm2, ymm1 // result in ymm2
値 x == 0 に対して 1 を返すにはどうすればよいですか? そのインデックスでは、CMPPD の後に 11...11 (true) があります。
また、グレースケールの 8 ビット画像に対してこれを行っているため、1 ピクセルは (0..255) のみです。double の代わりに float を使用すると、品質にどのような影響がありますか? また、ずっと u_int8 で作業し、実数にまったく変換しないことは可能でしょうか (エラーはおそらくかなりのものになるでしょう)?