2013-04-25 29 views
0

這裏有什麼問題?當我運行該程序時,它說,Segmentation Fault (Core Dumped)。 我已經使用了一些SIMD命令。使用SIMD命令的程序段分段錯誤

float function (Point p1, Point p2, int dim) 
{ 
     int k; 
     float result=0.0; 
     float *p3; 
     p3 = (float*) malloc (16); 
     k=dim%4; 

     __m128 *v_p1 = (__m128*)p1.coord; 
     __m128 *v_p2 = (__m128*)p2.coord; 
     __m128 *v_p3 = (__m128*)p3; 

     for (int i=0; i<dim/4; i++){ 
      *v_p3= _mm_sub_ps(*v_p1,*v_p2); 
     } 
     for(int i=0; i<dim; i++){ 
      result+=p3[i]; 
     } 
     return(result); 
} 
+2

我的猜測是,'_mm_sub_ps'需要'16 byte'調整後的數據和'P1 .coord','p2.coord'和'p3'沒有正確對齊。因此,如果您通過應該正確對齊的值賦予'__m128'變量,並使用那些我敢打賭的問題,那麼問題就會消失。 – 2013-04-25 15:22:37

+0

嘗試使用** gdb **進行調試。 – lucasmrod 2013-04-25 15:37:25

+2

不涉及故障:似乎第一個循環一次又一次地執行相同的數據 – MBo 2013-04-25 15:45:05

回答

0

任何的SIMD _ps指令將需要16字節對齊數據。從我可以告訴至少p3沒有正確對齊,所以如果你不使用正確對齊的數據,你肯定會得到一個seg fault。我無法運行此代碼自己,但如果分配給__m128變量的值,你應該沒問題,因爲他們應該正確對齊:

__m128 v_p1 = _mm_set_ps(...); // not sure of the argument 
    __m128 v_p2 = _mm_set_ps(...); // not sure of the argument 
    __m128 v_p3 = _mm_set_ps1(p3) ;