设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    7 q! E6 C8 ?+ I% |2 d' ]/ m7 h1 V" f8 G- P6 \3 a# b
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。6 S* Y- i' A/ b- L  Z* e
    ; s. f+ J# _3 a- y
    速度优化问题真的很有意思啊。3 f' ?5 {0 K1 R: Z6 E: s

    - i# u% ?9 ^; z. t9 u: D欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    : C1 e- t  [# W8 O  }- ]" y. p6 M把代码贴上来看看?
    3 V+ c! u% N/ z1 F0 t
    # T) r5 j3 |, I# _难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    4 I9 L4 n% K4 o  }& O$ B8 Q( p
    数值分析 发表于 2022-9-24 23:04# M8 L! T2 i, h
    拉下来?拉多少?5 y% i; |1 T4 d3 v
    把代码贴上来看看?
    + P) S/ P3 g# L
    $ g4 X4 T7 s1 S' I/ G
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( [  @# E% H. d/ p% B
    {
    6 H  E# Y, `- j  J$ `# t        comp temp, xtimesy;
    1 F4 L+ d( C: C( q# L  M4 o3 w        xtimesy.re = 0;
    , ^% P7 c. n7 Z        xtimesy.im = 0;
    + H7 v; _+ `% P/ Z: }7 @& D        int j0 = lenB - 1;
    ' G. X& h4 \) J3 I: M( ^' P$ G        int    i, j, i1, reali;8 l1 g" G  v7 c0 R, s+ m
            if (lenA % 2 == 1)
    0 w# O0 J4 ?- j3 Q  \                reali = lenA + 1;
    + u& {5 U1 F( \# q& f* n        else. Z, V6 ^) b* |- q4 O/ b1 w
                    reali = lenA;
    0 B5 L9 W) J* k! w  u        reali /= 2;
    2 a5 o1 D; g9 N& n8 Q: h4 [# ~8 v, `+ E" R
            int nconv = reali + lenB;
    ) P' F, p6 H, n# T# x9 N% J! B$ I        //#pragma omp parallel for
    ) ?8 o) o. G6 Z# i; Q+ L        for (i = reali; i < nconv; i++)8 u6 W* j$ A/ T# a/ h
            {
    0 D' \# z' n8 k9 `* ]                temp.re = 0;; J& [& k) U6 Q+ Z0 b6 \* ]
                    temp.im = 0;7 n) v% X4 h- _3 r8 {) u7 Z
                    i1 = i;" c8 L; i$ [6 k0 f3 M5 _
                    for (j = j0; j >= 0; j--)0 t2 o; {2 E5 a! M9 S
                    {: I6 a% Z5 p  C9 ?; `
                            /* floating date operation */
    * j- n' a( t9 O2 G* J$ w% g/ X                }

    & u) p5 H% p/ ]9 q        }
    3 w; S% x+ A8 M( i! m}
    1 }7 S/ j8 E6 G/ E. Z6 ~) m  s  L; v6 p$ z! o
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    / j, @; O# U2 s' Z# V  u$ x
      J; \( I! E* ?& S红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。: N& c  _' u6 R
    现在call xcorr 100次,耗时78s.# u9 T0 ]6 t1 P
    6 T: G: l5 {, n; G5 K6 z; j! q
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ; N. r4 \+ y+ j5 T# p6 l0 l" ]7 I+ R/ w0 ^+ l
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:331 s3 x+ D" _5 y# p( k% D
    Maybe Debug mode?
    5 H  ~. H1 _( [) \( J
    $ D% p* D$ g- H
    不应该,看我上面的回复。
    ; B8 d. s2 @9 o  @2 E$ a6 v$ u
    2 n6 z6 B# T! w0 ~' k5 i% m我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    & `- d3 V4 Z9 d7 s
    雷达 发表于 2022-9-24 23:54
    ! L5 @+ O0 ?% A& j- V- y+ _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' Z* A0 @* o2 S" N" n: J{, P/ ?/ O) ^& z' c$ s
            comp temp, xtimesy;

    . W( X+ X/ I7 q9 |. Z  |0 D* c" p3 U  j1 w& I
    这个不是这么比的吧。。。6 C1 z0 K' |" D, J

    " y: g( J' ]8 r3 S% B4 z) S您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : N9 R0 f- o1 v3 t) X3 L& E8 X
    - W( i0 q2 V6 [而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    6 B  g0 U& G* t& u* m/ e- u" Q
    数值分析 发表于 2022-9-25 00:20
    4 e  |1 w5 }0 K8 B1 U/ h这个不是这么比的吧。。。+ t" a2 f2 G* k
    ( K) k! T6 Z* D, v& q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 \+ H/ `  l; ~, v* F1 q9 ^7 ?5 W3 [
    - L9 m. y" P- U" m8 L2 T. D
    有道理。
    + @( ], j6 o( M8 ^/ i所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。# \/ j5 d0 i$ d& }$ u9 U6 J
    + X5 f* @8 o( S/ z
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46. Q' \  E' W/ O  }* Q2 ]5 G
    有道理。
    % i- c( o/ F, x* W/ ^% x. Z$ X: o所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    * j6 _0 S! d* w' H" m3 ^& L! ?
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多! @+ w  G- F* B0 Q5 F: O
    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
    # V1 k9 m, X/ S8 K# R这个不是这么比的吧。。。
    6 x8 i6 \5 @: B0 P. k9 Q+ }! C0 V
    & B, s* U1 X" o. b: Q5 y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    7 l" s( F5 X0 R: K& q3 z5 e5 \

    ) l* O' g  l# i现在的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 编辑 ) w* n& ^& y8 x: L& \
    沉宝 发表于 2022-9-25 01:48
    . \: q1 z" [, r) T8 e7 \现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

      A+ y  P2 @) H8 w( x7 A7 u6 H+ k# f; K. ~; q
    是的,兄台说的对。( e9 K( Q+ n7 s' h& u
    1 H' H. \  ~. k$ H( M7 z; h
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。2 i( `1 n1 k' `; ~

    / ~* S; h" Z0 ]2 I雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。. _& m' C/ O. z& X- S) _. j: @' A6 C$ J
    4 C" E0 u2 U0 r4 ?
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。; m* e% c% ]4 R* u1 r

    * `4 L8 c- z' k" Z当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    " Z8 m, T. j& O) ~' m% j! |
    沉宝 发表于 2022-9-25 01:270 N0 H% z1 k7 T/ B* Y6 A! y
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    , A* f0 `' j8 @- f+ B; G4 u; x
    ) c6 W% W/ f1 n又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    # q+ @$ V5 G- \, S' q. U3 ^
    # n" u* ?  r" ]5 `( R我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    , x+ r/ Y  Z+ \+ w又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    . r. ]  p/ d# |
    时间差一倍的结果可以接受。
      g4 K  @& {5 [8 H# Z, y8 G. l7 q" k, L# W7 c4 _% @9 X" ?3 k
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    $ j( T. k3 Q4 d% L, G& n: B  n
    雷达 发表于 2022-9-25 04:47
    . n( D7 B7 o4 W* o又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 T$ V; V: W+ j1 \: D

    6 X+ T3 h! S# h" F" O. k. A* t3 ?  h; k$ [" L" ]
    2 E; }- @1 C# S4 a' i+ q" Q
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 / L" C$ B4 ?# K/ K- n9 C* u0 f
    数值分析 发表于 2022-9-25 14:587 L2 X  ?4 k8 W6 U& T) h2 }
    能不能把这个也贴上来,看看和上一个有什么不同?
    : C& A3 q2 H# A0 n+ f
    理了理思路,重新做了一个测试。
    / g  O% V  v& t1 H, y做了两个 vector 和 两个 float *, 都长 100000
    $ n$ n. w+ \( ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    - A1 n- K3 C  C) t5 `) a. F+ w% k6 v/ O2 N) a, y- X
    内循环试了4种方法,7 P: I0 q0 M& i5 ?
    1. 直接调用 vector inner_product 247s 1 S3 q& K6 r) t; Q& y6 ^
    2. vector 循环点乘累加 237s
    " T% j. n! R2 r( J2 `" D( ^, V3. float * 循环点乘累加 204s
    % s$ U5 {& ^0 j' }6 R" k5 Q* l4. 空循环 100000 次 202s# f7 Q6 S4 {. n8 L/ e
    - S7 |1 ^' J3 o  ]) r; y
    不做内循环 200s
    % _  b: P$ U& B6 y5 ]$ D; R) r4 [5 r3 Z( c, ^
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    + T: B0 u3 h5 [. ?: d2 ]另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    4 ]" n2 K9 F$ W- F* _: q+ c* @; U
    ' L4 f# g2 j. O! q/ H至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ q! D: X% O! X+ m; Z1 |
    , q/ V- O* A) k" J- A
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    , N- \, N0 S% P6 K
    , L" K% z: c9 G; Z- }2 `/ l
            std::vector < float > vec1(N);
    ' z' N$ r# J1 S& i, a' P+ M        std::vector < float > vec2(N);8 t* e  O# v  u6 H3 t0 V# E
            float* b1 = new float[N];
    7 U( |' T% K" K  t+ i, U6 l        float* b2 = new float[N];- U9 L9 h; I* f

    1 J( {+ J5 G, |" |& O, P        for (int j = 0; j < 6000; j++)
    ( N1 _. _) k2 l5 h0 F1 [6 T. ~+ r( K        {2 O/ {/ }" n& F
                    std::generate(vec1.begin(), vec1.end(), []() {
    $ l! N% E1 C9 L- s; e                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    % u+ I7 K: e& |, T: T/ ]                        });1 ^& o6 R; H' j/ H% ]0 H( B, K

    # M/ B% G8 g5 B! g                std::generate(vec2.begin(), vec2.end(), []() {
    ' W% l  y9 x# O4 w. s& B                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ; U1 w- J. s4 F( q  X; L/ T                        });
    & n8 j. X- C' X, h1 d; W( d! X# E# r4 q2 U6 B. ?
                    for (size_t jj = 0; jj < vec1.size(); jj++)  x) }9 I3 D$ N% |
                    {
    ; L8 X5 Y/ U9 U                        b1[jj] = vec1[jj];
    7 g) [  _' G; L1 Y                }6 y! D! o% ^& Y; x0 o6 a

    8 f1 q8 N" d" C( b                for (size_t jj = 0; jj < vec2.size(); jj++)
    * D: ?# L0 k& s3 F/ _1 S                {
    2 v' f3 y5 i( b                        b2[jj] = vec2[jj];; y% B$ j% K& T' W6 \; A$ n% @
                    }; \6 {5 [9 u2 Q) a  d) L

    " E1 D$ }) M  W/ a! I, W* x) Y                //Method - 1  N=100000 247s  , p. X) L1 a0 g2 n) t
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ W0 q+ q4 [2 G: X# c+ Q
                                    
    4 k$ `* ~! p( J                //Method - 2  N=100000  237s
    " F# {/ K9 G" U6 o+ l; ]5 _                /*
    : n8 [! l8 `. h- h                for (int jj = 0; jj < N ; jj++): L) O& S1 Z, M' N
                    {
    : l% E. M# [% y8 ~  u' ~( V                        fresult += vec1[jj] * vec2[jj];
    5 X! p0 _4 z8 M                }; Y! U: b3 x, ~2 ~9 z* C2 B
                    */1 n; h& ~; ^* i  b; ~! ^- A0 E7 b
                                    : O/ y) c8 e) I3 f1 u3 w
                    //Method - 3  N=100000 204s
      A! i0 I' S6 x: O" E                /*5 [) y0 O% D  {: P" c
                    for (int jj = 0; jj < N; jj++)
    9 V* i8 w, R- P                {
    . Z6 E9 g/ b9 i                        fresult += b1[jj] * b2[jj];6 m) s& Q3 |4 P  E& _
                    }  A- g1 Y! t5 C5 I% G
                    */7 B5 Y' D. k) l3 ?' X% S

    1 Z2 h: I: h0 l! ~; W/ \                //Method - 4   202s
    ' m5 Q. R0 p& u5 O. i. \) @8 s( N                /*
    . z  G# B4 a9 l2 }                for (int jj = 0; jj < N; jj++)
    3 l/ O. t# ?! b" P                {$ q$ O  l4 E9 H$ f
                            
    8 ]/ h1 K8 U9 o& `7 j; H8 u# [                }
    * p# V! z+ y4 A; E                */& ?6 `; E2 P" c9 E1 ~& Q( D
                    //comment out all methods, N=100000  202s                % D2 i$ j9 d* [3 ?& l
            }7 I2 z2 r0 Z: l, i( U5 E
    ' R! S) w8 E( r" t* [6 i2 K2 M
            delete []b1;, u( v# J+ E; N$ A" W6 A4 k
            delete []b2;

    ! a4 t9 H- N- W' r) ~! t: F
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    # ?& \  @$ D9 h6 H4 m
    1 K. o$ b2 v) L6 J  t) b) _你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 R/ M; @% }' w! H1 I- M/ A
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
      \3 E9 o4 l1 g7 [, u" O瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 w  Q. w- U# p+ o! H; `) J3 F# X
    7 p0 ~2 y+ O. y你第二个试验里面的j在循环里面又重新定义 ...

    4 X- v8 Z0 q- }7 Z* n内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ |: u$ C! O+ b2 A' D
    * l$ u! v7 D6 d8 o8 i- w6 L
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # m& k( j5 ?2 E; @% m: F内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    6 d/ @& u' t6 L6 k5 |) I' y  w
    7 z7 S) d! k$ _3 I不和它 ...
    1 {* o. s: ^: \) |
    0 X+ b8 j' X! k
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。8 f" f1 [* r0 ]% S- q# P6 S
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:544 }4 c; E6 C8 c! w
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; Q& w# }) b+ ^8 }* S% H{
    - ~  z! c9 O) q  A" p" i. g        comp temp, xtimesy;

    / z3 I2 x* j6 A  T" V0 q, Z这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    4 v& K0 V- n) ]) d5 Z0 y) w内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    7 c+ E2 H/ O3 P/ O2 {VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-4 12:00 , Processed in 0.096697 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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