3

SSE2を使用して、2つの4dフロートベクトル間のユークリッド距離の2乗を計算しようとしています。私のOSはMacOSX10.7Lionです。

XCode4.5.2でAppleLLVMコンパイラを使用すると、すべて問題ありません。しかし、プロジェクトの設定でGCC 4.2に切り替えると、_mm_mul_ps操作でエラーEXC_BAD_ACCESSが発生します。

追加の引数なしでコマンドライン( g ++ main.cpp )からコードをコンパイルすると、「セグメンテーション違反」が発生します。しかし、O0以外の最適化レベル(O1、O2、O3、Os)を有効にすると、すべてが機能します。

Ubuntu12.04とGCC4.6.3でこの問題を再現できません。

#include <stdio.h>
#include <emmintrin.h>

typedef float SPPixel[4];

float sp_squared_color_diff(const SPPixel px1, const SPPixel px2) {
    SPPixel d;
    __m128 sse_px1 = _mm_load_ps(px1);
    __m128 sse_px2 = _mm_load_ps(px2);
    sse_px1 = _mm_sub_ps(sse_px1, sse_px2);
    sse_px2 = _mm_mul_ps(sse_px1, sse_px1); // EXC_BAD_ACCESS

    _mm_store_ps(d, sse_px2);
    return d[0] + d[1] + d[2] + d[3];
}

int main(int argc, const char * argv[]) {
    SPPixel a __attribute__ ((aligned (16))) = {1, 2, 3, 4};
    SPPixel b __attribute__ ((aligned (16))) = {2, 4, 6, 8};
    float result = sp_squared_color_diff(a, b);
    printf("result = %f\n", result);
    return 0;
}
4

1 に答える 1

6

ローカル変数のd位置がずれています。SPPixelすべての定義で覚えておく必要はなく、typedefの配置を修正します。

変化する:

typedef float SPPixel[4];

に:

typedef float SPPixel[4] __attribute__ ((aligned(16)));

__attribute__ ((aligned(16)))次に、mainの修飾子を削除することもできます。

于 2012-12-24T18:53:51.280 に答える