设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?" Y7 f: z8 r. n. @% E! k1 b

    / a$ E2 _" ]* j% ^* b$ A自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ' B. J6 q# ^8 j6 a5 a
    " G( S! @! r4 `  c! x速度优化问题真的很有意思啊。$ ?3 A; q+ `6 f+ S

    3 e. M7 f- j. I. O# p- K欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    & X0 w4 o: V! {& M把代码贴上来看看?" t5 v3 ^6 `) c2 p( p" Y- P+ W
    . Z0 b/ i2 D. }% D
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 ) \- a9 f, o- h6 }; T  E
    数值分析 发表于 2022-9-24 23:04
    ' G1 y& J5 N6 O( O5 ~拉下来?拉多少?
    / P( J& C' S0 c" B# g把代码贴上来看看?
    6 d; L/ q$ ]" O

    * O/ x0 y6 x# Y% L) [( Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  m4 ]: K9 ~. J
    {
    7 x  Q4 j! [+ r% a1 m9 \, S        comp temp, xtimesy;
    " _- W3 q* a! c, M5 F        xtimesy.re = 0;
    $ F. [4 }+ e: O  V  p" h1 A        xtimesy.im = 0;/ l5 w# }. _- v4 c( Q. n2 r
            int j0 = lenB - 1;! T0 r4 J- R- i8 M
            int    i, j, i1, reali;8 L' o+ H) V% ]
            if (lenA % 2 == 1)
    9 |0 p% Y* r/ n: _                reali = lenA + 1;
    5 B; r6 P" p. R" U        else
    7 J) ]: y: ^0 R: |                reali = lenA;
    / X) {6 ]. S) T; x+ a+ ]        reali /= 2;
    5 q  |1 j' y" i0 H: X  x; Z
    - P6 ^' p3 B, Z" G- O        int nconv = reali + lenB;5 F" Y" A0 O- m% f1 {' V% Q' H
            //#pragma omp parallel for
    ) N" j, ^( V, t* @8 w6 u5 `        for (i = reali; i < nconv; i++)
    1 A* ]; n1 x/ }        {
    7 U2 _: B3 m5 A% h                temp.re = 0;
    $ \) y9 w4 Y) X7 w; R+ @1 \                temp.im = 0;
    . L4 g6 E; N2 T5 t2 e. S  z0 L+ H                i1 = i;7 y. Q1 i* Z+ z: `: K* D' Q4 L
                    for (j = j0; j >= 0; j--)$ z! `1 w- H0 R4 m
                    {
    5 u! w6 e, C! n" Y" ]) l& j                        /* floating date operation */
    , D, C+ y0 m# V                }
    4 C; B& h) y: l$ Q/ t! P
            }* `$ F5 u& E& a* W+ ]
    }
    5 }$ Z/ \7 L& o5 R1 ]
    ( B5 }2 h. }% i6 f: ~  d* Ixcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    6 t% w5 e5 h6 m" T6 d0 V, y9 }' n1 P1 }* h6 ~# E% \4 c
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。3 }& L' \( q# r6 s! O
    现在call xcorr 100次,耗时78s.; b# M8 t& c, `7 O

    3 h% x' I! p' a( ^如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    0 L% @* P5 @  o- Z4 ~7 Y; M0 T" A) \
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33" Z. {/ N4 F- b
    Maybe Debug mode?
    / P: g! F# x9 C1 M$ ^; n

    3 Y! T- O: L6 o$ k% f  c+ t5 G不应该,看我上面的回复。
      y$ ~. i+ M( I* K
    ( a, z+ b8 r5 N我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ! H# s# o3 `+ Z8 F
    雷达 发表于 2022-9-24 23:54  `* b; P% C$ N/ u, B, ?# I+ r- N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" V( D0 M% {% {# |6 e
    {$ t5 e! B  x0 w- W% ]) ~
            comp temp, xtimesy;
    - P) i6 [9 y5 H9 Z

    % q: x: N# x# G( ~+ d这个不是这么比的吧。。。
    7 p+ W+ w# n% S4 Z% a: T6 F6 i. z# e+ G5 Z! w% m* e
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    1 t/ N* {; t& J* B6 M, ~) N* D1 l
      {0 \& `+ ?$ |" Y! ?& B而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    + I( ?" |* F  i+ q! _9 ~
    数值分析 发表于 2022-9-25 00:20
    / `2 _, z0 w  C这个不是这么比的吧。。。
    ; H( i: q0 o5 W% s" S- a. b& j, y3 P3 l( W# H/ h$ L
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    , Y; t2 Z0 y* \9 P* H7 ?

    , x1 T% y0 l; y* R- e: U有道理。7 C. f- n2 i( h; b: j2 p# N9 C+ c/ [
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。. _- i+ I; R4 n8 Z
    * G$ R8 e; s7 J) ~/ r. C' `
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    , n: j6 r) O) R1 r0 K+ W) `有道理。2 Z8 W, m1 G* m# F6 Q+ h+ z
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ( m3 ^2 i, t, }& @
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    5 J2 W: M# ^$ O' Q5 |% {) L0 m9 yWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    ( E% A' J9 v# R这个不是这么比的吧。。。
    ( c" q& l- B' g/ j& K$ ]2 q  N# L; r" T* B+ s  b( L! [6 A
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    , N/ e# a/ J; j- y8 a/ ^0 y  |) P& ?9 @: j5 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 编辑 7 o/ n2 K6 F1 P
    沉宝 发表于 2022-9-25 01:48! a+ N6 S9 K- @! L' G6 f
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    0 v7 b7 Q" U5 v' t6 {" V5 r
    ( B1 ~% w$ D3 o' t5 y7 s是的,兄台说的对。0 Q% o  |. C( a9 j4 i/ }

    9 R" ]: V! S. n' p0 ?, @/ s其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。2 o/ h" Z. G% a
    8 C6 g, D: b% n2 h# A2 ~4 P
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。+ c9 h* I7 S- c

    ) ~; I( o( a' y+ V比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。" X) t% {1 H# [4 G; P

    ' b+ m- j! H, C7 y, d6 i当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 + E4 q( T, c8 K8 r& d$ }
    沉宝 发表于 2022-9-25 01:27+ V7 P* C$ W7 ]' W) M
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    6 T2 P- l& @- L( g. O9 W0 A6 j; N8 K' k9 @! G
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ' V# ], U5 R! Y1 U9 T- x( X! m
    - Y- @( O8 a8 y7 c* D) f我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    2 p7 |: j% i( N9 W3 P9 w1 p( u( w7 M又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    3 }  Q* p# w7 q. S) c. P3 E
    时间差一倍的结果可以接受。$ g/ w% H3 @# E9 y2 w) e
    ( {. e& l+ r! b- a
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    * @: Z/ [$ e# g; W; g- I6 Q" {
    雷达 发表于 2022-9-25 04:47$ B4 M  R6 W9 d8 Y5 u4 i: Z
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    # P% M) w2 p9 |, O1 Q( S0 k' b

    5 y7 V! @* _0 n- U$ m7 X7 M5 k- X' g! c
    ! M3 @/ V. S& ]$ X4 M% n6 {
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    4 D4 U2 B0 s) A
    数值分析 发表于 2022-9-25 14:58  X; j  {& Z8 W( J  `' t
    能不能把这个也贴上来,看看和上一个有什么不同?
    - w) E7 s& C1 t2 H/ |7 I
    理了理思路,重新做了一个测试。
    3 ]0 R; q* s$ E3 Z* c做了两个 vector 和 两个 float *, 都长 100000
    / a1 A9 s6 n) q  f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* X. R7 G* g: l$ ]* d0 K% _3 H- e

    ( Q: A9 e5 B2 a$ O1 u内循环试了4种方法,, s" b+ h/ j) C' P
    1. 直接调用 vector inner_product 247s
    ! Y' X: K, _* H! F' o( y8 e: |2. vector 循环点乘累加 237s" X% `) u% F5 I8 ?
    3. float * 循环点乘累加 204s; ]3 Z9 d. X- t
    4. 空循环 100000 次 202s
    - O) k5 w* c# V- ^" f* N2 {4 m5 k: h- z' y0 R: O! P
    不做内循环 200s
    ' v, x# i# j) p+ D$ p# v1 C/ ^" F+ F- u
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 `8 b+ N6 S- {. K) O
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 Z! Y" _6 F4 x9 w" J4 r
    ; o% f7 u5 ~3 R7 v0 ~' g8 X2 E
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    : k5 K4 _' W4 O+ z: w- x8 L1 U0 }1 z% J2 P* P5 J  q
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 _/ |& M6 q/ j: }

    ; j8 K2 z& w3 ^) L8 q
            std::vector < float > vec1(N);4 v+ G7 o0 T3 H
            std::vector < float > vec2(N);
    0 ~& ]; F! B. L1 c1 L        float* b1 = new float[N];
    8 p" S% @* Z% l) }        float* b2 = new float[N];
    + R! C) H7 z6 M0 s  B- ^6 k
    5 |* q' ?( |/ @$ X& j  T$ t        for (int j = 0; j < 6000; j++)
    0 f  s3 _/ }  }, S9 R. |+ P8 k1 K        {$ ?% G3 i2 |1 K! z) w! a9 p$ q% K
                    std::generate(vec1.begin(), vec1.end(), []() {. P4 M+ b- T$ y# s) T* Z8 V. x( L( _5 G
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;  ?- ]2 E% e/ Z9 W+ W: U1 r: _% [
                            });
    ' F5 X6 \* A8 f7 X; c1 x% x% Q: O3 K7 U6 }
                    std::generate(vec2.begin(), vec2.end(), []() {8 s! m1 L( }, L9 [3 p7 Z% h
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ ~3 v. w" L- E' f/ b  B: r; v
                            });. ?* R% A  p3 J; W) _3 ~' [: v

    5 d+ F3 V) ?2 i                for (size_t jj = 0; jj < vec1.size(); jj++); u. c' a# E  Y1 z; \( p
                    {
    / C% D) n! u* Q+ W                        b1[jj] = vec1[jj];1 [. {6 j* k7 z" m8 y
                    }
      ?9 {0 S" h) |! `! e+ U" A0 @
    - R( |0 o( H& R" N7 }8 w7 f: U9 v                for (size_t jj = 0; jj < vec2.size(); jj++)
    9 W. X3 ~: t9 T6 G( B7 z# o& h                {
    ( d! u; }$ }" f7 {7 w; _                        b2[jj] = vec2[jj];. t' v7 ?2 w5 U, O) [- k
                    }( a# T: l/ U9 ]5 A5 E. W

    6 I0 A# s1 M1 I: g9 Y                //Method - 1  N=100000 247s  
    ) e0 J0 o. R- g! s3 X0 s) w                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* d5 q. [% Q2 x: k! t2 n
                                    5 h2 ~# D2 {5 [
                    //Method - 2  N=100000  237s
    ( ^6 h: d7 U5 Y! [8 V                /*; x( o+ l+ s" Y3 b$ r, H
                    for (int jj = 0; jj < N ; jj++)
    7 A( B& Q4 J, \/ |, F% q                {
    # p& r- Q5 x9 v( h. |6 d                        fresult += vec1[jj] * vec2[jj];
    1 D: s, W& t4 n0 {: q                }
    9 \0 s, Z; Q" G1 O                */
    6 k5 L5 S) c, x& X5 `- l                                
    . x8 L3 A8 z1 z                //Method - 3  N=100000 204s
    + R3 B: B9 K9 I( B' i7 p                /*. E+ i; a' Y' X8 u
                    for (int jj = 0; jj < N; jj++)
    ; ^0 F% b- y8 s4 A                {
    1 Q2 U' I, @3 _% e; h                        fresult += b1[jj] * b2[jj];1 t$ g5 s! j* y; D
                    }
    3 Z* U0 P) W, H6 J                */& x) a2 X0 h4 @7 e" S# z2 d* L

    # G/ p: a5 S& r6 v0 ]: p8 ]$ n1 _5 c                //Method - 4   202s
    " u; w+ a9 G1 K- c# R* n                /*
    8 G. o/ ~* w, r' x- ?, F& i                for (int jj = 0; jj < N; jj++)
    $ B8 x, k7 f. F                {3 g/ C7 L7 K" F( L) V
                            
    . }3 p: {3 w5 E$ d5 R; L                }# S- P9 E8 d0 H6 E
                    */; Y' v3 s/ _/ }' y2 q
                    //comment out all methods, N=100000  202s                / r- e" V, x2 w! h: J! o
            }
    4 ?' N) H1 h2 u3 D& @
      w# v" I, a' V; _        delete []b1;
    + {$ @8 c# C) ^7 b1 D. ^        delete []b2;
    1 V2 E% Y, g$ [& r3 E
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    % P# E& g8 @% ]6 x  n, I& G* d7 F3 `. a3 {. `# `8 f: A
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?2 M, u+ v' C* d! w9 j$ M7 B+ m  N
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    " Q0 c5 G6 B6 Y+ }瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?, F" j4 I2 b5 x! G2 d$ Z7 C7 S
    " P' a' o/ I/ V
    你第二个试验里面的j在循环里面又重新定义 ...
    ' n! o8 p5 @" m4 U9 L: h+ B2 V
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL$ Z0 @1 j2 M) Z  {
    $ O# y$ q( n+ `2 g+ `
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    + \8 _6 p4 }# g+ m. X- g# F" [- r内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL0 o5 {% p' x7 R/ Z, ]
    : x& {* i4 Z! f; D
    不和它 ...
      u4 e& I% s( |  [6 D
    # R; Y) v; B: F# h1 X, ~6 Y8 f
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。) P  }: m- }5 R2 y& _  f
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54, H, ?2 z* b+ L- D( d5 {% Z
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)% G; n$ x2 A% H1 N3 z
    {
    ' g; i" z4 z3 \& Y& z; }* _        comp temp, xtimesy;
    # }2 Q- I, y- w. i
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。3 L: [- b( Q6 d0 B
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?" X, n# k9 i5 l' z7 _. f" R
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-12 09:17 , Processed in 0.120790 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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