【发布时间】:2012-04-30 15:50:30
【问题描述】:
我正在尝试找出一个很好的循环展开来将两个矩阵相乘。
例如,如果我们想对 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 个矩阵,但目前没有找到。
备注:这不是家庭作业,我今天要考试,只是想到了这个问题,我认为这可能是一个很好的考试问题,不是吗?
我会很感激任何帮助
问候
罗恩
【问题讨论】:
-
取决于考试的性质。如果专门针对低级性能优化(前提是已通过测量证明a)第一个代码版本是一个重要的性能瓶颈,并且b)第二个版本在实际生产环境中的运行速度明显快于第一个),然后就好了。如果是关于一般的 C 编程,绝对不是。第一段代码比第二段更简洁、易于阅读、验证和维护。
-
@PéterTörök:不,使用 3 个 FOR 循环对两个矩阵进行通常的乘法运算。我试图让 if 更快,并且使用 SUM ,就像上面的代码一样。
-
我明白你想做什么。你明白我的评论吗?你有什么考试?
标签: c optimization loops for-loop compiler-optimization