设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?/ y) E1 H) f+ @; U

    3 J3 l" b- z# P# y* t: l- E自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。% L1 X$ P6 }0 @- X  z' L9 T" x- A- ]
    ; f1 v  I4 u9 |/ _% l
    速度优化问题真的很有意思啊。
    2 g9 s' Q+ p+ n8 H6 W1 w! d3 K8 v# r, g9 z% D0 y' B
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?' H' x1 ?* m- `  j
    把代码贴上来看看?
    , E  R/ G7 F& _9 A  J' x
    " G5 c+ D1 {$ l- g% U8 Z难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 8 [3 j6 u: \- g5 {& e
    数值分析 发表于 2022-9-24 23:04
    ' O" m1 g" R0 z: ]% d8 Q. @拉下来?拉多少?
    3 o, \4 R* o9 z/ r, d4 t6 x% ~把代码贴上来看看?

    ( {3 [+ x. Z2 B' B% ~7 \$ u7 B, O1 _  m; V3 z
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  l* ]. v! R; s1 x/ Y: z
    {9 u- E; v+ R# Q. h. p4 `
            comp temp, xtimesy;
    , v' r6 H6 G" J( x# @' ^        xtimesy.re = 0;  D' z/ L6 r; O" y& Z6 f
            xtimesy.im = 0;9 y# X# K) p3 u
            int j0 = lenB - 1;
    & K$ r: i  q4 K( b" B+ j        int    i, j, i1, reali;7 F  p* ]0 K0 h2 W: D' N2 i# K
            if (lenA % 2 == 1)
    9 `7 U. ]7 M. x7 e- y6 a$ _, H                reali = lenA + 1;
    9 x, r% O4 C, ], V) |7 m        else# b: y- ?$ V* v$ @, I: A
                    reali = lenA;- N! j$ J9 t( a( z% w# H5 z5 g
            reali /= 2;6 G/ L! q! L" w* d7 Y5 |
    . F" i3 B7 U2 i* K
            int nconv = reali + lenB;
    " \, _6 A" V' w! U- n; r        //#pragma omp parallel for
    4 Y. n8 K  m" i. W1 Y        for (i = reali; i < nconv; i++)+ \4 j& a1 b( w! i! j& e
            {
    6 R1 g" K3 t4 e4 p# K1 Y" o                temp.re = 0;
    $ `) h6 d0 v" ~1 f- J* v                temp.im = 0;
    ! a3 w( D) _' T& [5 s                i1 = i;
    ! h( S% ?1 Y  q2 L                for (j = j0; j >= 0; j--)- R/ n9 j( h( N# n
                    {
    6 R1 A* k4 p6 w                        /* floating date operation */# D- w) @; k0 V$ ^$ f
                    }

    $ a- X4 W- s& M5 e        }6 X, d" J8 R6 W6 w& O) I
    }
    & v: W0 H* t; B1 p+ m6 g
    , t& ?" o# m5 yxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    # i9 X. q% L- N& F& g# E/ B1 a: K
    $ @8 W0 Y+ y9 V2 o+ P) _红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。9 W6 N6 s2 k. ?" r, \) E
    现在call xcorr 100次,耗时78s.' F& f8 e) N$ p( \, ]# k1 R

    9 P& K- Z. Y- C0 j+ C& u+ K# @如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    6 R8 G5 t+ u+ f5 |$ ?
    + G% M' O' x4 ]. p- T$ \; `
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    - Y! r  S4 b: H+ h! B. S4 H: eMaybe Debug mode?
    1 l$ m) Z: `9 h) p
    # w0 S# P) n7 k+ z/ t
    不应该,看我上面的回复。
    " g6 `  q) \; b' O, r3 H- q$ U7 o4 L1 W
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    4 E: Z: i, ^, p" Z2 G# I, y. ?  V
    雷达 发表于 2022-9-24 23:54! i9 x  y' W& d7 A% }
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 k' }+ W- a  g, V
    {
    ( M. J/ Z. p" J, j5 t        comp temp, xtimesy;
    / w- \  ~. Z# F3 P
    8 k% @9 t/ z9 `$ V( g" [7 t* P
    这个不是这么比的吧。。。0 m! M  D8 \; }, ~; S

    $ Z" B6 d, L- Y3 R5 y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。1 P) y- _' }  R' O- i- z
    & F2 V( ]: [1 _% Z8 x( ]
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    4 v2 h  j3 b* f0 E% w0 a
    数值分析 发表于 2022-9-25 00:20
    5 D% l3 R* z1 d3 v4 U' k* S+ e5 I这个不是这么比的吧。。。
    8 S7 X+ _& I; U) Y/ r* V! @5 N% n0 P! o$ X( e# r# x
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 t- \( c, K9 d6 N) P# |

    ; y3 f8 E% `8 x有道理。
    $ n8 s3 d  ^. P- b所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。0 `7 o% R  s9 Q5 \, n/ v4 B

    0 b5 R) `- D2 w& |6 A. P" b我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:468 Q8 `) s$ `! w+ b1 X7 i  z4 S( {# ?
    有道理。* }$ N! C; j3 T: }
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    * k" E& w4 T7 F0 m# l$ q/ n你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    & Y) Y1 d8 |5 CWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    2 [$ j4 q% e1 {7 H这个不是这么比的吧。。。
    " ~' F. w! ]* F3 G  D$ I) a2 ?: r1 X& k. i
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    6 [0 ~$ F; x  l. n% a# H1 z2 h0 U$ z4 g8 h* T% \1 _
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    . U1 s6 G, e( H
    沉宝 发表于 2022-9-25 01:483 K) M# f- B2 U
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    * ?' V! n# X2 y" n) A9 ]$ o+ m
    ' E+ Q( o: N' f
    是的,兄台说的对。" |8 f9 W  g: x" m- U

    0 V& o9 P& @8 [& z* l6 F其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。: x4 j5 y, r# ]; m/ A

    6 f+ f* s( S  N( z, ~0 X- e! _: B雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    % P2 x% p, Q9 f3 c3 G  u- n1 D- @- N7 ]+ e: Z# |: Q0 p
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。' t, X( Q- g4 U# c/ q1 O; S

    # C, T) G3 _& B当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    - f% J5 ~9 D% a7 B' \
    沉宝 发表于 2022-9-25 01:27
    0 k' g4 v, ?0 r  a- o& X+ ^2 p你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ! K$ u3 {2 Z2 O0 O! c& Q4 U  p
    / [: f: a# d  `
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。# X( P! f7 N/ M  g2 A
    4 v6 p8 H/ E. U1 Z" m0 y
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ) g0 _. \% y# g5 h又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % E8 z/ l5 q# k) l' |时间差一倍的结果可以接受。
    3 X( ?$ \+ g) A+ ]; j: Q' G+ u, K9 ~; y5 B
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 % N& x+ G/ m" H. b: Y$ c
    雷达 发表于 2022-9-25 04:47
    ( M$ ^5 _' a5 C' ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
      e& b5 Y" B; R9 d" d. C
    . P  |* W) X+ S& s( i' F2 D
    & ]: ?, R- S, `! I" u% q9 k

    ( P2 ~$ K+ j; n. p% S能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 [& E, x, P$ i  Q: W' ?& u
    数值分析 发表于 2022-9-25 14:58
    7 |7 F4 g7 k! R8 L$ G能不能把这个也贴上来,看看和上一个有什么不同?
    9 A$ L" i$ B" n' D7 F# p  @
    理了理思路,重新做了一个测试。/ v; |( m9 Z% e" E/ R6 {& z" f( w, \
    做了两个 vector 和 两个 float *, 都长 100000( i# a" H: L, }$ y7 w' ~' ^, m* R: ~' ^
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& _  o9 _0 T$ q1 w
    4 Q% J0 r6 C) v" n( N$ O
    内循环试了4种方法,
    " n4 `4 F, c; ?: ?1. 直接调用 vector inner_product 247s 4 l" \" D! w5 f# n, [
    2. vector 循环点乘累加 237s0 @0 S% g8 t9 F0 n. f
    3. float * 循环点乘累加 204s, W6 o, z5 Q5 V3 ^2 {) p, b
    4. 空循环 100000 次 202s
    , f- d/ f- \( R( C1 l% e
    * N, E$ G. f( n; d不做内循环 200s
    " a1 A  G- O/ e: v( k; k1 a* ^) ~3 m7 B; a$ C7 P0 M3 v
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。* d! k- h- x8 \
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 J8 P6 u$ u9 W( q
    + S0 L$ B$ f' b1 r% M- R/ I* v
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 b9 n& t2 g0 ]; L# X- H- x: X) Z
    7 Y: F" W- i* k# d' D9 ~9 o' W
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)7 m1 W4 k+ A* Y" U. k/ z
    4 [; c/ @; v/ _
            std::vector < float > vec1(N);% Z. a3 ~0 P1 K9 L$ p
            std::vector < float > vec2(N);, m( U2 e1 L5 ?9 w5 y, L; y
            float* b1 = new float[N];
    1 A" E/ t% A2 j2 _        float* b2 = new float[N];0 O  m% e. C# w8 F/ D' i
    ! E# Z# L2 J( _2 x* u5 T
            for (int j = 0; j < 6000; j++)
    - |+ L  O' v$ W! q6 E. B. Z  Y        {- f6 Y9 k8 L+ L8 t
                    std::generate(vec1.begin(), vec1.end(), []() {
    + F' k! [( z" O4 I1 z" \% I& k                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    3 g& ]6 m6 M5 W$ u: c                        });3 D1 g0 d) O  E" ]. O1 l. G
    * t2 t2 e7 p& b
                    std::generate(vec2.begin(), vec2.end(), []() {
    % ~# m% i0 g3 o  J9 p                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ( L: B" v/ ^) I4 p* C                        });
    7 o. u& D5 l4 a5 Z
    # z0 E; }0 c6 v( T                for (size_t jj = 0; jj < vec1.size(); jj++)7 X$ A8 Z: s' u) x! s7 |
                    {5 e% t1 @- k7 u/ K
                            b1[jj] = vec1[jj];' _; r) b( n- q( k
                    }3 R( b5 Y3 w0 D

    % h. Z. W2 j+ |  C8 k                for (size_t jj = 0; jj < vec2.size(); jj++)0 e; o! X' |1 t# e4 b8 H' _( w+ d
                    {
    0 C  A* Y/ P5 s  U                        b2[jj] = vec2[jj];
    3 ~# d" b) h9 r: G1 x; y* T                }+ h$ T, o: V4 w3 p( V/ J( p% C

    ! m* k7 d% O9 z! L                //Method - 1  N=100000 247s  
    + t. O6 Z) e" P6 ^: |6 J( k                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);$ h# G, i7 T( h, k) U. H5 w
                                    
    - ?6 T% i6 h* z2 L$ {$ `; k& `                //Method - 2  N=100000  237s
    2 L* D+ V! H7 `7 o# c0 Z                /*
    4 g, u# N% X5 ]3 ?% W; C                for (int jj = 0; jj < N ; jj++)
    ; y* N6 x- P* g% S, A8 j  d                {
      D4 Y# ~# [6 t# o                        fresult += vec1[jj] * vec2[jj];4 Z! u& b. X2 ]4 L8 Y& f
                    }+ U# R* I+ K$ W7 I" `% M
                    */' Y8 e; j5 O! h2 I& i( e
                                    $ O, A9 p, g* J. B' m; d
                    //Method - 3  N=100000 204s
    8 M3 F% X: m" J                /*% R% \/ d( q: H  @" C1 r3 @& \
                    for (int jj = 0; jj < N; jj++)
    - K; x9 B% ~6 U                {
    ' @5 p8 f' V) s# j. q                        fresult += b1[jj] * b2[jj];
    ' p: d% B0 }7 g$ `) c2 P  Z. r9 V                }2 ^5 `9 W2 Q9 \& }
                    */, x& K: L2 i3 h3 b

    4 r: G- e, w8 e                //Method - 4   202s
    ' C7 X& `* s, x                /*# G# E3 O& O2 R: `4 O5 w
                    for (int jj = 0; jj < N; jj++)
    4 v6 \/ s* V! q  _" [                {
    - t" r( S/ {* M' ]9 e+ f* Y2 U- f                        
      P( ]% i9 p9 P                }
      R( G+ t2 e/ r& k" g' @                */! c4 i6 R( }* S# A+ O& \4 O3 E
                    //comment out all methods, N=100000  202s                $ w0 Y8 _1 k. M* u
            }5 y, S" _+ k- w& d5 d4 O5 M

    & U# Q. l  g( z/ p# V5 \6 k, P2 D        delete []b1;2 C6 x. X( l3 U# L9 B+ K6 V
            delete []b2;

    4 w( M3 k/ e  l/ _' r( p
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ( ^8 \+ a2 L: m3 E: q2 s/ H/ N& N# N3 E+ r% l* [
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?! q" f; I- I: O1 i9 t
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
      ]; z) B; q' g* e' K* R瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 |" M" M4 V. T6 |% k- |9 @2 d) [: T" s) d
    你第二个试验里面的j在循环里面又重新定义 ...

    3 `; p& J! l( t4 U- H/ I; j1 c内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL' r; G* j# X2 O8 P8 ?# |% e

    ) [3 `7 d7 B# Y6 v" h- u% @. [+ B2 x不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:168 c: ^" }  H  k0 x5 i" |
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) H$ w8 a' f7 ]! \# H0 h) P! T4 W0 X) v! R' S, i+ {( G
    不和它 ...
    7 y6 n' S" Y: E. [, O0 Q

    ) A/ |: Z1 @" A6 u不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。$ S1 W, p- w) O
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ' p; V5 q; P4 A1 Uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 J) a. [3 B8 b! O% L3 a
    {- w& {0 W0 L1 u9 ~9 ?
            comp temp, xtimesy;

    * L% |( \) i/ n8 j$ P. Z1 ?$ E这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ! v. q+ W. h( T内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?; f* k5 V5 Z! H2 Y* E  n1 V
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

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

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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