2 つの行列を乗算するための適切なループ展開を見つけようとしています。
たとえば、NxN 行列を合計したい場合:
void SumMatrix(int *M, int n, int *result)
{
int i,j;
*result = 0;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
*result += M[j][i];
}
できるよ :
void SumMatrix(int *M, int n, int *result)
{
int i;
int size = n*n;
int last = size%8;
int acc1 = 0;
int acc2 = 0;
int *pEnd = M+size-last;
for (; M<pEnd; M+=8)
{
acc1 += (*M + *(M+1)) + (*(M+2) + *(M+3));
acc2 += (*(M+4) + *(M+5)) + (*(M+6) + *(M+7));
}
/* adding the last entries */
while (last--)
acc1 += *(M++);
*result = acc1+acc2;
}
しかし、私は 2 つの行列を乗算する (良い) 方法を見つけようとしましたが、現時点では何も見つかりませんでした。
備考: これは宿題ではありません。今日試験があって、ちょうどこの問題について考えました。
助けていただければ幸いです
よろしく
ロン