: は[algorithms-アンソニーM. Castaldo、R.Clint Whaleyらによって行われま、及びアンソニーT. Chronopouosのスーパーファミリーを用いたドット積で浮動小数点エラーを減らす] [1]「X + = nb; Y + = nb;」とは何ですか? XとYが2つのベクトルで、nbが整数である場合を意味しますか?紙の8ページに
あります次のコード:
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
とY
2つのベクトルであれば、それは
X += nb; Y+= nb;
何を意味しています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;
}
これは、「nb」要素でポインタを「X」にインクリメントすることを意味します。 –
適切なtypedefを使用すると、疑似コードだけでなく、ほぼCコードになります。 –
マッド物理学者ありがとう。私は実際にベクトルに適用された+ = rhs_value要素によってXへのポインタをインクリメントすることを意味することを知らない – user2315094