代码之家  ›  专栏  ›  技术社区  ›  Kari

性能:一次完成所有操作,或者每次操作循环几次?

  •  0
  • Kari  · 技术社区  · 5 年前

    它是 典型地 在迭代过程中,更快(为什么)同时执行所有指令?出于缓存的原因,这似乎是必要的。或者我们可以重复几次吗?

    需要注意的是 count 很大(1000到1000 000)。

    //original loop, wish to separate into several loops:
    for(size_t i=0; i<10000000; ++i){
        floatVec_A[i] +=  floatVec_B[i] - floatVec_C[i]*floatVec_D[i];
        floatVec_A[i] = std::sin(floatVec_A[i]);
        //and so on
    }
    

    与我的愿望相反(但恐怕这可能是一个缓慢的方法 …通常 ?):

    for(size_t i=0; i<10000000; ++i){
        floatVec_A[i] +=  floatVec_B[i];
    }
    for(size_t i=0; i<10000000; ++i){
        floatVec_A[i] += -floatVec_C[i]*floatvec_D[i];
    }
    for(size_t i=0; i<10000000; ++i){
        floatVec_A[i] = sin(floatVec_A[i]);
    }
    //and so on
    

    我希望这样做,因为这些独立的循环可以被外观整洁的函数替换,使代码可读性更好。对我来说,这会让生活变得更轻松,因为实际上我在内部使用的是avx内部函数,为了方便起见,上面的代码被简化了。

    myMath::add_toFirst( floatVec_A,  floatVec_B); 
    myMath::mul_toThird( floatVec_C,  floatVec_D,  resultVec);
    myMath::add_toFirst( floatVec_A,  resultVec);
    myMath::sin(floatVec_A);
    //and so on
    

    一般来说 ,在后一种情况下,表演会受到影响吗?是小的还是大的,是因为哪些因素?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Jason    5 年前

    你的第一个例子…

    //original loop, wish to separate into several loops:
    for(size_t i=0; i<10000000; ++i){
        floatVec_A[i] +=  floatVec_B[i] - floatVec_C[i]*floatVec_D[i];
        floatVec_A[i] = std::sin(floatVec_A[i]);
        //and so on
    }
    

    会因为CPU缓存而表现最佳。

    获取数据通常控制性能,第一个示例是最适合缓存的(线性的和可预测的)。出于这个原因,编译器实际上可能会将您的循环连接到一个循环中。