【问题标题】:segmentation fault in programm with SIMD commands使用 SIMD 命令的程序中的分段错误
【发布时间】:2013-04-25 15:19:00
【问题描述】:

这里有什么问题?当我运行程序时,它会显示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);
}

【问题讨论】:

  • 我猜_mm_sub_ps 需要16 byte 对齐的数据,而p1.coordp2.coordp3 没有正确对齐。因此,如果您按应该正确对齐的值分配给__m128 变量并使用那些我敢打赌问题就会消失。
  • 尝试使用 gdb 进行调试。
  • 与故障无关:似乎第一个循环一次又一次地使用相同的数据执行操作

标签: c++ simd


【解决方案1】:

任何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) ;

【讨论】:

    【解决方案2】:

    正如评论所说,在使用 SIMD 内部函数时,内存中的数据必须对齐(在这种特殊情况下,16 字节对齐),以防您在 UNIX 系统中尝试使用 posix_memalign() 分配数据:

    http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_memalign.html

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多