SSE3 コマンドを使用するために、いくつかの既存のベクトルおよび行列クラスを再実装しようとしましたが、ベクトルの配列に対して一連の操作を実行するたびに、これらの「メモリ アクセス違反」エラーが発生しているようです。私は SSE に比較的慣れていないので、単純なものから始めています。これが私のベクトルクラスの全体です:
class SSEVector3D
{
public:
SSEVector3D();
SSEVector3D(float x, float y, float z);
SSEVector3D& operator+=(const SSEVector3D& rhs); //< Elementwise Addition
float x() const;
float y() const;
float z() const;
private:
float m_coords[3] __attribute__ ((aligned (16))); //< The x, y and z coordinates
};
したがって、まだ多くは行われておらず、いくつかのコンストラクター、アクセサー、および 1 つの操作のみです。私の (確かに限られた) SSE の知識を使用して、次のように追加操作を実装しました。
SSEVector3D& SSEVector3D::operator+=(const SSEVector3D& rhs)
{
__m128 * pLhs = (__m128 *) m_coords;
__m128 * pRhs = (__m128 *) rhs.m_coords;
*pLhs = _mm_add_ps(*pLhs, *pRhs);
return (*this);
}
古いベクトル クラスに対して新しいベクトル クラスの速度をテストする (全体を再実装する価値があるかどうかを確認する) ために、SSEVector3D オブジェクトのランダムな配列を生成してそれらを追加する簡単なプログラムを作成しました。複雑すぎません:
SSEVector3D sseSum(0, 0, 0);
for(i=0; i<sseVectors.size(); i++)
{
sseSum += sseVectors[i];
}
printf("Total: %f %f %f\n", sseSum.x(), sseSum.y(), sseSum.z());
変数は、タイプのsseVectors
要素を含む std::vectorであり、そのコンポーネントはすべてとSSEVector3D
の間の乱数に初期化されます。-1
1
これが私が抱えている問題です。のサイズが (試行錯誤を重ねてたどり着いた数値) 以下であればsseVectors
問題8,191
なく動作します。サイズが8,192
以上の場合、実行しようとすると次のエラーが発生します。
signal: SIGSEGV, si_code: 0 (アドレス: 0x00000080 でメモリアクセス違反)
しかし、その print 文を最後にコメントアウトするとsseVectors
、サイズが 8,192 以上であってもエラーになりません。
このベクトル クラスの書き方に何か問題がありますか? GCC バージョン 4.6 で Ubuntu 12.04.1 を実行しています