2016-08-05 11 views
-1

У меня проблема с разделением, которая сводит меня с ума.неизвестный вопрос об ошибке сегментации

это код:

  for (k = 0; k < range; k=k+4) 
     { 
      int k1,k2,kfactor,k1factor,k2factor; 
      __m128 bfly0_rv, bfly1_rv, bfly2_rv, bfly3_rv; 
      __m128 bfly0_iv, bfly1_iv, bfly2_iv, bfly3_iv; 
      __m128 x_n2_vec, x_N2_vec, x_N2_2_vec, x_N2_3_vec; 
      __m128 y_n2_vec, y_N2_vec, y_N2_2_vec, y_N2_3_vec; 
      /////////// 
      //factors// 
      /////////// 
      k1=2*k; 
      k2=3*k; 
      kfactor = k * factor; 
      k1factor = k1 * factor; 
      k2factor = k2 * factor; 
      //printf("%d \t %d \t %d \n",kfactor,k1factor,k2factor); 

      ////////////// 
      //Load input// 
      ////////////// 
      //real parts// 
      __M128_MM_LOAD_PS(x_n2_vec,&x[n2]); 
      __M128_MM_LOAD_PS(x_N2_vec,&x[N2]); 
      __M128_MM_LOAD_PS(x_N2_2_vec,&x[N2_2]); 
      __M128_MM_LOAD_PS(x_N2_3_vec,&x[N2_3]); 
      //imaginary parts// 
      __M128_MM_LOAD_PS(y_n2_vec,&y[n2]); 
      __M128_MM_LOAD_PS(y_N2_vec,&y[N2]); 
      __M128_MM_LOAD_PS(y_N2_2_vec,&y[N2_2]); 
      __M128_MM_LOAD_PS(y_N2_3_vec,&y[N2_3]); 

      /////////////// 
      //butterflies// 
      /////////////// 
      //additions// 
      //Butterfly 0// 
      __M128_MM_ADD_PS(bfly0_rv,x_n2_vec,x_N2_vec) 
      __M128_MM_ADD_PS(bfly0_rv,bfly0_rv,x_N2_2_vec) 
      __M128_MM_ADD_PS(bfly0_rv,bfly0_rv,x_N2_3_vec) 

      __M128_MM_ADD_PS(bfly0_iv,y_n2_vec,y_N2_vec) 
      __M128_MM_ADD_PS(bfly0_iv,bfly0_iv,y_N2_2_vec) 
      __M128_MM_ADD_PS(bfly0_iv,bfly0_iv,y_N2_3_vec) 
      //Butterfly 1// 
      __M128_MM_ADD_PS(bfly1_rv,x_n2_vec,y_N2_vec) 
      __M128_MM_SUB_PS(bfly1_rv,bfly1_rv,x_N2_2_vec) 
      __M128_MM_SUB_PS(bfly1_rv,bfly1_rv,y_N2_3_vec) 

      __M128_MM_SUB_PS(bfly1_iv,y_n2_vec,x_N2_vec) 
      __M128_MM_SUB_PS(bfly1_iv,bfly1_iv,y_N2_2_vec) 
      __M128_MM_ADD_PS(bfly1_iv,bfly1_iv,x_N2_3_vec) 
      //Butterfly 2// 
      __M128_MM_SUB_PS(bfly2_rv,x_n2_vec,x_N2_vec) 
      __M128_MM_ADD_PS(bfly2_rv,bfly2_rv,x_N2_2_vec) 
      __M128_MM_SUB_PS(bfly2_rv,bfly2_rv,x_N2_3_vec) 

      __M128_MM_SUB_PS(bfly2_iv,y_n2_vec,y_N2_vec) 
      __M128_MM_ADD_PS(bfly2_iv,bfly2_iv,y_N2_2_vec) 
      __M128_MM_SUB_PS(bfly2_iv,bfly2_iv,y_N2_3_vec) 
      //Butterfly 3// 
      __M128_MM_SUB_PS(bfly3_rv,x_n2_vec,y_N2_vec) 
      __M128_MM_SUB_PS(bfly3_rv,bfly3_rv,x_N2_2_vec) 
      __M128_MM_ADD_PS(bfly3_rv,bfly3_rv,y_N2_3_vec) 

      __M128_MM_ADD_PS(bfly3_iv,y_n2_vec,x_N2_vec) 
      __M128_MM_SUB_PS(bfly3_iv,bfly3_iv,y_N2_2_vec) 
      __M128_MM_SUB_PS(bfly3_iv,bfly3_iv,x_N2_3_vec) 
      printf("%f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \n",bfly0_rv[0],bfly0_iv[0],bfly1_rv[0],bfly1_iv[0],bfly2_rv[0],bfly2_iv[0],bfly3_rv[0],bfly3_iv[0]); 
      printf("%f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \n",bfly0_rv[1],bfly0_iv[1],bfly1_rv[1],bfly1_iv[1],bfly2_rv[1],bfly2_iv[1],bfly3_rv[1],bfly3_iv[1]); 
      printf("%f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \n",bfly0_rv[2],bfly0_iv[2],bfly1_rv[2],bfly1_iv[2],bfly2_rv[2],bfly2_iv[2],bfly3_rv[2],bfly3_iv[2]); 
      printf("%f \t %f \t %f \t %f \t %f \t %f \t %f \t %f \n",bfly0_rv[3],bfly0_iv[3],bfly1_rv[3],bfly1_iv[3],bfly2_rv[3],bfly2_iv[3],bfly3_rv[3],bfly3_iv[3]); 

      n2 = n2 + 4; 
      N2 = N2 + 4; 
      N2_2 = N2_2 + 4; 
      N2_3 = N2_3 + 4; 
     } 

ошибка сегментации происходит, когда я использую Printf для бабочек. Я печатаю значения бабочек, потому что хочу быть уверенным, что все вычисления выполнены правильно.

что я сделал неправильно?

УВЕДОМЛЕНИЕ:

Диапазон принимает следующие значения (1024,256,64,16,4,1)

х массив поплавки для чисел

y массив поплавков для воображаемых

размер массива 40 96

Я использую встроенные функции Intel, поэтому я загружаю 4 значения за раз.

+1

Попробуйте уменьшить это до [mcve], который по-прежнему сохраняется. Он не должен по-прежнему реализовывать БПФ, просто используйте пару встроенных функций и попытайтесь их распечатать. –

ответ

1

Согласно MSDN (https://msdn.microsoft.com/en-us/library/ayeb3ayc.aspx):

Вы не должны получить доступ к полям __m128 непосредственно. Однако вы можете видеть эти типы в отладчике. Переменная типа __m128 сопоставляется с регистрами XMM [0-7].

Так что, возможно, вы столкнетесь с ситуацией, в которой предупреждение выше пыталось вас избежать.

+0

Благодарю вас за ваш четкий ответ. Сэр ... проблема в том, что исполнение так долго, если я отлаживаю его, и мне нужно увидеть почти все значения. –

+4

Добро пожаловать в настоящую жизнь программиста: напишите код в течение 5 минут, затем посмотрите на экран отладки в течение 5 часов :) – fritzone