c - C 中的 SSE 编程 — 大小不能被 4 整除怎么办?

标签 c sse

这是确定矩阵是否具有正交列的代码。当我有 n 可以被 4 整除时,代码运行正常,但是当 n 不能被 4 整除时,程序意外停止(代码中提到的位置)

for(i=0;i<n-1;i++)
{
        for(j=i+1;j<n;j++)
        {
            sum = 0;  

            for(k=0;k<n-4;k+=4)
            {
                  X=_mm_load_ps(&D[n*i+k]);
                  Y=_mm_load_ps(&D[n*j+k]);
                   printf("fff");  //not printing , program stops here
                  acc = _mm_add_ps(acc,_mm_mul_ps(X,Y));

            }

            _mm_store_ps(&temp[0],acc);
            sum = temp[0]+temp[1]+temp[2]+temp[3];

            for(;k<n;k++){
                sum = sum + D[i*n+k]*D[j*n+k];
            }

            if(sum ==0)
                return 1;
         }

     }

    return 0;
}

这可能是什么原因?如何处理大小不能被 4 整除的数组?

最佳答案

您确定何时提前停止的代码在 for(k...) 循环中不正确。尝试这样的事情:

int n4 = n - (n % 4);   // smallest multiple of 4 <= n
for (k=0; k < n4, k+=4) //replaces: for(k=0;k<n-4;k+=4) 
{ // loop body
}
for (k=n4; k < n; k++)
{ // non-vectorized loop for the last few columns
}

关于c - C 中的 SSE 编程 — 大小不能被 4 整除怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14370471/

相关文章:

c++ - 此语句如何在 c 或 c++ 中工作 `int k = (a++,++a);`

c - 错误 : Conditional jump or move depends on uninitialised value - C valgrind

使用 C 将 ppm 文件从 P3 转换为 P6

c++ - 将特定 SSE 内在函数转换为 NEON 内在函数

c - 我的 SIMPLE C 程序有什么问题?

c - 骑士之旅算法

c++ - 如何截断 XMM 寄存器中的浮点值

x86 - 字节序如何与SIMD寄存器一起工作?

x86 - 使用Intel AVX从压缩 double 向量存储单个 double

c - 如何检查 SSE 中 16 位整数乘法的溢出?