在论文的第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;
如果X
和Y
是两个向量且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;
}
答案 0 :(得分:0)
如果您假设
,您显示的代码可以解释为C代码typedef double scalar;
typedef scalar *Vec;
并在第一次循环之前的某处添加一行int s, b, i;
。
在这种情况下,很明显X += nb
正在将指针X
增加nb
标量的大小。这与algorighm似乎正在做的事情是一致的:总结大小为nb
的块的点积而不是一次性。