【问题标题】:unknown segmentation fault issue未知的分段错误问题
【发布时间】:2016-12-11 17:40:52
【问题描述】:

我遇到了一个让我发疯的分段错误问题。

这是代码:

            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)

x 实数浮点数组

y 虚数浮点数组

数组大小为 4096

我正在使用 Intel 内在函数,因此我一次加载 4 个值。

【问题讨论】:

  • 尝试将其减少为仍然存在段错误的minimal reproducible example。它不必仍然实现 FFT,只需使用几个内在函数并尝试打印它们。

标签: c segmentation-fault intel intrinsics


【解决方案1】:

根据 MSDN (https://msdn.microsoft.com/en-us/library/ayeb3ayc.aspx):

您不应直接访问 __m128 字段。但是,您可以在调试器中查看这些类型。 __m128 类型的变量映射到 XMM[0-7] 寄存器。

所以你可能会遇到上面的警告试图让你避免的情况。

【讨论】:

  • 谢谢您的明确回答先生...如果我调试它执行时间太长并且我需要查看几乎所有值的问题。
  • 欢迎来到程序员的真实生活:写代码 5 分钟,然后看调试屏幕 5 小时 :)
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
相关资源
最近更新 更多