什么是“X + = nb; Y + = nb;”表示如果X和Y是两个向量而nb是整数?

时间:2017-09-18 18:14:12

标签: vector integer pseudocode

在论文的第8页:   [使用超级块算法系列减少点积中的浮点误差 - Anthony M. Castaldo,R.Clint Whaley和Anthony T. Chronopouos] [1]

有以下代码:

typedef double scalar;
typedef scalar *Vec;
scalar dotProd(Vec X, Vec Y, int nb)
{  int n = X.length;
   int nblks = n / nb;
   int nsblks = sqrt(nblks);
   int blksInSblk = nblks / nsblks;
   scalar dot = 0.0, sdot, cdot;

   for (s=0; s < nsblks; s++)
   {  sdot = 0.0;
      for (b=0; b < blksInSblk; b++)
      {
         cdot = X[0] * Y[0];
         for (i=1; i < nb; i++)
            cdot += X[i] * Y[i];
         sdot += cdot;
         X += nb; Y += nb;
      }
      dot += sdot;
   }
   return dot;
}

我不明白伪代码的这一行:

X += nb; Y+= nb;

如果XY是两个向量且nb是整数,这意味着什么?

附录:如果不使用指针,如何通过nb元素“增加”?

int n = x.size();
int nblks = n / nb;

int nsblks = sqrt(nblks);
int blksInSblk = nblks / nsblks;
double dot = 0.0;
double sdot = 0.0;
double cdot = 0.0;
for(int s=0;s<nsblks;s++) {
  std::cout << "iteration s= " << s << std::endl;
  for(int b=0;b<blksInSblk;b++) {
    std::cout << "iteration b= " << b << std::endl;
    cdot += x(0) * y(0);
    std::cout << "cdot += x(0) * y(0) = " << cdot << std::endl;
       int pointingTo = 0;
      for(int i=pointingTo;i<nb;i++) {
        cdot += x(i) * y(i);
      }
      sdot += cdot;
      // Increment the pointer to x by nb elements:
      // x += nb;
      pointingTo += nb;
      // Increment the pointer to y by nb elements;
      // y += nb
    //}
  }
  dot += sdot;
}

1 个答案:

答案 0 :(得分:0)

如果您假设

,您显示的代码可以解释为C代码
typedef double scalar;
typedef scalar *Vec;

并在第一次循环之前的某处添加一行int s, b, i;

在这种情况下,很明显X += nb正在将指针X增加nb标量的大小。这与algorighm似乎正在做的事情是一致的:总结大小为nb的块的点积而不是一次性。