3

私のアプリケーションは、計算量の多いほぼリアルタイムのワークロードを処理しており、可能な限り高速化する必要があります。このソフトウェアは C++ で書かれており、Linux のみを対象としています。

私のプログラムは、3096px x 2080px で 25 fps を提供できる専門の天体カメラから 6.4 メガピクセルの RAW データ バッファを取得します。このストリームは、高品質の線形補間ディベイヤー アルゴリズムを使用して、リアルタイムでディベイヤーされます。HQ 線形補間ディベイヤー アルゴリズムは常に計算量が多くなることはわかっていますが、プログラムの他の領域を高速化したいと考えています。

GPU が RGBA ピクセル バッファー上でより効率的に動作することは、私の理解 (プロファイリングによって証明されています) であるためです。しかし、私はこれを修正して喜んでいます。


最初に、私は非常に単純な for ループ (以下) を書きましたが、もちろん恐ろしい結果になりました。

// both buffers have uint8_t elements
for(int n = 0, m = 0; n < m_Width * m_Height * 4; n+=4, m+=3)
{
     m_display_buffer[n] = in_buffer[m];
     m_display_buffer[n+1] = in_buffer[m+1];
     m_display_buffer[n+2] = in_buffer[m+2];
     m_display_buffer[n+3] = 255;
}

上記のコードでは、13 fps のフレーム レートが得られました。私の次の実験は、すべての要素が 255 に等しいバッファを初期化し、次のコードを使用することでした。

uint8_t *dsp = m_display_buffer;
uint8_t *in_8 = (uint8_t*) in_buffer;

for (int n = 0; n < m_Width * m_Height; n++)
{
    *dsp++ = *in_8++;
    *dsp++ = *in_8++;
    *dsp++ = *in_8++;
    *dsp++;
}

上記のコードにより、ループが大幅に高速化されました。現在、i7-7700 ラップトップで 23.9 fps を達成しています。ただし、このコードを古いマシンで実行すると、依然として非常に残念なフレーム レートが得られます。古いマシンがデベイヤーに苦労していることは知っていますが、プロファイリングを行うと、RGBA バッファーへの変換が重大な問題を引き起こしていることが明確に示されています。


SSE 組み込み関数を使用してこれをより効率的に行うことができる可能性があることを読みましたが、SSE 組み込み関数の経験はありません。

オンラインで見つけた多くの SSE の例を試しましたが、動作しません。したがって、SSE の経験がある人がこの問題を解決してくれると助かります。

ソフトウェアがはるかに古いハードウェアで実行される可能性があるため、2 または 3 を超える SSE をターゲットにすることはできません。

誰かが私を正しい方向に向けることができれば幸いです。

4

0 に答える 0