int bNum=3;
int aNum=3;
for (int i = 0; i < bNum; i++)
{
for (int j = 0; j < aNum; j++)
{
b[i] += a[j];
b[i + 1] += a[j + 3];
b[i + 2] += a[j + 6];
}
}
我基本上希望发生以下情况:
b[0]=a[0]+a[1]+a[2];
b[1]=a[3]+a[4]+a[5];
b[2]=a[6]+a[7]+a[8];
我的逻辑出了什么问题?
HAHA! OOPS!我困倦的眼睛是一个愚蠢的问题。我看到在每次迭代时都会多次计算。
答案 0 :(得分:7)
for (int j = 0; j < aNum; j++)
{
//here is loop-unrolling for b
b[0] += a[j];
b[1] += a[j + 3];
b[2] += a[j + 6];
}
for(k=0;k<max;k++)
{
for (int j = 0; j < aNum; j++)
{
//without loop-unrolling
b[k] += a[j+k*3];
}
}
我将“k”循环设为外部,让它尽可能连续地读取a []。你可以在内部制作“k”循环,但是它会从这里读到[]跳到那里然后再次回到这里再次跳跃,这使得它变慢。 这不是矢量:P我只是用它填充空间
答案 1 :(得分:1)
这个问题有点矛盾。 两个数组的长度是相等的,但要求不相等。
假设 重新发送是正确的,您可以执行以下操作
对于每个b
元素,a
int bNum=3;
int aIndex = 0;
for (int i = 0; i < bNum; i++)
{
for (int j = 0; j < 3; j++)
b[i] += a[aIndex ++];
}
此处没有任何数组边界控件。这自然只是一个示例代码。
如果这不是您要搜索的内容,请澄清。