我尝试运行gfor循环,但这只运行一次......
有人可以帮助我吗?
gfor(seq j, gammaStep-1){
vector<predicao> vals;
countLoop = (int) sqc(j).scalar<float>();
double localGamma = (countLoop+1)*incGamma;
vector<rbf> rbfs = mountRbf(X1, Y1, localGamma);
for (int i = 0; i < XT.size(); i++){
double p = prediction(XT[i], rbfs, localGamma);
predicao p1;
p1.val = p;
p1.err = abs(XT[i] - p);
vals.push_back(p1);
}
double sumErr = 0;
for (int i = 0; i < vals.size(); i++){
sumErr += vals[i].err;
}
double media = sumErr / vals.size();
double vary = 0;
for (int i = 0; i < vals.size(); i++){
vary += pow(vals[i].err - media, 2);
}
double dev = sqrt(vary);
eM[countLoop] = media;
eD[countLoop] = dev;
}
在处理结束时,只计算了eM和eD的第一个位置......
答案 0 :(得分:0)
有几点可能对此有所帮助:
不要将 j 索引转换为标量。
删除就地累加器,如
sumErr + = vals [i] .err;
在 gfor 循环中尽可能使用af :: array类型
但主要关注的是对
的呼吁 prediction(XT[i], rbfs, localGamma)
这需要完全矢量化,以便它可以在并行循环中运行 gfor 无法自动平行任意功能。
另一方面,如果你只是想要并行化其他逻辑 - 计算RMS错误,你可以将调用的调用拉出循环,将结果加载到af :: arrays中,并将代码并行化计算每个错误,最后得到并行循环的外部。