5

std :: unordered_mapの値として__m128(SSEベクトル)を使用する際のバグを追跡しました。これにより、mingw32 g++4.7.2でランタイムセグメンテーション違反が発生します。

以下の例をご覧ください。これが失敗する理由はありますか?または、回避策があるでしょうか?(値をクラスでラップしようとしましたが、役に立ちませんでした。)ありがとう。

#include <unordered_map>
#include <xmmintrin.h>          // __m128
#include <iostream>

int main()
{
    std::unordered_map<int,__m128> m;
    std::cerr << "still ok\n";
    m[0] = __m128();
    std::cerr << "crash in previous statement\n";
    return 0;
}

コンパイル設定:g ++ -march = native -std = c ++ 11

4

2 に答える 2

3

アラインメントに関して2つの問題があります:

ABIは、__m128変数が常にスタック上で整列されることを保証しますか?

グローバル演算子は、タイプnewに合わせて適切に配置されたメモリを返しますか?__m128つまり、16バイトのアラインメントでメモリを返します。

于 2013-02-02T22:57:55.960 に答える
2

C ++は現在、過剰に整列された型の動的割り当てを処理しません。通常のx86ABIでは、標準のアラインメントは8で、__ m128のアラインメントは16バイトであるため、オーバーアラインメントされています。通常のx86_64ABIでは、標準のアラインメントは16であるため、__ m128は安全です(ただし、__ m256は32バイトのアラインメントでは再び安全ではありません)。

物事を「正しく機能させる」次の標準の変更の可能性については、このペーパーを参照してください: http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3396.htm

それまでの間、たとえば、aligned_alloc(C11)、posix_memalign(unix)、_ aligned_malloc(Microsoft)などに基づいて、独自のアロケータを指定できます。

于 2013-02-11T00:36:49.123 に答える