设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?& |( m+ [( e3 Z/ M; V9 r
    2 T, s3 b7 X* W) ?
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。+ o( `4 T) h' r; ?. [; ^

    - O6 o" j/ U3 A2 E- h; N+ i速度优化问题真的很有意思啊。% e3 P, r7 r4 G( T8 N# f% e9 @% ^

    5 [: O6 l' F6 b4 F& }欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?( J& f6 V4 D0 y# ]$ L
    把代码贴上来看看?
    + `; X( O: B; h+ i
      q( j6 e' z# u  a难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-24 07:04
  • 签到天数: 126 天

    [LV.7]分神

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

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    $ [9 J# t- \4 d: x
    数值分析 发表于 2022-9-24 23:04
    1 Q2 _- ~$ ^% o8 w3 ]" `4 |  Q% F拉下来?拉多少?
    - }8 o& Y( W7 o8 B9 p把代码贴上来看看?
    " g% D% Z/ z5 d* I

    . x3 @1 l! X7 Y( Wvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + @, e8 |2 B3 B{% c9 _# f# E4 r9 G: O
            comp temp, xtimesy;% X& ^3 |$ Z7 H( }3 z" h
            xtimesy.re = 0;
    ( m1 O" Y: k; v7 ^0 n        xtimesy.im = 0;
    - S& P6 Y4 \: w( {3 ]+ H7 E        int j0 = lenB - 1;  M1 T/ v. z- L+ I
            int    i, j, i1, reali;/ H( i; M: c" k4 Q) t
            if (lenA % 2 == 1)
    - {- K  Q2 U2 i* Y6 p; j; j                reali = lenA + 1;9 @. `3 G0 \; l- `( N
            else2 l4 Y7 t# q' }' t2 k( W
                    reali = lenA;
    " T" }. ^( ]( D" G- c' d0 ]/ [8 B        reali /= 2;
    # v! j0 B* R* i0 S: N: V' M, A( i* N/ H
            int nconv = reali + lenB;
    % u/ w! i* l" a4 t, w3 E        //#pragma omp parallel for) L! \+ n6 ?! ?( K4 U5 t
            for (i = reali; i < nconv; i++)! ]( l6 u  E* R0 c
            {2 o! j7 M, K8 t6 Y  s4 x/ ~2 a
                    temp.re = 0;
    9 y" @, i3 }6 `2 E/ `6 t- _% ^8 q, N                temp.im = 0;- p$ B' ]- v" p% d" j
                    i1 = i;
    ( m2 l/ T6 e. d7 U                for (j = j0; j >= 0; j--)) |& P2 c" g" U; B) B
                    {
    ( Q  u1 w* k  F) v0 f$ l# s% x                        /* floating date operation */6 y4 q! u) }* v" |- L2 |
                    }
    1 ?' l8 @7 f/ Z+ U$ C% v
            }6 E% B# p$ ?) d4 k
    }
    * q) ?& z* Y' {: z+ m7 [5 H- k1 ]  G( y$ L. b+ e( i
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样2 H5 N, g, q; }3 \2 s' Z, x

    . ^2 ?- M! ^" K! a红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。3 Q0 i$ s3 C6 F4 ~, r1 p; H
    现在call xcorr 100次,耗时78s.
    9 I5 \. E5 k6 L* V) R2 e* k6 P& x
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. - \: X4 Y. A: p2 x8 G% Q& c$ v. K) P: Y

    6 m) X1 m4 e, k& o3 K" Z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    $ `3 i1 l3 U0 |- zMaybe Debug mode?

    ; d9 |  Y4 F4 }) Q# _7 \# ~
    7 K9 q. b9 i3 ~不应该,看我上面的回复。
    # p0 v/ W! R0 T: T, U3 r5 {: U: N" ?. ?
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 * C1 B1 J/ p+ [. J: Q( y
    雷达 发表于 2022-9-24 23:54
    & J. ?$ \! I: C. _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 H- n) Q3 l) M& ~/ R( I* \
    {
    & t! A1 S* w4 W' [  D        comp temp, xtimesy;
    " j  X4 [- V1 M; b/ U' Z
    3 F' Q) w) U. [
    这个不是这么比的吧。。。
    1 |# y/ `1 n0 C4 y6 H3 c! `; [: y. e* e( \) k' R5 U
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    / Q$ J' Q: g5 T- s" t; Y3 c& V- Y* a: B; w: b( k
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    . q/ U9 D  @7 y2 s  R
    数值分析 发表于 2022-9-25 00:20: A- O$ E# A- z1 _$ y
    这个不是这么比的吧。。。
    0 }4 g, y- V% C
    % V: C9 H  S( T2 A9 o+ Q您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' l3 I! e' [0 L' j  ^

    " A7 X: C$ C1 e有道理。) K- c6 s( d( j5 f/ a' F
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    / \& }8 y9 |6 e2 t" q6 [  J+ {. W( Q* \+ q; X7 z. x' g
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    / T4 }! _# l7 u9 n有道理。" p" }* T+ ?6 p8 ~8 ]& k9 s6 D8 J
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    + C0 E4 c0 D: p  s4 @你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    : g- Z7 L! l4 i5 z" d/ d3 vWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    . W" ?8 m4 {5 v这个不是这么比的吧。。。$ ?( N1 ^" x( u& X
    - k+ d% m, ?4 m& `
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    - v- ^* Z6 N5 S/ q+ d  [; e2 r$ M1 r# x1 G- P$ c
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    - t. W1 j& n7 d7 T+ N
    沉宝 发表于 2022-9-25 01:48
    , b! @/ p& y5 n& [现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    1 b9 Y+ S5 C! y5 B7 g: o& E  j6 f' O. d8 d" b3 _
    是的,兄台说的对。
    0 N% a* ?" O6 G/ L
    2 k# P, Z  M( k- ~) r" p7 w其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。$ `1 G2 d# A  i1 I
    , z. I; U9 f5 x2 e3 _' B+ H+ G
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    1 m+ `& X. Z0 R* I: u) \1 {. M; n% d) n
    1 Z+ ^; F2 S9 s" g: [7 ~1 \( U比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。9 e& I$ l/ m/ s2 L! e% m

    # \. W9 K' F5 y4 {% o) N当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    / I2 r. [' v$ ^' @& G' d( U8 L9 [
    沉宝 发表于 2022-9-25 01:27
    ( F6 k- n2 B  |  s: C1 M, I( G你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    3 n3 S/ Q2 \) S- b! l* h, B
    - c1 X% b" O  w* |- A2 S又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    - P9 l, r$ i3 t7 m+ m/ l9 I: b; K- h4 ~
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    % b, `& v* q) w' f2 b' S* Z又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / u: X  c  h# Y, K
    时间差一倍的结果可以接受。
    ; _+ V& x- |$ W8 C9 t& _3 o% X) t9 `) Q3 D0 P
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    - t3 h* a0 Q5 w: O: Q5 G
    雷达 发表于 2022-9-25 04:477 R" e- P( B- ^2 u1 D
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    $ u) _" d, m5 j4 J; `; p2 |- q% p7 n5 a0 M- n
    " G5 v& y* {% k4 v) ]# k' H" z4 _5 ^

    ( J: e0 E" P0 W& C能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! ]6 m9 c/ h7 o" C" g! n; w
    数值分析 发表于 2022-9-25 14:58% H+ c( `* Z+ X  y! A. Z1 G
    能不能把这个也贴上来,看看和上一个有什么不同?

    5 f" y+ ?9 e( f$ W理了理思路,重新做了一个测试。* ?( L: ^) M) u2 w2 b' B
    做了两个 vector 和 两个 float *, 都长 100000* N1 M! V8 t' a. y, \
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    * x" s9 C% O. G
    + E* u5 W! k. k; ]/ n5 F内循环试了4种方法,
    , l  f% Q' E' \  g5 _4 X! P1. 直接调用 vector inner_product 247s & b7 W  m6 b. m7 p
    2. vector 循环点乘累加 237s
    & \7 c/ q* w0 F; r0 o( ?. z3. float * 循环点乘累加 204s3 z! m7 I9 [5 X" |
    4. 空循环 100000 次 202s" V) O2 o/ M; ^( M. f) ~  e; ~0 C4 g$ _4 X

    9 x* @2 G8 z. ~4 b% H8 y# t( {& y不做内循环 200s9 V, _% ]* H! p  ]' K

    4 b6 c1 F. ?. P; x你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ s) j. W6 z) j- Q
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) V& n* ?3 ^) f8 r- i( {
    2 @9 k. E! w3 k+ n
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ s( Q9 Z4 H3 C( y1 {
    3 D0 H! q2 ^: c" X
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    : c2 g" W5 L3 l: }! v# t0 @. T" b) {1 f7 x7 o. S
            std::vector < float > vec1(N);. w) a( U4 H: M! h, h
            std::vector < float > vec2(N);
    . c# S9 n' W# m2 w        float* b1 = new float[N];' l2 |4 Y( D" x
            float* b2 = new float[N];& N( O# k7 {7 K5 Y( L8 |! b: s
    9 W) q  w4 k. [; \/ L
            for (int j = 0; j < 6000; j++)
    ' w! Q( k9 J4 y: m7 I6 Y  {( k        {
    ( ~  x* b% `; [3 U8 ]  c                std::generate(vec1.begin(), vec1.end(), []() {' c+ V" P2 e9 J4 ~
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 b, O/ Q; n5 h' C, @
                            });
    $ {5 b2 Q, |' j) t3 x# |1 s" j) I3 Q) ~( l0 w) d$ o
                    std::generate(vec2.begin(), vec2.end(), []() {
    4 }( n* Q  I( l: z                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;/ c4 e) @  A2 a8 l0 ?2 ]
                            });7 k7 \+ |. H2 g, W6 |1 x

    * d; U3 M. b8 T* [                for (size_t jj = 0; jj < vec1.size(); jj++)0 V! n0 d( k5 d, [% u, L
                    {
    4 E  W( T/ O/ v; o& ]                        b1[jj] = vec1[jj];; d8 Q8 A: |) L& T
                    }
    4 k& s+ u# |8 r! r2 _  f; o( c8 ~, Q5 G, G4 K; P
                    for (size_t jj = 0; jj < vec2.size(); jj++)+ c. |# l5 L3 M- D5 K
                    {5 r, x4 ^/ Q  x
                            b2[jj] = vec2[jj];
    * N. n$ _) \5 q" u, S  y% L; f                }
    ! t9 e6 @4 r, D" n# C- m+ x$ u4 @: N, g, r% j2 Y6 x5 w
                    //Method - 1  N=100000 247s  
    * V- r" R2 h2 s% Q$ _: z& x                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);" ~! S4 V6 A  A2 J! m/ G& O
                                    
    7 c; f0 \1 a- U' Z                //Method - 2  N=100000  237s' ^# e# p9 E$ q0 V5 [/ ]- \
                    /*
    + n& k& O( Q! j3 }% \                for (int jj = 0; jj < N ; jj++)
    ) T  k+ k& q; O/ b0 f# k, q                {
    0 O4 [! B& m; L+ R, w" V                        fresult += vec1[jj] * vec2[jj];% R2 \& w7 S  }  Y) B
                    }
    . H3 p3 b9 a. _' U                */
    : s8 E" ^0 S) p1 X( l  d3 K- S, T                                
    & u$ `: ]' |" s! N. c& t$ l                //Method - 3  N=100000 204s# }1 V# `! K1 g# H2 B/ R# _
                    /*. c9 a6 ~+ V7 e# k0 g1 O. U
                    for (int jj = 0; jj < N; jj++)* d5 Q  B+ G5 a6 H8 f
                    {: e; R: j+ t3 b
                            fresult += b1[jj] * b2[jj];
    + z4 p8 L( v: Q9 T0 E6 E                }1 l' M: W/ s* X# D% l$ I& v
                    */
    ' B& g  w8 J# y  ^5 O! q- s' e7 ?4 H" r% X& [: u
                    //Method - 4   202s& T6 }8 @+ B8 j: |
                    /*
    2 k- i6 [/ N4 d$ X/ C                for (int jj = 0; jj < N; jj++)
    7 k) x, @7 y/ Y* f. k) f                {5 H% h# Y" d5 \* ^4 _4 G
                            
    5 L! |' o# y6 {6 P! c                }3 D+ k4 h5 d6 F" d
                    */
      k- q4 M8 |1 h3 s, f- S  x1 @! [                //comment out all methods, N=100000  202s                ( C/ t2 J& u8 e; X& |
            }
    * ~7 c, w$ k( H. z
    + G# O2 I& n& f  N: l# Q! f        delete []b1;
    ! Q, k% B/ M! C4 j1 Y/ r2 g# \        delete []b2;
    & ]7 H( ?) M& b6 p
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 e8 T4 y& O* k
    6 ]0 C( U6 Z. h* G9 y+ Z0 @
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    / V0 ~- |. e. ~2 Z8 w4 G+ C. H5 C, C
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    & d+ a) q% s/ q4 H; C  w9 [' z瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! `' l/ w+ C% Z1 s. v" f
    " S8 j  u2 |' C: c你第二个试验里面的j在循环里面又重新定义 ...

    # b$ o8 _& E+ Q: _/ `内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + L7 e; v% L/ D; L; {* S
    ; s2 Q" h2 j/ D, _- W不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    $ {0 M3 J0 V  W0 M: T, \) W内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL  ]- U* z" x+ u4 {3 Z# ~+ t

    2 B6 x$ n, ^9 @4 ]; |) n4 e" ?不和它 ...

    , Q* ^( J8 ]& g. K5 P" B
    4 w, G+ }" ~6 M* M) N$ {不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。  d: u9 u. }2 o* ]% `. S
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    9 n& ?, p) f$ k, {- }9 E* Svoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 v0 y4 [8 o! S! a; ?* Y, U2 E* }2 R{
    4 j3 m+ D9 s6 m. Z        comp temp, xtimesy;

    9 L( X0 e( M7 W这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    7 W( u9 \2 V& }3 {1 R) x! S. w内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?9 k6 r3 d0 |  J
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-29 17:49 , Processed in 0.066544 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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