Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SIMD命令程序中的分段错误_C++_Simd - Fatal编程技术网

C++ SIMD命令程序中的分段错误

C++ SIMD命令程序中的分段错误,c++,simd,C++,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_

这里怎么了?当我运行程序时,它说,
分段错误(内核转储)
。 我使用了一些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);
}
float函数(点p1、点p2、整数尺寸)
{
int k;
浮动结果=0.0;
浮动*p3;
p3=(浮动*)malloc(16);
k=尺寸%4;
__m128*v_p1=(_m128*)p1.coord;
__m128*v_p2=(_m128*)p2.coord;
__m128*v_p3=(_m128*)p3;

对于(int i=0;i,如注释所述,在使用SIMD intrinsic时,内存中的数据必须对齐(在本例中,为16字节对齐),如果您在UNIX系统中,请尝试使用
posix_memalign()
分配数据:


任何
SIMD\u ps
指令都需要
16
字节对齐的数据。据我所知,至少
p3
没有正确对齐,因此如果您没有使用正确对齐的数据,您肯定会遇到
seg故障。
我自己无法运行此代码,但如果您分配给
\128
按值排列的变量您应该可以,因为它们应该正确对齐:

  __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) ;

我猜
\u mm\u sub\u ps
需要
16字节
对齐的数据和
p1.coord
p2.coord
p3
没有正确对齐。因此,如果您通过应该正确对齐的值分配给
\u m128
变量,并使用这些变量,我打赌问题会消失。尝试用gdb调试。不要担心g故障:第一个周期似乎反复使用相同的数据执行操作