2012-12-24 40 views
3

我正在嘗試使用SSE2計算兩個4d浮點向量之間的平方歐幾里得距離。我的操作系統是Mac OS X 10.7 Lion。SSE2:_mm_mul_ps在GCC 4.2和O0優化情況下在OS X上失敗

當我在XCode 4.5.2中使用Apple LLVM編譯器時,一切都很好。但是當我在項目設置中切換到GCC 4.2時,我的錯誤EXC_BAD_ACCESS在_mm_mul_ps操作。

當我從命令行編譯代碼(g ++ main.cpp)沒有額外的參數我有「分段錯誤」。但是,當我啓用任何優化級別(O1,O2,O3,O),除O0之外一切正常。

我不能在我的Ubuntu 12.04上用GCC 4.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; 
} 

回答

6

本地變量d未對齊。修正SPPixel的typedef中的對齊方式,而不是在每個定義上記住它。

變化:

typedef float SPPixel[4]; 

到:

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

,然後你也可以刪除主力__attribute__ ((aligned(16)))預選賽。