-2
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];

我的逻辑有什么问题?

哈哈!哎呀!我困倦的眼睛正在解释这个愚蠢的问题。我看到每次迭代都会计算多次。

4

2 回答 2

7

无论是哪种语言,您都需要为 b 创建常量索引,为 a 创建变量索引

 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”循环,但它会读取 a[] 从这里跳到那里然后再次回到这里再次跳跃,这使它变慢。虽然这不是向量:P 我只是用它来填充空间

于 2012-07-31T09:45:56.077 回答
1

这个问题有点矛盾。两个数组的长度相等,但要求不相等。

假设requeirement是正确的,您可以执行以下操作

对于每个b元素,都有接下来3 个元素的总和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 ++];

}

这里没有任何数组边界控制。这自然只是一个示例代码。

如果这不是您要搜索的内容,请澄清。

于 2012-07-31T09:49:25.690 回答