• 展开循环来加速计算


    对于循环次数较为有限的for循环,可通过手工展开该循环达到消除此循环的目的,达到加速运行的目的,下面给出一个代码段实例。

    1、for循环体

    1 // Q为常数
    2 for ( k = 0; k < Q; k++ ) {
    3     for ( int j = 0; j < Q; j++ ) {
    4         m[k] += fp[z][y][x][j] * mat_M[k][j];
    5     }
    6 }

    此段代码由两重循环构成,Q为常数,尝试将内层循环展开来消除内层循环。

    2、内存循环展开

    1 for ( k = 0; k < Q; k++ ) {
    2     m[k] = fp[z][y][x][0] * mat_M[k][0] + fp[z][y][x][1] * mat_M[k][1] + fp[z][y][x][2] * mat_M[k][2] + fp[z][y][x][3] * mat_M[k][3] + fp[z][y][x][4] * mat_M[k][4]
    3            + fp[z][y][x][5] * mat_M[k][5] + fp[z][y][x][6] * mat_M[k][6] + fp[z][y][x][7] * mat_M[k][7] + fp[z][y][x][8] * mat_M[k][8] + fp[z][y][x][9] * mat_M[k][9]
    4            + fp[z][y][x][10] * mat_M[k][10] + fp[z][y][x][11] * mat_M[k][11] + fp[z][y][x][12] * mat_M[k][12] + fp[z][y][x][13] * mat_M[k][13] + fp[z][y][x][14] * mat_M[k][14]
    5            + fp[z][y][x][15] * mat_M[k][15] + fp[z][y][x][16] * mat_M[k][16] + fp[z][y][x][17] * mat_M[k][17] + fp[z][y][x][18] * mat_M[k][18];
    6 }

    展开内层循环,将两重循环变为一重循环。

    3、对比

    展开前,代码运行时间为66s,展开后,运行时间51s,运行时间缩短22.7%,运行加速效果还是非常显著,考虑到此段代码为整个程序的运行热点段,对整个程序运行也将带来一定的速度提升。

    如上所述,展开内层循环已经有了显著的加速效果,进一步展开外层循环,不知是否能进一步加速代码,减少运行时间,有待进一步验证。

  • 相关阅读:
    广义线性模型 GLM
    最大熵模型 Maximum Entropy Model
    Ensemble Learning 之 Bagging 与 Random Forest
    Ensemble Learning 之 Gradient Boosting 与 GBDT
    Ensemble Learning 之 Adaboost
    集成学习概述
    决策树之 CART
    用于分类的决策树(Decision Tree)-ID3 C4.5
    朴素贝叶斯(Naive Bayes)
    动态规划 Dynamic Programming
  • 原文地址:https://www.cnblogs.com/kljfdsa/p/9027991.html
Copyright © 2020-2023  润新知