这里有什么问题?当我运行该程序时,它会说Segmentation Fault (Core Dumped)
。
我使用了一些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);
}
答案 0 :(得分:0)
正如评论所说,在使用SIMD内在函数时,内存中的数据必须对齐(在这种特殊情况下,对齐16字节),以防您在UNIX系统中尝试使用{{1}分配数据}:
http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_memalign.html
答案 1 :(得分: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) ;