符号なしcharイメージの高速ガウスブラー - ARM Neon Intrinsics - iOS Dev

誰かが5x5マスクを使って画像のガウスぼやけを見つける高速な関数を教えてもらえますか?私はiOSアプリの開発者のためにそれが必要です。私は、次のように定義された画像の記憶に直接取り組んでいます。

unsigned char *image_sqr_Baseaaddr = (unsigned char *) malloc(noOfPixels);

for (row = 2; row < H-2; row++) 
{
    for (col = 2; col < W-2; col++) 
    {
        newPixel = 0;
        for (rowOffset=-2; rowOffset<=2; rowOffset++)
        {
            for (colOffset=-2; colOffset<=2; colOffset++) 
            {
                rowTotal = row + rowOffset;
                colTotal = col + colOffset;
                iOffset = (unsigned long)(rowTotal*W + colTotal);
                newPixel += (*(imgData + iOffset)) * gaussianMask[2 + rowOffset][2 + colOffset];
            }
        }
        i = (unsigned long)(row*W + col);
        *(imgData + i) = newPixel/159;
    }
}

これは明らかに可能な最も遅い機能です。 iOS上のARMネオンの組み込み関数を使用して、1サイクルで複数の演算を行うことができると聞きました。多分それは行く方法ですか?

問題は、あまりよく知られておらず、現時点でアセンブリ言語を学ぶのに十分な時間がないということです。したがって、上記の問題や他の高速実装でC/C ++でNeonの組み込みコードを投稿できる人がいれば、素晴らしいことになります。

1

2 答え

NEONを使用してSIMD最適化を開始する前に、まずスカラー実装を改善する必要があります。現存するコードでの最大の問題は、ガウスカーネルが分離可能であるのに対し、非分割可能フィルタのように実装されていることです。分離可能なインプリメンテーションに切り替えると、N×2から2Nの演算数が2Nに減ります。5×5カーネルの場合、25の乗算から10への削減、つまりわずかな労力で2.5倍のスピードアップとなります。

十分に最適化されたスカラー実装が、SIMDに頼る必要なしに、あなたのニーズを満たすことができるかもしれません。そうでない場合は、少なくともスカラー最適化をベクトル化された実装に持ち越すことができます。


http://ja.wikipedia.org/wiki/Gaussian_blur

http://blogs.mathworks.com/steve/ 2006/11/28/separable-convolution-part-2/

5
追加された
上記の便利なリンクを追加しました
追加された 著者 Paul R,
どうすれば私の5x5 2Dマスクを2つの1Dマスクに変換できますか?
追加された 著者 shreyas253,
  1. Paul Rによって説明されているように、カーネルを分離します。
  2. ホイールを再発明しないでください。 Accelerateフレームワークの一部であるvImageを使用し、ベクトル化されたマルチスレッド畳み込みを実装します。具体的には、 vImageConvolve_Planar8 という機能が必要なようです。
4
追加された
これがiOS(そして場合によってはOS X)ソリューションである必要がある場合は、vImageの+1
追加された 著者 Paul R,