gpt4 book ai didi

c - 循环展开不适用于剩余元素

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:57 24 4
gpt4 key购买 nike

我有一个典型的矩阵乘法算法。我正在尝试应用和理解循环展开,但是当我在 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;
}
}
}

假设大小又名 n 是 12。当我将它展开 4 次时,这段代码有效,这意味着它永远不会进入余数循环。但是当它发生时,我正在忘记发生了什么!如果有人能指导我哪里出错了,我将不胜感激。我对此很陌生,很难弄清楚。

最佳答案

在此形状上展开循环的通用方法:

for(int i=0; i<N; i++)
...

int i;
for(i=0; i<N-L; i+=L)
...
for(; i<N; i++)
...

或者如果您想将索引变量保留在循环范围内:

for(int i=0; i<N-L; i+=L)
...
for(int i=L*(N/L); i<N; i++)
...

在这里,我使用了整数除法向下舍入的事实。 L 是您在第一个循环中执行的步骤数。

例子:

const int N=22;
const int L=6;
int i;
for(i=0; i<N-L; i+=L)
{
printf("%d\n", i);
printf("%d\n", i+1);
printf("%d\n", i+2);
printf("%d\n", i+3);
printf("%d\n", i+4);
printf("%d\n", i+5);
}
for(; i<N; i++)
printf("%d\n", i);

但我建议看看 Duff's device .但是,我确实怀疑使用它并不总是一件好事。原因是模运算是一项非常昂贵的操作。

不需要条件 if (n % 8 != 0)。如果编写得当,for header 应该会处理这个问题。

关于c - 循环展开不适用于剩余元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47390932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com