设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    9 R  ^, n$ G& m# B' t$ ^% e) C( O( }+ ?1 r
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。9 f% b9 n% g0 e6 C4 j$ x& ]$ U0 {
      v$ H) t' M; B
    速度优化问题真的很有意思啊。5 M( c' O* M! B" @& v& _! U8 s

    " `* X4 w( k3 x6 W7 d5 C+ L欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?$ F$ j4 G$ }. n" D- s
    把代码贴上来看看?
    : \6 d# U! }# v8 F5 X+ a  l3 g
    4 F, G0 D* k( Y! {难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    $ Y2 _- H: }; l1 X4 H
    数值分析 发表于 2022-9-24 23:040 E, Z5 C# V  v7 g4 e! P& W
    拉下来?拉多少?* T9 u/ H6 }; x, u, C; Q. B* i
    把代码贴上来看看?
    9 N) n- @6 H+ d$ z% `

    : q! u$ Y) V0 H: ?void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + O: ?! @  p) q) b+ a- O{
    ) F& O/ k0 J$ u) ?5 g        comp temp, xtimesy;) `" d: @' L  x: B2 |: a/ M
            xtimesy.re = 0;
    : P- |  D: ?# {$ u( b        xtimesy.im = 0;0 a: B, j* R; |& `
            int j0 = lenB - 1;
    4 u$ a9 b- Y4 h, t2 Q        int    i, j, i1, reali;
    8 h+ ?$ i: k% x9 O        if (lenA % 2 == 1)
    ; }. y- l4 C5 }* q0 ]                reali = lenA + 1;
    9 C; v, Y0 e1 D& `, L( H. X/ C        else
    9 T5 k: m" ~; I# c" J& H                reali = lenA;0 `# L  m6 z: j
            reali /= 2;' g/ C6 \3 i4 {& ~4 f5 Z

    & {- c8 \2 x9 T1 Z        int nconv = reali + lenB;
    3 ~9 M  B2 W7 D  q9 q+ t3 `        //#pragma omp parallel for
    + m$ \% M' g/ \/ q        for (i = reali; i < nconv; i++)
    + [- Y8 ~, m0 N        {
    " d# I8 H% q! s2 j0 y7 g  v: d  f( F" q                temp.re = 0;
    # U. P3 Y$ n  I4 f% I* k                temp.im = 0;2 d) x' _" m$ p; Q5 l
                    i1 = i;
    & r8 z+ M9 s+ [, S8 }9 t                for (j = j0; j >= 0; j--)
    0 f+ a" V7 a. Q% k                {9 u3 `8 _: v* C, ~
                            /* floating date operation */8 Q- Y; V( t0 k. d  Q
                    }

      {& e, ?  {8 R. z) N! l6 q( H        }
    # e4 ~! ?' c* ?: [' }0 ?+ ?  y}. @% D3 E1 F: t2 ~0 L4 n" l
    ) H0 n" r! b3 b% G9 n
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    " ~$ K7 B5 }+ k$ f+ _% i
    - l. x; i( U% k; h* a: Z& S# `. D红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    : K  ]* W$ I% B" `5 _* @现在call xcorr 100次,耗时78s.
    & `: l5 O: Y5 I  y  j, X( l9 N, g, S' W
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. & x+ V/ s& v" c+ b( K
    ! T3 Q: R) p4 B2 u' Z- x
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33) _. W% F( P! J* {$ Q/ X, {
    Maybe Debug mode?

    ) C+ E6 N7 }  K' E: M3 o% ]9 Z6 ]- R) F5 M/ K
    不应该,看我上面的回复。7 B( ~) n+ J3 P0 j  g# Z

    + T7 X4 k. y3 ]我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    7 u2 R0 A9 c/ D6 Q! X3 w( }% {
    雷达 发表于 2022-9-24 23:54
    + e( @8 s/ _" V9 X( n4 @! avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      Z5 F! t; t2 S{4 D- M, ?/ M# ?8 e) I* n0 t8 G* {
            comp temp, xtimesy;

    . y# {8 W5 E7 b, C5 x
    6 W1 G: D& u% y, H- b8 k& i1 y这个不是这么比的吧。。。# r$ x& ~$ x3 _/ |0 g; S( ^' e
    0 {$ G5 P% i  ~7 W
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。3 ?4 _  O1 S+ g% k

    4 [6 G& Z/ \* ^/ o. ?" U) h而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ( m) U! e9 b" u9 I
    数值分析 发表于 2022-9-25 00:20
    . i; f! ?* l6 |" O' J- q这个不是这么比的吧。。。1 |8 }$ s( Q% W- V$ s
    & k8 Q* q5 E8 _
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' {) L8 e- v9 l1 v, p  v
    & m6 N0 H# e' r7 v$ k7 d
    有道理。& v( a8 n8 J# F; A% M
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    : b# I% u4 h' R) @# a
    + p: X7 V7 l7 l我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46( c6 J  V% e6 K8 n0 H
    有道理。
    & F$ D7 h8 B- A所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    " a$ C( S& c, r1 S, n3 Y. r你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    3 l5 k5 N) r% ]5 r6 L2 pWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20& J. [$ S: t1 N7 Z
    这个不是这么比的吧。。。
    / Z$ j7 I) g( U2 q* Y) F4 @) F  I, B8 V( Y; |! W" P
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    : G8 l# \# {* j1 _4 a) x
    3 _2 |% }9 i" @1 K* E7 S
    现在的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 编辑 1 d3 L2 w7 v% M3 t6 P
    沉宝 发表于 2022-9-25 01:48
    7 p9 O% [: w7 \现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    1 p4 m8 R+ t2 g+ E( N

    * n6 C& E( P& b5 n$ j) a" d是的,兄台说的对。
    9 d0 K1 v4 O- W' w0 L
    ! C0 s& N, C2 e8 N& {- O0 X其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。: y- q' n3 z, ^; T( c! J6 j6 T# ]

    6 h9 Y/ Z- j2 E5 i) h雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。) l. a- i  h8 f% c- B# @
    $ R1 z$ j& d1 a
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    9 Q( f+ B* a- {& S, h$ \5 O7 R& X% Z  t6 b) c: A, C
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 4 o# ~3 {! o2 W: ^, ?( P
    沉宝 发表于 2022-9-25 01:27
    ! P9 Y' B3 N1 r; w: i6 X' c你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    9 r# `& m/ }! M) W
    : j- p9 p- Y9 S/ J又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。# l0 W* J& ~8 a3 _
    4 y9 s+ T: ~9 ]3 P' d/ C
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47. S; [( y0 U! u; S, C' w" J2 L
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % [9 u3 C" @' ?1 W- J# g6 c时间差一倍的结果可以接受。
    6 n( n. \: ]/ j7 M+ |& q0 g7 t2 n( Y2 M& ~5 y1 @
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    : }* t) g- Q$ b) x3 ^3 r) f
    雷达 发表于 2022-9-25 04:47. {7 \- g! U; F! D
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    . Z8 ^6 S: ~: E8 ?) {. a: W
    & v! L1 d5 |+ q( x
    0 K# q; x. D' E* O

      Q4 o+ [. W" a' m* H5 f; h1 ?能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    8 O9 c# Z: R; c  @- {5 E& v
    数值分析 发表于 2022-9-25 14:584 K3 [3 B3 W  J" R6 z
    能不能把这个也贴上来,看看和上一个有什么不同?
    ) ^% @7 a& I$ d6 b: @0 @/ S1 @4 Y
    理了理思路,重新做了一个测试。' ]: n6 g' N9 J, p6 p( O+ D$ c
    做了两个 vector 和 两个 float *, 都长 100000
    : q9 L; V0 c- K5 M' A6 t外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ S, M$ ?! l, {8 M9 `) t5 s& t- R

    . t* i- X2 `- I  u2 [/ p内循环试了4种方法,( G( S7 `3 m. H7 [
    1. 直接调用 vector inner_product 247s
    * F! q# U" ]5 Q( Q" Q2. vector 循环点乘累加 237s8 W, M+ H+ Q9 t5 F" I! {5 ^3 M5 l
    3. float * 循环点乘累加 204s
    3 j) q- P" v8 q3 Z- k# c4. 空循环 100000 次 202s7 \  A, m, ]* C" g' T; U) k* S
    # I# D* J$ S: \4 a2 }% Y0 c* N
    不做内循环 200s
    7 L3 }4 U% t: A  l; c0 O' j7 T, l( {+ R2 L: W& A% i; M! e
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    5 p6 l% U. i6 R" T, n0 y( }$ N另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    , Y. w8 Q3 N0 h
    2 P+ m2 E: M5 d至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ' p" ?# a" z6 q: O/ J7 ^6 m7 i( ~* `1 v9 p$ {
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)) Z0 s) P- [+ j* U8 `! L8 `  \
    , v3 X8 v7 O0 h2 }; u
            std::vector < float > vec1(N);
    : W5 w& L1 m0 A' }  B. \, Q1 B        std::vector < float > vec2(N);- a' F0 I! I# T( C1 a: o0 l
            float* b1 = new float[N];
    $ z6 d0 b" |& @) d0 K+ S; g        float* b2 = new float[N];' _& Q# k3 Z% w" N

    8 `5 r  v- t3 k7 E5 ]8 o  o        for (int j = 0; j < 6000; j++)
    $ g2 Y% M3 i( X7 ^; @" [0 o        {
    / |& F9 t6 P/ |2 z/ q3 v                std::generate(vec1.begin(), vec1.end(), []() {9 m0 }, ~7 c, {7 ?% R( d8 A% F
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ; G6 z4 g5 N( S0 H                        });
    1 x( x) W  F! o+ L. P6 E, \
    8 w3 s- Y% E2 P                std::generate(vec2.begin(), vec2.end(), []() {
    1 X: Z  B: H; y, F3 G0 R5 {                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ' m' R4 J" R- e                        });+ A3 V, \# g& j9 O# K

    ; i+ |" I$ o# v; ^* O                for (size_t jj = 0; jj < vec1.size(); jj++)# [! {! L3 m  Q* r/ r
                    {
    8 h- ?( X/ M8 j8 s. ]  L                        b1[jj] = vec1[jj];, E* a5 J$ n3 H& n
                    }
    2 `  \9 Y$ X7 e/ Z) P* i
    $ u, _' r  E, M1 W6 R                for (size_t jj = 0; jj < vec2.size(); jj++)
    6 w2 n2 u. W; Z/ q* k                {
    7 ]+ U7 ?9 }9 R- x" |& R% x% d5 A                        b2[jj] = vec2[jj];
    , u, d' l3 ~& f  `% {                }
    0 C8 _3 n1 c/ g5 T' R; V+ U: [. S+ h9 B' S
                    //Method - 1  N=100000 247s  
    ( D/ K4 M- s$ l! C4 R$ [  P                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    3 m5 l+ K% D( W3 L. [. n' c                                
    : i, @4 p; S  b$ |                //Method - 2  N=100000  237s
    ' o& k! p9 ^, c  E% c                /*! i! Y4 Y" ~* \5 V4 w, Q
                    for (int jj = 0; jj < N ; jj++)2 `$ @  l  g. J3 L! x& D- V
                    {% u- V. S, c  X! q
                            fresult += vec1[jj] * vec2[jj];
    + P, @, n5 Q9 s6 f6 Z/ P                }
    5 f7 ^$ @8 x9 F& c                */
    ; e' {: r9 i# L) Q7 Z; z5 t9 }                                0 A5 P  K" u8 m
                    //Method - 3  N=100000 204s; K/ O0 g7 s1 M3 W! ~
                    /*, a) c# }& p; ^8 C, ]# Z" }
                    for (int jj = 0; jj < N; jj++)
    * T+ q  K  U0 S# N6 H# o! d& C                {
    ; q  N# \: G) ?* i. b/ }# C6 x: N                        fresult += b1[jj] * b2[jj];
    ) X: h3 Z% l5 R                }
    ! l- p$ x/ T" u8 l                */& y: B8 C2 [3 q2 M

    & y: U+ ]5 f  m                //Method - 4   202s  ~! H1 }* H# X. a
                    /*
    , D4 H1 [- J# o$ f                for (int jj = 0; jj < N; jj++)
    + O7 N6 L: j5 T1 P: G. b- z                {
    * [+ c" u! Q3 J$ F3 Q8 g8 ]5 {+ ^, O                        2 l9 m' Q9 ^7 Y+ U) L
                    }8 t( ]4 ^1 o1 r) N$ b
                    */
    - i& N. S6 V+ P" d7 ?                //comment out all methods, N=100000  202s                - F. T+ T7 j1 H, F7 K# D
            }/ L3 r5 d; s! ]3 U( U
    # C3 I. p5 c- C# i
            delete []b1;$ n( Z1 {# X7 B, Q
            delete []b2;

    & H9 A% |' Y1 k. J
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% F# |6 n9 b2 k% \% K  G* a: j
    ; H9 O, u% u( i: [% M! x
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    7 j  B' b  m# `& I3 x6 n! r
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    : a+ D7 e( O% z/ ^0 q7 g瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 A( R$ S1 J% g3 x! X" E2 i5 P* e7 R  Y9 ?) O
    你第二个试验里面的j在循环里面又重新定义 ...
    . \7 S2 I5 w; D7 C
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 Y! Q* u4 b  X2 Y9 ?
    % M$ G* \* M! t1 n不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # H; O' ?+ ^% H7 q5 m: R$ D内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & H/ C) B- b/ @) f3 a& C
    ' Q5 r$ J- G: p# D不和它 ...

    , C2 v" N0 i! k
    # @. D7 R7 k5 D8 j$ J- [不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。3 C, w* t: q1 C( R8 T! i: t
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    + B/ i* O# c4 Q* tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " [3 q* v1 Y5 f6 l9 H% _{) ~: H, ~' e1 X% i( l
            comp temp, xtimesy;
    1 U' m' f# B  M3 s- o9 y8 L: z* l; U/ M
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。0 x0 E+ x1 `: Y1 O3 c
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?3 E' h" z6 ^5 x
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-27 22:20 , Processed in 0.075801 second(s), 24 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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