2013-08-19 319 views
3

當我嘗試展開與AVX簡單的循環,我得到運行時錯誤 - 段錯誤奇怪的錯誤

const int sz = 9; 
    float *src = (float *)_mm_malloc(sz*sizeof(float), 16); 
    float *dest = (float *)_mm_malloc(sz*sizeof(float), 16); 

    for(int i=0; i<8; i+=8) 
    { 
     __m256 buffer = _mm256_load_ps(src+i); 
     _mm256_store_ps(dest+i, buffer); 
    } 

    _mm_free(src); 
    _mm_free(dest); 

有趣:如果SZ = 8,或> = 13,運行時不會壓碎。否則發生分段錯誤

怎麼了?

編譯器 - gcc 4.7。

+0

什麼編譯器是這個(猜測英特爾),是我不會感到驚訝,有一個[SSCCE](http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions/22762#22762)? – sehe

+0

編譯器 - gcc 4.7。 – gorill

+1

您的AVX寄存器包含256位。而256/8 = 32,這就是使用內在函數時需要32字節對齊的原因。 – cdiggins

回答

2

將對齊方式提高到32使症狀消失。

我不能很好地與這些內在精通,但如果32字節對齊被要求在64位CPU

#include <mm_malloc.h> 
#include <immintrin.h> 

int main() 
{ 
    const int sz = 9; 
    float *src = (float *)_mm_malloc(sz*sizeof(float), 32); 
    float *dest = (float *)_mm_malloc(sz*sizeof(float), 32); 

    for(int i=0; i<8; i+=8) 
    { 
     __m256 buffer = _mm256_load_ps(src+i); 
     _mm256_store_ps(dest+i, buffer); 
    } 

    _mm_free(src); 
    _mm_free(dest); 
}