设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 5578|回复: 25
打印 上一主题 下一主题

[信息技术] C++ 提速的新发现

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?3 _8 }  q1 K" V8 ]1 v, r8 _
    4 U8 X5 |* l- \
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    $ b2 G- M4 T6 E* H" o* i$ U% p' k6 D6 `4 ]6 H5 Q3 [* l
    速度优化问题真的很有意思啊。$ C& c0 ^- ?, h1 X, K- [

    7 `* f" w# H% m欢迎大家继续讨论

    评分

    参与人数 2爱元 +8 收起 理由
    helloworld + 4
    住在乡下 + 4 涨姿势

    查看全部评分

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1932 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?8 K5 Q2 c( [4 K9 ]. T, I
    把代码贴上来看看?
    & V& m' h8 N. g2 L$ x. S! ]! K+ X. y& c9 r' y' s
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    # D$ f9 e; J, X2 Q' N+ M
    数值分析 发表于 2022-9-24 23:04& ^  t1 N" n# ?- M# m3 i
    拉下来?拉多少?+ R/ E6 n; d9 s
    把代码贴上来看看?

    7 s$ h1 O' O  e1 E- S( K  S7 M
    6 \* {4 g4 }( b5 p7 y2 [8 Ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : ]0 k% i/ Z( `/ G$ w, e6 W) R! S3 l{/ m$ D; a( e2 d2 a
            comp temp, xtimesy;
    " P$ @3 {; V, F2 z  x        xtimesy.re = 0;# `& {( q  w' q! O. [* k( [0 T
            xtimesy.im = 0;
    + M& @* y+ J0 K9 e, L6 |        int j0 = lenB - 1;3 Y+ N. w& A( F) _
            int    i, j, i1, reali;6 P$ ~& g6 w' Q* G# _. |
            if (lenA % 2 == 1)
    2 J0 v! f6 h: K+ d" K                reali = lenA + 1;
    " \& V# s1 p) f1 m        else. ]5 E1 J2 c  z" o
                    reali = lenA;
    , i2 g2 C) p6 F8 G        reali /= 2;; }' w' R5 `$ e: L8 z

    - b. g2 Y. E5 ~        int nconv = reali + lenB;, N  k4 d- E/ l3 }
            //#pragma omp parallel for
    + K- D' K2 X7 w. ?0 [, S        for (i = reali; i < nconv; i++)$ i: X) ?# P/ P. i  Z
            {- y2 ]$ R  t7 u6 i
                    temp.re = 0;1 Q) T# A! h) M& W* C  j
                    temp.im = 0;
    % v% B9 K8 G1 z( h  x                i1 = i;
    8 u4 g4 P( m/ J5 d0 I- p                for (j = j0; j >= 0; j--)
    9 z+ t1 L3 j- F1 D( j, ^                {; Z5 \7 A* }! p0 d
                            /* floating date operation */1 _( s1 m! v9 K; l
                    }

    1 v4 v1 b+ ~. i" H0 _        }5 t) z5 b1 B* m6 n6 T7 z& [
    }6 H; p. Z$ c' m$ [0 H' b

    $ h# ?# h- E8 Oxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    8 ?# m% Z, M. F9 a  m+ [* {; e8 |: x- U5 B
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
      @/ Y% Z# D  Y7 ?1 n- G2 I现在call xcorr 100次,耗时78s.- H: @4 r6 ~3 Y) v: H) N% y
    8 n! Q& I7 G0 ^- [" }
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    " X' t! s; C2 {, N& N# l$ f% ~. F. T- c  w; a9 r7 O+ Q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    + G5 v4 ?8 m( rMaybe Debug mode?

    ( k, `7 R& S' q6 v5 }
    9 F) N  `' b( l+ K不应该,看我上面的回复。- o$ z0 i% F$ T# Y5 E
    # j0 g2 D& i7 B; e  U
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1932 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 : r; P8 [( e( X* r
    雷达 发表于 2022-9-24 23:541 C' {1 d% `3 o+ Q6 m4 ^
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)! s6 R, f+ Y2 j5 t) S- ]3 v
    {
    1 q7 `% V4 o4 l3 m5 n# U, [- u        comp temp, xtimesy;
    : k- k7 G' V, v) R/ A! \
    ( V+ q4 |! O7 Q+ v% ?; b) o
    这个不是这么比的吧。。。  e# P2 g  H0 e5 E6 r4 l
    3 K0 h2 E, T' @8 ^
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # R) d& q% `4 k2 e# D- X! y& I! x" i# R  s& M
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 " O; @  j& M" F8 K$ L+ L6 e
    数值分析 发表于 2022-9-25 00:20. x2 P/ @, R/ q' M
    这个不是这么比的吧。。。* I- \2 h* Z2 T3 W! M+ @( @

    3 u/ z. M0 e+ r! f0 v您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ( w8 @! B4 y& C( C3 ?+ I& M
    2 _' A+ N8 g2 x有道理。; i! C& d$ y/ Z% r* x2 e. I% {
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ l7 b& O, d  d3 r
    5 G  F  h9 e8 _8 x我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:466 D9 M$ {: b& r# i8 ~
    有道理。
    8 d5 H& t" [! f! Z  F+ q( D所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    3 x; c7 D6 Z0 E% j5 u- U: q; m* X你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    2 d, }3 W: j  K3 aWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:205 p2 n6 T, J* a. i7 Z: [
    这个不是这么比的吧。。。
    7 m* C! x( i  w
      G( @2 R* Y. e# O) s您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    7 \% S9 ^/ I0 h+ }
      \; d1 ]9 V. Q* Y9 O. I
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1932 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 9 X! M# `: i* |; a+ U1 y( g
    沉宝 发表于 2022-9-25 01:48
    ; V# d6 P( t- s/ p6 ?' @, e; U现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ! f, M& `0 f5 O7 j  g& u) \5 C0 ]5 H; _
    是的,兄台说的对。
    3 W3 g  J4 Z9 B& m6 k  ?+ ]7 [9 j% d* S2 z
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。/ K% Z$ Q4 b* V" v+ y7 b* m
    ) K% }; z- u6 N1 Y6 P
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    , l; w1 n- u( S- E& r2 K! Y3 l; i4 l5 D* W
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    1 ~" [8 V7 ^5 L6 ]3 R
      ?1 O/ a" S0 ?. {当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 7 T' F) Y  M1 D+ a1 B& H
    沉宝 发表于 2022-9-25 01:27: s0 w' X5 G% \, H% A0 o1 M0 m
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    : \; M6 z1 L* B, h
    0 f  B( B) ]* v9 p
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。% I( h( a3 {1 {

    2 y2 K8 z) q8 I0 O2 g. p我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    " t- T* j. @% W$ D6 [又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    # j& z9 M1 ~. A4 w
    时间差一倍的结果可以接受。, o$ S/ `4 C4 s# c
    9 L$ ^4 Z, `! ^: u+ ]1 N8 P; @* t
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1932 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    # t1 n& C0 V& m( ^- {# f6 V$ S: j2 y
    雷达 发表于 2022-9-25 04:47, T$ _# R; I- \8 j* j
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 `: H# ~7 C! N& e8 F4 F6 r% |, R
    2 K2 s$ y; [. M2 p1 I* t" f
    ! S, i) F- d( [/ P, i) h( H- S! ~3 {% ^
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    3 @3 }8 X6 I# a! J
    数值分析 发表于 2022-9-25 14:585 p# A& a! o6 F: c' G" q
    能不能把这个也贴上来,看看和上一个有什么不同?
    / r3 Q' k/ A! l2 P! F: ^* `; y8 p3 |
    理了理思路,重新做了一个测试。- z6 c) t; e4 z4 P5 F; k& u
    做了两个 vector 和 两个 float *, 都长 100000
    ! V% V' S2 k5 H% h' Q3 n4 n9 z2 Y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., N" A3 L5 `2 A) l
    $ c! r* x8 z" ]5 Y5 g2 Z" i# ~
    内循环试了4种方法,
    * I8 }- q, P* n# X) x0 t1. 直接调用 vector inner_product 247s
    1 c  X2 e. _  z  l, u  q! M0 f2. vector 循环点乘累加 237s
      P8 ~1 l/ R. ?& l1 y# d' m3. float * 循环点乘累加 204s. a( a; r& _6 ]! e& G
    4. 空循环 100000 次 202s
    ' F; x( o" r* _" X7 k2 G- s0 U% e0 P/ n5 S
    不做内循环 200s2 j( G; q9 Q/ p. y5 w
    5 q/ ^* f% R) k9 J% \
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。( R$ G- }. T: \9 z0 o
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 I* Z4 C! D2 s- X4 m# D0 n, B
    1 g! y& m' n$ ^% v
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ' I7 y( ^2 f/ \0 V- t2 X: b- m; z& c" E2 m
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    5 y, Z4 S7 l; f0 r: O
      \  b. i. ~3 Q9 }
            std::vector < float > vec1(N);
    . U3 p, C' x  |- q( i        std::vector < float > vec2(N);
    ) d* t& B; J, h! G        float* b1 = new float[N];6 D+ o' e' X3 m+ i% `
            float* b2 = new float[N];
    1 V% @/ {( Q: c' }; y+ b
    , ]( Q6 _% K" [) D4 G* |        for (int j = 0; j < 6000; j++)
    - Z1 D6 ~+ f  u; C- p        {6 s3 O* Q# N- H* r- ~
                    std::generate(vec1.begin(), vec1.end(), []() {) Q3 b. s) T4 M) W& h
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    , Y- t3 d, t  b& |                        });  o, R- l" y8 c; r3 `! a& ?

    * J: C0 u6 L! G4 q1 m                std::generate(vec2.begin(), vec2.end(), []() {
    6 N4 j% L6 j5 W4 T9 ~) o+ C                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! Z& {1 G) r* j- T! v
                            });
    0 U- {2 l9 L5 U/ V& C2 q! v: L6 K8 P$ \- g. H( b: g
                    for (size_t jj = 0; jj < vec1.size(); jj++)$ i  u/ x& X# N' ]4 d9 B. H
                    {$ g! R6 [- ^0 K4 M# B
                            b1[jj] = vec1[jj];
    * J/ H* G' O1 N# {7 K. [, N                }; r( T. ]; q* ?5 Y  h) V0 ?$ Z

    ( p* P( r: ], h  S- Q                for (size_t jj = 0; jj < vec2.size(); jj++)
    + t7 j/ A( I' }/ R                {$ E6 d% c1 @4 |: A2 c
                            b2[jj] = vec2[jj];
    ; {7 E, q" M3 q3 y( D5 U                }9 }* @3 I' J3 G6 @. _5 O

    ; C. ]: ]- I. `                //Method - 1  N=100000 247s  5 c+ Q6 l1 K1 j% u  T
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    3 ~) V% n9 \" U& l; x# y, X                                ; z; N0 m& `9 O. {
                    //Method - 2  N=100000  237s
    % u/ g) e# j9 l! j' K  Y% }                /*% ?, @6 I. Y9 U+ J' V
                    for (int jj = 0; jj < N ; jj++)0 `' x" u4 o( l& I$ i9 _" c
                    {4 c$ H' r/ o4 Q& Q' [
                            fresult += vec1[jj] * vec2[jj];
    9 J0 h, T  B! _                }
    + t$ G; d0 |; g                */
    . K8 M6 ]* v  e                                " E: X: [. ~, z
                    //Method - 3  N=100000 204s
    0 J( ?( E( X2 ?9 D! Z$ U                /*
    ; u4 L0 v3 o" Z" e" H. d7 q                for (int jj = 0; jj < N; jj++)
    ' N# m, N: N( L! p% @1 Q& b                {2 [+ X! s' g( p4 @& H: \/ h  e! @! e
                            fresult += b1[jj] * b2[jj];
    ; B3 t8 \& w; p! q) _* O                }
    $ J# ~; u2 w1 P3 Z6 Z, ~  W                */. S+ a. Y9 i9 Y1 f' a1 [' G" e

    $ u0 b6 o8 ?% S+ g                //Method - 4   202s4 X+ x7 w- I5 p  a: n9 I
                    /*) A/ R) A; ^7 z: D1 H) x
                    for (int jj = 0; jj < N; jj++)8 z1 M/ ~1 i# t, f0 b3 a6 p
                    {0 c% U  a7 f1 H: I7 h5 H
                            
    : R9 X$ Z3 o" n3 R6 a( g) Q                }
    " P7 v+ k9 |- I4 x' `; @                */
    / A2 U2 n1 U" e                //comment out all methods, N=100000  202s                9 c' }6 v/ g2 y3 e, ?) G! {
            }% A! m$ }: a+ |2 e; ^) @
    9 v3 g. ?! s' G7 J+ j
            delete []b1;# ~5 Q% t: j3 J$ V: G
            delete []b2;
    4 B1 B8 H! w$ ~& S5 l8 }. @
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * l8 {) W: p3 v) A
    $ b" S1 G5 s' l  x/ b# e你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?) w1 D2 S, a' Q! k3 d+ I0 x# j
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:153 u1 C1 b) i' [& u3 S2 P& A( m# ]. u
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! E4 d! p5 y( j0 U( d) u- j) X& i6 u: G. p
    你第二个试验里面的j在循环里面又重新定义 ...

    : k' y. }8 x0 o) v$ [内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
      t7 `9 @0 J% e0 @
    + M0 g* u- ?  l! @/ N不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16/ E" W8 x  D. |& j* u
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    % e& P/ n2 {! A5 l2 P1 V/ C% ^; \* A6 b" a2 S' ^, Z
    不和它 ...
    ; O2 U5 G7 y; H+ W/ o; a
    : k3 K. @5 J+ B' n
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。% Y! r, Y* L4 k
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2022-9-27 07:25:57 | 只看该作者
    一个无关问题,为什么爱坛的帖子里在我这里有好些奇怪的东东在里面,是防拷贝措施吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:541 N/ Z4 E+ s/ y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    # y1 J5 M0 S6 q" l1 F; P4 W3 v2 w{8 e/ i9 i. n  @: v' g2 }$ ?
            comp temp, xtimesy;

    6 [4 A* E) ^( W这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    5 M  S8 y4 {  y; h6 U内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ! m$ v/ T* f% C( P% mVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2025-7-15 09:24 , Processed in 0.060188 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表