【发布时间】:2017-11-20 11:26:44
【问题描述】:
我有一个典型的矩阵乘法算法。我正在尝试应用和理解循环展开,但是当我尝试展开 k 次时,当 k 不是矩阵大小的倍数时,我在实现算法时遇到了问题。 (结果我得到了非常大的数字)。这意味着展开后我不知道如何处理剩余的元素。这是我所拥有的:
void Mult_Matx(unsigned long* a, unsigned long* b, unsigned long*c, long n)
{
long i = 0, j = 0, k = 0;
unsigned long sum, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
for (i = 0; i < n; i++)
{
long in = i * n;
for (j = 0; j < n; j++)
{
sum = sum1 = sum2 = sum3 = sum4 = sum5 = sum6 = sum7 = 0;
for (k = 0; k < n; k += 8)
{
sum = sum + a[in + k] * b[k * n + j];
sum1 = sum1 + a[in + (k + 1)] * b[(k + 1) * n + j];
sum2 = sum2 + a[in + (k + 2)] * b[(k + 2) * n + j];
sum3 = sum3 + a[in + (k + 3)] * b[(k + 3) * n + j];
sum4 = sum4 + a[in + (k + 4)] * b[(k + 4) * n + j];
sum5 = sum5 + a[in + (k + 5)] * b[(k + 5) * n + j];
sum6 = sum6 + a[in + (k + 6)] * b[(k + 6) * n + j];
sum7 = sum7 + a[in + (k + 7)] * b[(k + 7) * n + j];
}
if (n % 8 != 0)
{
for (k = 8 * (n / 8); k < n; k++)
{
sum = sum + a[in + k] * b[k * n + j];
}
}
c[in + j] = sum + sum1 + sum2 + sum3 + sum4 + sum5 + sum6 + sum7;
}
}
}
假设 size aka n 是 12。当我展开 4 次时,此代码有效,这意味着它永远不会进入剩余循环。但是当它发生时,我不知道发生了什么!如果有人能指导我哪里出错了,我将不胜感激。我是新手,很难弄清楚。
【问题讨论】:
-
手动循环展开是如此 80 年代......(我会说:不要。如果你坚持,看看Duff's device,通过在展开的某处跳转来处理“剩余部分”代码)
-
@FelixPalmen 哈哈。我正在学习操作系统入门课程。所以....
-
也许你应该花点时间来learn how to debug your programs?
-
另外,为什么不简单地添加到
sum,而不是临时变量sum1到sum7?就像例如sum += a[in+(k+5)]* b[(k+5)*n+j]?或者也可以跳过sum,直接添加到c[in + j]? -
sum3行的不同空格让我如厕:)
标签: c matrix-multiplication loop-unrolling