设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    0 X& t! F; W7 V0 f  r, [' ?
      D6 ~3 r3 P% Z# X- \; H0 Z1 q- m自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    " O$ S; p- p* [2 I& i# ?0 f: M& x8 E% n7 j# f: x. {
    速度优化问题真的很有意思啊。; p; D- h, s% U8 F$ K
    $ |3 Q$ K$ J+ o0 K' j
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    # n% }2 m: x& S+ m0 v  F% S& P把代码贴上来看看?( `4 y6 x  d9 L- _0 Q  h# E+ [

    % L" i: ]4 N. l1 ]7 b难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 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 编辑 6 F. S( Y4 [- L
    数值分析 发表于 2022-9-24 23:04) _. U, R" z( s: V6 z* \; Q# X# @) f- [
    拉下来?拉多少?
    . ?/ }5 X. r$ T$ y2 `把代码贴上来看看?

    % Z( W6 A+ m4 j! S- S0 v
    % @* K. B! O: `" Q0 w" P6 |2 G" Ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , c# D3 |$ y2 {{
    + g# w) Q* k* S) }        comp temp, xtimesy;; X' N  @0 S0 U$ |$ J* Z. [, R1 t" ?, k  p
            xtimesy.re = 0;4 v- P/ c5 e8 P7 S
            xtimesy.im = 0;- a% f. j; ^; E
            int j0 = lenB - 1;7 @8 m1 p; n8 J5 E- K# o. u
            int    i, j, i1, reali;
    4 J5 n# `, o& H* R1 m* n/ G* S        if (lenA % 2 == 1)( p1 S' ^, p- L5 t' R; N+ ^
                    reali = lenA + 1;
    1 L/ C! E/ f+ j5 J$ f        else
    6 t5 N3 k( U& N* ^                reali = lenA;
    & @7 l( h  J  l* w! @: x* f  l  H        reali /= 2;
    3 R/ Y% ]9 [' ^  a* o. }9 C, ]2 `/ n- l& x4 x$ e
            int nconv = reali + lenB;" t% ^" P) S6 h' w
            //#pragma omp parallel for
    % n, v  }3 d! l2 G; Z        for (i = reali; i < nconv; i++)7 P/ H3 g# y; \; o4 k
            {
    * y+ M1 f+ k7 b  a( o  t8 R* I                temp.re = 0;
    % i0 @* i% @& H( G* }+ X/ ~                temp.im = 0;
    , ?+ u1 O0 j- Z; H8 y                i1 = i;; C3 V' I" M& R, q. q" ~
                    for (j = j0; j >= 0; j--)
    8 b9 K3 [! A" \+ L: }0 X: O  D                {
    5 H5 `! `- {4 G% O                        /* floating date operation */
    / b0 }7 v3 {4 \! R6 h                }
    5 {/ O7 P1 r# O- h! ^2 r( s
            }
    1 q* N8 [  P( r5 S}# t: n5 g4 `3 t. r$ H9 [
    : m1 a+ J9 ^, U/ f
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    & h! e+ F* Q' b6 U: K$ }( P( o' z
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。& b. Y* t3 ]. G2 R' E0 ^; f
    现在call xcorr 100次,耗时78s.
    1 Q% E3 }( y" v7 s
    % E  O; G& y* d) u* q; F如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. $ l+ w2 D* R, Y2 I  M: ]& j
    ' E9 B1 |/ X! L) q/ n" z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33. L; X$ v/ s/ m) M1 p- ^
    Maybe Debug mode?

    * H. V: t3 [5 R4 y
    $ W, R+ O# ]0 Y# ^不应该,看我上面的回复。
    5 z" ^: _* M* ^' j, j0 t; r+ @
    # E/ T; r. l8 m7 j我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    , ], ?0 n* I1 ~
    雷达 发表于 2022-9-24 23:54$ }: {! T5 H1 K3 V3 |* ]
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ N% @* O/ d4 B) M8 k4 v" n{
      G8 a; i8 j: U        comp temp, xtimesy;

    1 R6 A! A3 M1 ^6 `; P, E& d
    % i$ L4 r* v, C: `; x$ Z这个不是这么比的吧。。。& I- Q5 w3 }# H( ^) c
    4 R3 `: ]8 I; K. y. D
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。5 x: M- B9 p' N0 Q

    7 @8 ~' |4 B8 p+ Y( K3 S, ^  w而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 ) ^. E, P$ q6 k* Q, a
    数值分析 发表于 2022-9-25 00:20
    ; Q( c5 W+ p$ {8 K3 U( ?5 I/ F这个不是这么比的吧。。。5 _! t1 N/ Q+ \: [% r$ q

    2 }% [0 x' B: S. b) Q/ H7 D3 I您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    1 `% l5 ]9 H9 K8 i, d
    ; p; t: u6 T+ H+ `
    有道理。( v5 T: @2 Q% [& M0 x
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。' Z2 `6 f: |, J4 u: D

    ( G) `* ?' T) K1 {9 ~我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46. i7 t8 q9 y  D7 `
    有道理。
    7 L- v% J! a9 z6 k5 B8 i所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    - R, G$ P5 P% \3 u你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    + F- F, k( w* K$ }" nWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    ) a/ f) V+ F4 B- \% h! ~这个不是这么比的吧。。。" p* l  M3 a+ P, ~
    * H0 o& T* Q- Z3 x8 a( U3 x2 I
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    5 C4 c3 y) @. D. x

    ' T' E# u4 \8 w& L  e现在的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 编辑 0 j- Z, O$ C3 n' `7 }: }4 ]9 I0 Y
    沉宝 发表于 2022-9-25 01:48
    $ U- P/ `( t! w现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    0 T* D' ]) o  Z2 V. @' y, l
    # a9 R* d$ Z3 c% ?+ H: [是的,兄台说的对。
    . O, a! r7 b  E9 d  m7 a, A
    ) u+ A2 U  m$ j7 Y: ~其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    - I! `0 P: A0 J+ {& g0 }0 T
    : z; L2 q# o1 s4 U" x雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。- Z4 S9 o* Q1 n" J- s$ F5 x/ a7 t
    4 E, c$ z, N7 }/ b' ]7 Q
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。" ^# ^' W7 K4 R$ l, ~
    1 Z7 R" Z  j, ~: O5 H
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    1 P! h0 B! N+ g5 O$ p# v
    沉宝 发表于 2022-9-25 01:27
    ! E, E/ X- ?% p( ~你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
      ?) U* L* v' \# c' y
    & a* Q9 L! D6 R+ a4 w+ k0 g
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    # J# G$ i5 X1 W: i/ {1 {/ h) z1 \" k( r, V* E
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:470 O# O8 A" b' P& V  g) }2 }0 F, @
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 |* {" P% K( b; `, F时间差一倍的结果可以接受。
    $ ~- n; G  X8 {- g5 Z
    7 L: _9 o3 Z  K你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    / Q, o5 f$ b5 |8 }2 C4 S$ V
    雷达 发表于 2022-9-25 04:47
    . b& K3 `) ?) e# @, t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    1 _- M' N, v% O3 r6 k8 n( {- N' M7 P) @2 t& c8 w$ j

    ' j% T$ l; K: K9 N8 P8 Z  }
    1 U" E7 Y3 D0 a9 ?8 `% |能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 1 R( B: e5 a7 O& L# b
    数值分析 发表于 2022-9-25 14:58
    ! u# ?$ }; V. k' e, U/ F能不能把这个也贴上来,看看和上一个有什么不同?
    ; |" y3 f  H* M# h  {' s5 [. z
    理了理思路,重新做了一个测试。& E( ~5 l4 t( v! I" \+ z
    做了两个 vector 和 两个 float *, 都长 100000
    ( h2 t: `. Q3 e# K外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache./ r0 u! z  o! Y7 u) M( C( r: d

    % c7 @9 }0 q/ p2 y内循环试了4种方法,8 i" e" ?8 Y/ E3 d. r- b+ V
    1. 直接调用 vector inner_product 247s 8 l- l" s9 r+ H: @8 R
    2. vector 循环点乘累加 237s. _" U: W/ f8 B( a
    3. float * 循环点乘累加 204s
    * {4 h& d1 A9 e- d4. 空循环 100000 次 202s
    ! {0 J5 O4 I8 a1 U5 n; L0 l
    " f" J: z0 Z6 e3 D" {9 c不做内循环 200s. i* A/ F, V% w) r# }# N

    + T; V2 j% c- s  t. {你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ [$ v2 u: Y, F% D) r
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 f8 e2 \6 \" y- i6 d5 |

    - y9 f1 ^% Z) x. W! i$ G5 [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ( A& O2 n  j" c9 \- l! e5 }7 p  W& k5 K
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ' T& G+ S. J! ~- O5 w0 `9 i
    1 \4 i6 M8 h% G. @  D
            std::vector < float > vec1(N);5 Z9 d. B9 \8 g3 y$ _
            std::vector < float > vec2(N);
    - {5 x; s' w) K9 {3 b7 i        float* b1 = new float[N];
    + ^9 K3 O! M2 [4 G        float* b2 = new float[N];0 s* ^! j' ?  x0 U) C1 h* \+ X! }
    , r& R! z5 s3 `1 {- M: j7 |% y
            for (int j = 0; j < 6000; j++)
    % c; _8 e7 f' Y9 G3 b  G2 I        {
    ( L- g* }3 R6 J. o( A                std::generate(vec1.begin(), vec1.end(), []() {4 @$ x- _, y1 s9 s7 i
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    8 ?7 G1 n9 r: ?+ q; f                        });
    ( q/ f  w2 n+ M9 E  I; {& X) `* H' F& X' \9 [8 b
                    std::generate(vec2.begin(), vec2.end(), []() {+ B' ]& ]% \+ T! E$ l
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, Q9 e3 ^6 {! Y) U: s
                            });) U0 J& I& Q! o9 e7 m! g3 e3 A

    : G% q, M4 b) v  I$ V5 _                for (size_t jj = 0; jj < vec1.size(); jj++)8 b$ N. b0 b- I" [  I0 ?
                    {" }8 q- j1 S. ~( M% \* T0 R1 {
                            b1[jj] = vec1[jj];6 y$ {' G3 H4 O
                    }9 u3 f8 ?# m; a+ W! `3 G) b3 x+ Z

    9 n( r* [! o  l* z                for (size_t jj = 0; jj < vec2.size(); jj++)
      _( N1 k# B5 \( m( `# W! \+ Y                {3 t. t9 ^, O. R7 x
                            b2[jj] = vec2[jj];
    6 G( L! @& m; K" [, O7 \                }& Y7 z; A! B  D  X& Y/ ^% N
    ( y# x/ o$ r  \8 Q# C
                    //Method - 1  N=100000 247s  
    , N/ d3 U; v% b" U                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    0 J, `/ P: A7 b8 r2 N2 ?8 C! N9 l                                
    / c, n# B! Q6 Z$ r- S                //Method - 2  N=100000  237s  j7 J1 m  }) e; K* R, l! \
                    /*
    * _  L/ i: V8 A; _8 x                for (int jj = 0; jj < N ; jj++)
    ' g7 B2 B9 h6 w( S* {$ }  d6 [                {' E  q3 Z6 o! H6 B. g0 ^6 T
                            fresult += vec1[jj] * vec2[jj];
    * e7 ^- e, R, ~                }
    9 j- |2 T, _  Y7 e                */
    9 g/ i6 w" q6 Q. f* G                                
    " N: N$ `, ]3 @+ l& l- v5 w1 r+ F                //Method - 3  N=100000 204s
    # |; z- z% f0 j% U                /*5 x+ v# T; H) C( a# C$ n9 y+ |
                    for (int jj = 0; jj < N; jj++)2 v. p' m- p1 s# R7 d
                    {5 x2 U8 `+ f7 j4 Z+ K
                            fresult += b1[jj] * b2[jj];
    ' m4 \  S' x! x                }
    ! \+ _% w0 ^+ E5 _" {. U                */5 W7 C; b) G, r9 B$ u

    $ D6 K0 z; \9 {+ R                //Method - 4   202s' T1 M* l, c# h+ D2 L
                    /*
      P5 [$ x& m. r  o  O: d                for (int jj = 0; jj < N; jj++)6 ~: G1 m' w% H& ]6 K
                    {
    0 h/ M4 N* G0 M/ l                        
    ' X' X2 e) \' I                }) ^, I/ {% e# t6 f: h0 }) \' d
                    */5 R7 w( S, v" o+ b' F% y( b' C
                    //comment out all methods, N=100000  202s                9 G! W+ N. U' x$ T8 r& {& t. d  P
            }- ~7 }+ O. ~8 D- V
    6 O( d3 z; S: n0 s/ j5 l
            delete []b1;
    & x3 w0 c6 l# y, V( e5 e, \! b        delete []b2;
    + _' |6 {6 C; ]  j5 C
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?5 B& }2 o0 `% Y, \' O9 e7 a% @$ c

    ! ?6 S, ], M1 W8 {你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
      v% I; _' W+ i  u2 B
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    7 v  d# U3 {9 `" ?/ Z# ^- h瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    3 q: w6 Q: `$ _" O7 `
      i! z8 ?9 F6 c: [5 T* r你第二个试验里面的j在循环里面又重新定义 ...
    0 k+ s2 ], @8 E2 y0 Q- w7 X. P
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 W# [4 b: z, }0 N2 g3 a: A

    2 L4 b% ~+ O4 Y  s不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:166 ^0 i, I) O) C& w( X
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' X+ Z6 j; {& z5 Q; t& n' C2 Z! J  x2 m" R1 O4 B
    不和它 ...

    % m  x$ L/ \( x1 I1 V: _- A+ a* m0 O9 y
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    7 C/ v: z" [% I4 I后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    5 R) C6 @/ T6 i! Z" p4 M' H% B5 uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    7 J& ]& t# S, \/ y{
    / C; e+ m' `7 t        comp temp, xtimesy;
    ( p3 f, L5 B( N1 z
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。+ y  `* @) A; S+ O+ T+ Q
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?: j) H; h( |$ V0 v- O
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-24 14:40 , Processed in 0.078375 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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