ベクトルをSSEレジスタにロードしようとしていますが、コードはエラーなしでコンパイルされますが、実行しようとするとセグメント化エラーが発生します。ここでは、私のコードです:ベクトルをSSEレジスタにロードする
inline int SSEJaccard::calcSSEJaccardDist(unsigned int id1, unsigned int id2) {
int result;
__m128i v, v1;
std::vector<uint32_t> &fv1 = fvs[id1];
std::vector<uint32_t> &fv2 = fvs[id2];
v = _mm_load_si128((__m128i const*) (&fv1));
v1 = _mm_load_si128((__m128i const*) (&fv2));
v = _mm_and_si128(v,v1);
result =_mm_extract_epi16(v, 0) + _mm_extract_epi16(v, 4);
return result;
}
そして、FSVは、次のように定義されたグローバル変数です:
std::vector<std::vector<uint32_t> > fvs;
私はインテルコンパイラ(ICC)を使用しています。ありがとうございます
あなた> 'を使用してください。 (または、その場で列の数を変更する必要がある場合) –
std::vector
sが4つの要素、すなわち(より可能性があり、適切なアライメント与え破棄されます)、十分なデータを持っていることを確認してください。 'fvs'を単一のベクトルにして、独自のインデックスを作成して2D配列をシミュレートします。 [この質問の回答](http://stackoverflow.com/questions/33093860/using-nested-vectors-vs-a-flatten-vector-wrapper-strange-behaviour)を参照してください。異なる行の長さが異なり、別々に成長/縮小することができる「不揃い」の配列が必要な場合にのみ、 'vector私は、OPが適切な多次元配列の代わりにポインタの配列を使用していた別の質問への回答を書いたことがわかりましたが、見つけられません。 :/その質問は、ほとんど最悪の場合の条件(非常に小さな割り当てが多い連続したメモリアクセスの代わりに散在する)で配列へのポインタを使用していて、IIRCの修正から10倍以上のスピードアップを得ました。 –