VS中使用SSE DEBUG正常RELEASE下出錯的解決方法

    __m128i* p_aoffsets = (__m128i*)aoffsets;
    __m128i* p_boffsets = (__m128i*)boffsets;
    int n_count = MATCH_MASK / 8 + 1;
    for(int i = 0; i < n_count; ++i)
    {
      p_aoffsets[i] = _mm_subs_epi16(p_aoffsets[i], p_boffsets[i]);
    }
如上一段代碼,DEBUG模式下可以正常運行,但RELEASE時第一次循環就會出錯,根本原因還是在於內存未對齊造成的。參見http://bbs.csdn.net/topics/360044337。

#pragma pack(16),__declspec(align(16))就是兩坨屎,想搞
SSE,絕對,千萬,永遠,不要用!!! 我用了一整年的movupd啊!!!!!!
最後找遍了整個中文世界沒有,還是請教寫彙編的老外得到了精華,
想對齊16字節,最好的辦法是人肉手動對齊內存...

整理後的對齊函數:
static inline void* align(const void* x, int n)
{
  int p = (int)x;
  p = (p % n == 0)? (p) : (p + n - p % n);
  return (void*)p;
}

使用時先分配比需要的字節數多n個字節(n爲希望的對齊數),然後調用函數返回對齊後的地址,示例:
char a_block_head[MATCH_MASK * 2 + 16u] = {0};
uint16_t* aoffsets = align(a_block_head, 16);

最後,贊同那位老兄說的,#pragma pack和__declspec(align())的確是兩坨屎,哈哈。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章