0

私は顔検出に取り組んでおり、入力を .bmp ファイルとして受け取り、顔を検出し、顔に長方形を描画しています。

しかし、「cvDetect」という関数を追加して顔を検出すると、次のコード行でセグメンテーション違反が発生します-

_mm_store_ps(&c(y, 4.0*x), _mm_sub_ps(_mm_load_ps(a.data(y, 4.0*x)), _mm_load_ps(b.data(y, 4.0*x))));

デバッグ中に、これらの関数が原因でメモリ アラインメントの問題があることがわかりました。誰でもこの問題の解決を手伝ってもらえますか? コードは C++ で書かれており、私は Linux を使用しています。

4

4 に答える 4

2

これらの SSE 拡張機能については何も知りませんが、変数の調整に問題があるようです。変数宣言で特定のアラインメントを宣言するには、移植性のない拡張機能が必要であり、コンパイラによって異なります。

GCC の場合、変数を次のように宣言します。

// Declare a variable called 'a' of type __m128, aligned at 16 bytes.
__m128 a __attribute__((aligned (16)));

Microsoft Visual C++ の場合、次のようにします。

__declspec(align(16)) __m128 a;
于 2010-12-17T07:20:41.243 に答える
1

ここでの簡単な修正は、アラインされていないロードとストアを使用することです。つまり、

_mm_storeu_ps(&c(y, 4.0*x), _mm_sub_ps(_mm_loadu_ps(a.data(y, 4.0*x)), _mm_loadu_ps(b.data(y, 4.0*x))));

Core i5/i7 を使用していない限り、パフォーマンスが低下しますが、少なくとも正しく動作します。

最終的には、データが常に 16 バイト アラインされていることを確認する必要があります。

于 2010-12-17T14:49:32.467 に答える
0

a.data(r, c) は、a というオブジェクトに対する operator() の呼び出しであり、メモリへの参照を返すようです。

このメモリは、Visual Studio を使用している場合 ( newまたはmallocではなく)、 _mm_mallocまたは_aligned_mallocを使用して割り当てられている必要があります。

メモリが動的に割り当てられていないが、オブジェクトのフィールドである場合、そのフィールドは、asveikau の返信で指定されているようなアラインメント属性で宣言する必要があります。

于 2011-12-16T15:42:06.783 に答える
0

_ps関数には、16 バイトにアラインされたメモリ オペランドが必要です。

于 2010-12-17T07:05:41.733 に答える