4

行列に直交列があるかどうかを判断するコードは次のとおりです。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 で割り切れない配列をどのように処理しますか?

4

1 に答える 1

3

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
}
于 2013-01-17T01:55:22.283 に答える