设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?. E  |" r- M9 Q4 t
    - S- [+ ]/ h! k
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    6 J/ W/ I4 V) ]: W$ v1 t! M0 D% E
    ! X* G8 j+ r: \# o速度优化问题真的很有意思啊。
    $ r3 F) n/ e: v" |9 ^% G1 L1 U* r
    & f9 c+ l" _5 H" s( }9 }/ M欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    * C- U5 Q+ B" Y2 E- t" ]把代码贴上来看看?
    7 n; }  d  l- g& ]6 u. D( Q' t0 a6 o9 g3 [
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    " ]5 w* {6 Y% y! \3 @' e" W% E8 {
    数值分析 发表于 2022-9-24 23:04" E  D$ P+ V7 q$ \8 |2 G
    拉下来?拉多少?
    - j; m! K8 I; i- n把代码贴上来看看?
    2 ?) F1 }# o; }/ R  m
    ( ~8 p( d9 v% S% ^* B/ K& a* s
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) Y; y2 r' a2 r; ~  V8 @0 W9 N2 {{9 ]2 Q  L1 l/ {! ?- Y* p( N* Y
            comp temp, xtimesy;& A* @) s8 x" D+ ?( `& w9 q5 G
            xtimesy.re = 0;
    , h# j7 p" V2 V/ _; G, w! k        xtimesy.im = 0;! U7 W: ?5 M2 c* U+ L, y, Y
            int j0 = lenB - 1;' U% I" x0 W! X# G
            int    i, j, i1, reali;
    4 L* j/ ]- Z; ~& y# D: G        if (lenA % 2 == 1)! u9 y3 l" B' }+ E8 I/ K
                    reali = lenA + 1;
    + [* \2 U& D1 M8 I& R- B        else. p1 a/ E$ |" |3 H$ K  Y" O& R9 r
                    reali = lenA;
    2 Q- A2 O5 f6 z        reali /= 2;
    $ z" x, f6 g, a6 |& H! Y2 i1 M0 A
    & T* E* h# s2 T3 D. O; P        int nconv = reali + lenB;
    % p! d4 F6 v5 w, q, p        //#pragma omp parallel for3 `, a2 d* g0 X  m
            for (i = reali; i < nconv; i++)
      ]1 F1 a1 f" k1 C) w4 Y0 ^9 K2 t        {
    2 |1 N9 w& r6 Z  G% P                temp.re = 0;
    & q* s# }- w/ E9 o) j                temp.im = 0;
    ; B0 U  |: k7 t) p: ~4 w8 R                i1 = i;
    ( O- {+ `& A, G  w                for (j = j0; j >= 0; j--)% n9 p. o! s8 ^9 C5 @
                    {' I, P" c9 L+ A& E2 p: T
                            /* floating date operation */
    0 G( b# f8 @, _$ H/ @" u                }

    ! \1 g- F! R, ]5 W( k        }
    4 }5 w7 _, J  u: N}* `' l8 L- q/ x* l. E

    8 ^8 I9 f* q/ [2 n9 {; nxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样# @% w; i7 g2 |* X% j$ X; k) `* l

    - R9 F2 R# U7 J( Q5 t红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。2 d3 M4 D5 J  e/ ?% z
    现在call xcorr 100次,耗时78s.: l; m* B4 P% \3 [4 F

    6 P2 m. f) }+ j. p% ], e如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ! o) T2 f- H" k6 W
    * }3 F' r3 R: D7 ^$ b6 {
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33+ M( e+ h9 I" ~# R' d
    Maybe Debug mode?
    % J0 K9 V$ p% k! T5 c$ {
    6 }' r8 d, _2 J  \
    不应该,看我上面的回复。
      C3 e9 ^2 t6 s+ y) F$ O3 d* D! C" r* ^
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 # I% |0 Z4 I5 F
    雷达 发表于 2022-9-24 23:54% A) S" E& C% L4 o! X: I" A0 T& a
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      u. U# Z# V) q& s{
    5 a' _% B2 l0 g5 U( Y+ X        comp temp, xtimesy;

    / x. Q5 W) I" s( a
    , @& v/ Z/ |+ W; \这个不是这么比的吧。。。% b" M; C; u# ]7 E
    3 O" a! L4 X' H" s
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 k/ l1 G# i1 ?2 U5 c2 b; `' i. e8 u+ K& y
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 * B) o% g# z* i# g* N4 n# ]
    数值分析 发表于 2022-9-25 00:20
      m9 \, [; L# x$ Y这个不是这么比的吧。。。
    # ]  a7 F5 C& E* F8 }
    / A' K7 U; x6 g' J+ F0 U/ G您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    2 c. ^5 s$ \( y  o5 a7 Z- B2 p

    & U3 f' ^& g. [, G有道理。
    5 g+ d; G$ i& y2 |/ T" f  f$ l8 U所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ t; L% H3 w3 L. q/ L! v
    : i/ v: D) q! {+ R我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46: @& ?! j& E6 h$ t
    有道理。! I. y& m4 v8 R* V7 V( `
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    5 c/ r0 j% C& B" h! g2 v你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多. R& }( `. ~3 P3 M; M3 R
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    7 Q' b( P& a/ w7 o9 U这个不是这么比的吧。。。
    % {  x5 F9 {) k9 ~; e8 m* W" ]9 o5 v8 [$ N1 B5 ?1 L
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    1 m, f+ x) w# |/ S# j4 O
    ! }, w  f6 d1 t- f  Y2 D现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    7 o& l  J7 e$ T0 @8 {
    沉宝 发表于 2022-9-25 01:48
    % H- b$ q6 K+ g9 v" t; ?8 {4 ?9 B0 @现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    : D$ B7 n& S+ v

    ; M$ E5 g) H9 U是的,兄台说的对。* Y  o) F% L! [' l8 j' C
    : p5 |+ H( w) \* I- J
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
      D1 `' ?, ?- ^1 ^* I) D# g
    + q" u2 ^; g0 V$ s; G5 W' o# n雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    & y+ V& i7 A) G$ a: c
    & `- x6 S! F4 d比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    5 N) P' T, E3 k; s, Q$ x) \) L! @" Q! Q# R! x+ l9 F! V
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    & N! k2 R. E1 Q! S
    沉宝 发表于 2022-9-25 01:27
    : U2 S# q; P4 R, Z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    4 ~1 k5 _1 G% y. `) R' L: S5 g. O
    ! O2 [, J; M; F! S3 }+ l
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    5 _) M1 U( U) Q) s4 x( [, [2 z+ @- K) |  }( u. Z
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    0 m2 w% `# \4 G1 P2 U又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    , ]& [9 m3 Q2 r
    时间差一倍的结果可以接受。' s5 D! G1 x+ _0 [+ B% O
    & w# G3 s; B/ R& g6 ~% ^4 N
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1646 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 8 e+ h1 o; T; a$ ~2 y4 g5 @& r
    雷达 发表于 2022-9-25 04:47
    6 B7 f1 i3 v# D8 T又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 _5 K# Y% ^% Q
    ! t! k8 A) i+ a6 q6 V' P5 ~; k" P3 _# Z, \! {+ l
    5 }1 ]. u, G$ q9 t
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 * y' r6 L$ u6 o4 t
    数值分析 发表于 2022-9-25 14:584 p9 o9 w: p( f7 P
    能不能把这个也贴上来,看看和上一个有什么不同?

    5 s" J1 T  [) G( U理了理思路,重新做了一个测试。
    # q5 v' x: R4 Q做了两个 vector 和 两个 float *, 都长 100000. c" _% X& }/ g3 Y  I8 M1 g, g
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    , J* M( [9 J6 o' r+ @( U
    % Q5 q1 ^. }" o+ R( X' U) W& a# k内循环试了4种方法,; F. y$ ?: k( u4 R6 y" M$ P9 ^2 A
    1. 直接调用 vector inner_product 247s 7 m* X" k: v' R3 {1 ~( J
    2. vector 循环点乘累加 237s
    " N+ {( E& X! G( t3. float * 循环点乘累加 204s
    % h! Z' P  e. B6 Q' T& _% ^9 E- v4. 空循环 100000 次 202s/ ?% q& D% x; w

    4 i8 G) h4 v4 R6 ]1 c# y- w不做内循环 200s9 g) m8 g- j2 A9 @' z
    ) C; p' f! y6 \' p4 v
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    + D) L, W9 I- m; V, r3 S! ?% {另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- y* D% L6 t, q+ `1 L$ r
    5 Y* m: o& {2 q& L
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* P+ v! T0 H' Z0 b! v4 J; {

    9 U  d( Y. M) b6 O; `0 h(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL). I  l" l1 w1 A) u
    & j/ b2 }) G1 q" t1 y
            std::vector < float > vec1(N);, H% R2 S5 z2 H, x9 W5 p
            std::vector < float > vec2(N);
    7 W; E9 \0 n1 E9 o" _# [' j+ F        float* b1 = new float[N];4 j: Z: k8 }) h. S
            float* b2 = new float[N];
    0 Y" l$ G+ z9 W/ R4 H& C7 [5 |  E* w4 e! D! Q7 X4 q
            for (int j = 0; j < 6000; j++)
    " z/ w; f2 D% R        {
    7 B$ y3 X4 m& E% V                std::generate(vec1.begin(), vec1.end(), []() {
    # Z5 B* x, D5 @  ^                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 M8 g: L$ m8 c2 T
                            });
    . X& D' Z$ ~2 ^/ F4 Q- J- b* `1 f3 ]' N  a
    9 J) y! x; J/ G) q# \                std::generate(vec2.begin(), vec2.end(), []() {
    . P1 F5 F( }! m) A, Z3 P                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 c4 s. H6 ^9 f" m6 U
                            });
    6 u0 x! d# V- Q1 `; {; W5 T
    ! c: x, n) U4 r# D- d                for (size_t jj = 0; jj < vec1.size(); jj++). o& x3 a& s4 T4 j( ~+ q
                    {
      ]5 n/ N8 I1 |4 D                        b1[jj] = vec1[jj];
    5 n; |0 N( X5 u                }% u, t' U/ q& i! T1 t5 ?- K

    . V, G- k+ o9 R6 l4 S( I                for (size_t jj = 0; jj < vec2.size(); jj++)
    - h6 i7 p7 M" I  T                {: A9 y! ?8 p5 u8 u6 t2 `2 K) o* f
                            b2[jj] = vec2[jj];1 D3 R- \4 b) f# k% _! e, \
                    }. |; g$ t% F3 P& q

    ! y, t# z1 V* ?: }2 z% _1 @                //Method - 1  N=100000 247s  ' t  ]! W0 x/ U( r- z2 x
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    3 N' v, Z3 H9 m4 Z. Y2 h                                & a, `& o: w3 U+ S- g
                    //Method - 2  N=100000  237s8 |; k( T: O7 H, v& F/ F. @, Q) @# T
                    /*  i$ E; i. y6 r0 `- z
                    for (int jj = 0; jj < N ; jj++)8 r- O5 ^( x: _, k1 K
                    {
    , `( m& F/ N+ n; ?# A2 ^, _& b- Q                        fresult += vec1[jj] * vec2[jj];
    . c, S& A  o  Y0 W) n                }+ C7 y& ]( B  O, j; g
                    */
    : n1 o3 e3 I! u. ~7 c                                
    ; |3 X8 E- l+ l# D                //Method - 3  N=100000 204s
    1 i, r5 m$ \$ ]$ n' ^  @+ q                /*
    ; ^% T* k$ p0 r3 i0 H                for (int jj = 0; jj < N; jj++)' s6 G/ P# V2 n0 A% ?
                    {
    & y- n$ j" A& ?. C                        fresult += b1[jj] * b2[jj];$ p: D) t3 o( I4 b. \4 \, [
                    }2 r% L# P1 j8 n+ j  c& d  O
                    *// a$ Y; [! G1 W8 ?

    $ l$ {) ^% z* o$ [3 P                //Method - 4   202s
    % D: b5 y+ m- G1 h$ P+ g                /*9 k' d# T0 N& {
                    for (int jj = 0; jj < N; jj++)
    & T  F- i1 k* A# v: [                {9 ^5 v% W& T2 @
                            " ~' g+ [9 P" b2 o7 @2 m+ Y
                    }
    1 D* t& M& p8 ~$ v6 L8 F  H8 u                */+ K, y- d& o4 G7 Y8 }, S% h
                    //comment out all methods, N=100000  202s                ) o, q% b  T" t2 l7 s
            }
    ; B8 z0 x6 N# b; V9 y- g
    1 g! c" n3 m5 x' e# T6 v        delete []b1;* d: g/ q$ Y) C# g5 ^0 _5 G, H
            delete []b2;

    7 P( y. T6 `* X" W4 U* n7 @6 S
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 y/ P3 v: n3 K& J' ]" J" ]+ Q% v$ c# L# S
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    + ?4 p5 |+ d: R& ~- Q/ D
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15/ Y/ ~% X% s) W- U
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 ]2 u9 X/ f) W# Q' I% q2 j2 q8 L+ u2 r  F- C
    你第二个试验里面的j在循环里面又重新定义 ...

    6 \# h& p1 F6 @* ^) a4 [" e) ?; P内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL' C1 M* }' ~6 s. v6 T, e# m
    . O) f5 j6 c- n8 Z
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    * k9 e' X" J$ J内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL5 p, k) J$ K- N+ v! L. {
    , E  T+ E1 R7 N, s% e/ @
    不和它 ...
    / N  h. z! m$ [, i8 V
    0 S$ N# ~& ?% j% M( E5 Z; t
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。/ r0 Y. H" g* \. k- [. Q
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:540 S6 H3 q/ H" |' {6 s% l$ h* g
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + o* Y* [0 k: ^{
    - D% Z+ K$ w* V8 M+ ]        comp temp, xtimesy;
    4 Q. o: D! i2 U6 _: `# G
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。* u) `0 k! z, l* `2 k4 g  N' ^6 [% ~
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?! Q- i5 n/ k: H- X/ m" p3 |* i: }: D
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-5-4 20:32 , Processed in 0.050066 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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