0

ここで何が問題なのですか?プログラムを実行すると、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);
}
4

2 に答える 2

0

posix_memalign()コメントにあるように、SIMD 組み込み関数を使用する場合、UNIX システムでデータを割り当てようとする場合に備えて、メモリ内のデータをアラインする必要があります(この場合は 16 バイト アライン) 。

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

于 2013-04-25T15:44:49.407 に答える
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) ;
于 2013-04-25T15:45:02.610 に答える