2

我正在尝试运行一个 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 的第一个位置......

4

1 回答 1

0

这里有几点可能会有所帮助:

  1. 不要将j索引转换为标量。

  2. 移除就地蓄能器,如

    sumErr += vals[i].err;

  3. 在gfor循环中尽可能只使用 af::array 类型

但主要关注的是呼吁

 prediction(XT[i], rbfs, localGamma)

这需要完全矢量化,以便它可以在并行循环中运行。
gfor不能自动并行化任意函数。

另一方面,如果您只想并行化其他逻辑 - RMS 误差的计算,您可以将预测的调用拉出循环,将结果加载到 af::arrays 中,并行化代码以计算每个错误,最后在并行循环之外求和。

于 2017-07-26T20:22:02.457 回答