3

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 で作業し、実数にまったく変換しないことは可能でしょうか (エラーはおそらくかなりのものになるでしょう)?

4

1 に答える 1