设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?5 k3 y% C+ w+ a3 |# P; h

    ( p; y! l& d; j7 l8 z; M% {自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。; T6 O' B2 s5 F1 ~" z8 X9 q2 j

    # q. q$ U( y. x" D. }7 F' ], l速度优化问题真的很有意思啊。
    9 W, b9 A# a% F) X( }  Q4 p. V2 m
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?; ?  T; D3 d* w/ r/ o
    把代码贴上来看看?2 Y0 v% g1 h2 d6 ]9 O# |

    - e; o2 c9 [: n  n8 |% Z% F9 h难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 , [& i& }( t) p1 U+ i# P: r* c  C
    数值分析 发表于 2022-9-24 23:04! h( P0 s/ C( D5 S* t5 x1 f1 D
    拉下来?拉多少?# l' c: b4 H3 R& ]6 t5 g& e
    把代码贴上来看看?
    + m4 |5 M( C0 O8 E

    ! y4 ^- r/ b- m: o. N/ F$ B$ ]void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 P: \% g% F3 e7 J{" r5 a4 ^, e, L) f- T5 Z
            comp temp, xtimesy;4 k. f  d: d$ y$ S
            xtimesy.re = 0;
    " n: Y9 q4 E& \/ q        xtimesy.im = 0;1 `! R2 j3 f, I) o
            int j0 = lenB - 1;2 O7 B2 r3 g4 _* L
            int    i, j, i1, reali;
    2 k4 m% g" C* Q  f# E3 G2 j        if (lenA % 2 == 1)
    ; y% u+ {4 l! o, N, g( U                reali = lenA + 1;
    5 E8 Q, P6 m+ |+ L2 g! i+ p        else0 N6 {$ K1 X7 g; V4 p7 e2 y6 B+ ]
                    reali = lenA;
    3 V+ x( l1 y) P4 T$ b        reali /= 2;
    2 g( B! l' _8 p) \
    : L- R& _$ H2 m( @        int nconv = reali + lenB;' X' q; D! a) v/ p$ T
            //#pragma omp parallel for/ z8 W) E# k5 s* R1 ^4 B
            for (i = reali; i < nconv; i++)# d+ d1 ^! H/ U
            {, X+ @6 b2 U5 }% S, S& T  A& l( ?
                    temp.re = 0;" d" J+ M+ n; {* ~6 b/ ^. D' K
                    temp.im = 0;% r  d- m, Q7 `8 o' V# M! X6 c. r* F
                    i1 = i;; [0 n) b- E  c9 i* ~
                    for (j = j0; j >= 0; j--)+ D8 l& h5 I1 `9 Q* l
                    {" A; L4 T$ i" L* s: D  K
                            /* floating date operation */
    4 D% j5 ^* g$ k! m8 {. o                }

    % l7 L, q0 K- K1 o3 c9 l# X        }
    9 w7 k, Y  y7 S}
    2 L* D% U- O3 @1 D( m. u1 H
      F1 N. `8 p1 u" Y1 _' dxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    # G# m! ]! e$ C! H# [! N  P- m2 v# _" R( j# E# U
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。0 k' C  L# c! t  N
    现在call xcorr 100次,耗时78s.6 g; Q! O% Q" a8 j& y

    0 \4 a) C* {! \( o如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 1 H; L4 {# K, O$ v& _, c2 N
    8 q4 d6 J  }" Q' `! O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ; V- {) N/ {& _  z  Q8 oMaybe Debug mode?
    : h( n9 f/ s, {# W- X3 f* a# M

    9 h3 O2 I. y9 h$ D3 y不应该,看我上面的回复。
    ! Q' b: d# p- E3 d, T7 W% s$ {- R3 J6 ]- a
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    2 S  H" g9 b# A% |) V
    雷达 发表于 2022-9-24 23:54( z' M# [' o8 `
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    2 ]5 }% M+ ?- N% U{, N  _9 l" u6 Q* w( j
            comp temp, xtimesy;
    5 u8 F$ u; \: Y1 s% w6 T% U

    1 b! L0 M6 u% L3 B9 k这个不是这么比的吧。。。' u' |! M) V) |
    . W$ Z8 l5 u2 `* |& V7 T# f
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。* B/ b2 U, m5 y" }' V' ]! z

    6 s0 v* U1 M2 Y! ^" ?. y  C+ ~而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    # V5 Q6 U" r4 q. p! }' e  t2 \
    数值分析 发表于 2022-9-25 00:20) t) W, V5 W& I" l7 o5 c
    这个不是这么比的吧。。。
    : M7 U2 l5 {' h# ?  A* C; V1 {1 m" b
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' b3 O' z* `, H; O: b0 l- v

    6 N+ `$ ]$ ]1 E! O5 J6 p; ^9 G有道理。: U8 r1 C9 s! g4 C3 L& J5 i0 ?/ ?
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    % s" e- v; G0 O+ T3 h% c( R) v. i4 f+ {$ Y- I
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ' s* |$ y, c: \- {' X7 ]. D1 G有道理。
    2 D6 q; n8 e: e- a" z3 [% A4 n; q所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    / G$ J& w: r) \7 d7 g' [
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多, Q: W( P/ R$ _2 Y. c) y: X
    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: {' W1 z% W- ^( L2 I# a
    这个不是这么比的吧。。。
    " r; P. l: k6 q( d& y4 R& N& `
    . X7 C' L& z( [% y7 Q您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    : g7 k" g" f& a5 T
    # w# F- Y( l* `& N
    现在的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 编辑
    . l( C9 p5 ~. ?& b  T
    沉宝 发表于 2022-9-25 01:48. f; V. j* ^0 l0 g  A3 e% K
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    * t; X/ y. M: T; o) o
    : ~; f: G5 N% \是的,兄台说的对。
    5 J$ Q, f6 T) D* Z8 l. V
    " V) s# _& J2 E其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。2 X. y3 ?! A. X  i; v: P; C

    , }& W% l0 v, P* L雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。9 G0 ^' U7 X# m6 o

      n! E5 d6 |3 t. O! j# c8 v比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。) t) y* m0 K" T% ]
    1 Y: R, s4 X, f& V
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    9 V8 O# H( [: K3 l$ d
    沉宝 发表于 2022-9-25 01:27* w& r1 G+ V* B) b( Y. t
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    % m/ ?- t' ^: z  D3 g' U. h. p: v
    1 m4 L( L' }% a又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。+ z9 E" u! r  n  W

    7 ~/ f8 w7 D) Z/ z! I. u* u6 m我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    2 q7 Z7 m$ Y8 h: [又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 ]: l$ g' i; f: o! Q( d; \6 n
    时间差一倍的结果可以接受。0 N% @2 a9 m. C$ U( U9 t4 }- f4 e

    4 S8 d. @  T( Z. r3 [& s) q你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ; R( W4 B* W- P, [( O
    雷达 发表于 2022-9-25 04:474 c! v: Z9 J" w4 a6 A
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    6 B" f. ]1 H; \% x) w6 {1 y+ O
    % G2 n5 U$ p" A: C8 w$ u
    " {+ N' w6 \- t6 T8 D7 O; v5 O& P
    0 D& o& W- s* \: ~1 W3 t3 p( r1 k能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 + V; q( ~6 W# A8 z* f- I4 m
    数值分析 发表于 2022-9-25 14:58
    # ?) _. W' n2 @, D9 N能不能把这个也贴上来,看看和上一个有什么不同?

    : k( T+ I3 k# q% q理了理思路,重新做了一个测试。  Z" J7 F# f5 V1 M7 A" s
    做了两个 vector 和 两个 float *, 都长 100000; x: z( T7 i- e  w$ N! P1 Y4 d6 A
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    # Q/ x) X$ k  w& p
    / ~5 H/ X/ W# b1 |6 ], M内循环试了4种方法,: X: z, y, T0 w" o
    1. 直接调用 vector inner_product 247s ) B( O, B$ J% P
    2. vector 循环点乘累加 237s
    $ E6 a" r' [& U! P  K3 C/ K: u3. float * 循环点乘累加 204s
    ' ~/ t6 R7 \- U/ n5 W4. 空循环 100000 次 202s! W# C' r6 ~& S

    5 S% N7 s' b% k3 h, n不做内循环 200s
    ; y# l/ d) f. O( m1 s
    0 j; d  n% ]' ?: _- ]* O: \你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ' s4 B6 D$ M1 ?2 J. ]( f" b& l另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ) y* h. J/ ?) t6 Q- g+ `
    5 N+ f. u0 n' r# h: a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( Y$ V9 X0 i: A: O9 w
    9 ]  V' y8 Q9 s2 \
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    . v" c) S2 ^# E0 o! ?
    / J! u4 n# t3 a; F
            std::vector < float > vec1(N);
      k& M) l& ?/ \% i) T5 M  u        std::vector < float > vec2(N);/ p5 t0 [+ C( |8 j
            float* b1 = new float[N];
    " A: G: _2 u+ D3 ^9 k        float* b2 = new float[N];
      d" X, C3 y" L) T0 v7 n% j& w& l; i' b1 ^) h
            for (int j = 0; j < 6000; j++)
    : j+ x3 V+ h0 n9 p' n2 ^2 O4 j        {; t. z9 P; c5 n
                    std::generate(vec1.begin(), vec1.end(), []() {1 |3 |4 _$ u# Q7 i  z) M. I
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ' d; F+ @8 z- K! M( \# ?4 c) }                        });
    * P6 W* W4 }" n
    4 B; R0 E# H# [                std::generate(vec2.begin(), vec2.end(), []() {
    ( I3 P- j  `( @3 L# y9 \' R                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ! \- S1 _( i+ F0 T7 t                        });$ U; A; s. `- ?* k% r2 A3 T2 E" b
    1 Q: I6 [9 i( _6 q: a/ n
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    . R! o3 \5 _3 s0 _- h$ C                {3 ^, Y5 a8 @' Z2 q
                            b1[jj] = vec1[jj];( S4 P1 J* F$ L3 s6 R, X; _$ H, T
                    }
    ! ?/ r+ C. F  R( k; U4 E8 o2 z
    & |* V" t' ]) u0 @5 T  Y- b                for (size_t jj = 0; jj < vec2.size(); jj++)
    ) F7 Y) z, h* d' K1 g( r0 e                {
    " j  x! v% C- h- x' T                        b2[jj] = vec2[jj];
    # K8 I* J% [+ @4 J- F/ J% T                }
    : m# i9 M1 Q4 ?. O$ ^6 N7 G7 C5 C5 s( N: t
                    //Method - 1  N=100000 247s    @5 F, y- i8 F. v: m
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ' s1 }& `' t) ?9 Z' ?                                
    / l8 J9 A; V' k& S                //Method - 2  N=100000  237s
    0 G  B5 d* q0 A0 `; N" V                /*6 G' S/ d' g# z$ U
                    for (int jj = 0; jj < N ; jj++)
    7 j- ]0 G8 V0 n7 Y0 P9 t                {1 E' s- D9 v4 V
                            fresult += vec1[jj] * vec2[jj];& X% Z  `2 p, K* G; H  ]* ^) k; r2 @2 H
                    }
    2 {4 D2 R1 Y0 E+ p* L                */9 ?$ \! x. d) N( U) y
                                    
    9 V% Q: P0 C# X. K; p                //Method - 3  N=100000 204s
    ' Q' c/ E  M, [+ j                /*6 u6 }2 {! Y. D( S  L7 E
                    for (int jj = 0; jj < N; jj++)
    " d6 w& @  k  {7 E1 T. S                {
    / t0 \& n% i, J. k: l# F% p& y                        fresult += b1[jj] * b2[jj];
    5 I4 C& U* J8 w3 h( a4 ~# K5 A                }
      M$ R% e) [1 X, @3 O8 l8 Z6 G: I) `                */  {$ v* c. w$ z! Y% a: i! I

    & Q3 q5 V3 I. A% j) b  I3 L$ F                //Method - 4   202s) L5 H% M# A  e4 I* V; n
                    /*9 a5 `) T  x  A0 p- F8 ?
                    for (int jj = 0; jj < N; jj++); T' n. B& r5 ]$ r6 Q
                    {
    ; g8 U9 c% V5 u0 Q9 U                          S& X; U; j6 _  c
                    }
    # p! I1 l1 G2 M( F                */1 T4 L, _* L( ~1 T
                    //comment out all methods, N=100000  202s                3 P) `2 s. e5 v/ _( M( P
            }# S& C7 P( \  U. w
    % P5 w/ A9 {- V7 [
            delete []b1;
    % G/ U+ y$ K: h9 e        delete []b2;
    5 ~) w- g/ l2 S. a; K6 `2 w$ R+ M
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ' z9 q) d: A/ F$ y# ^& w% y; z# r' |4 c7 n  v$ q- ~
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?9 m8 l, O# ^1 q; ]2 i2 {* y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15+ _! c- B% {: ]3 K: \% E9 Q) U
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 w; B  y) L& `+ J' a! u6 j; K
    & A! s- B0 t+ {( |" k你第二个试验里面的j在循环里面又重新定义 ...
    ) W+ o2 e2 I! b; [% K& b$ \  M) J
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ g% e) D% l1 e5 u& ~% |
    + _% Q) D+ Y( ~1 J0 }- _5 n
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
      X" b/ s: `9 T内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    - B2 J' |  Z8 R' c, t
    ! N* H/ z* }" C& W* v" R: m不和它 ...
    9 L1 G6 S- e4 `$ x: s1 L( {

    9 {! I" Q* ?; S8 D1 [不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。: l) E) [! ~2 J& ^. |
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54, S. h: i% n; E; [
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ E: q6 K% U% t4 C4 ^
    {
    7 H9 x/ b* s4 j        comp temp, xtimesy;

    ' o: g2 h9 I" Z. e% w$ g" Q这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。8 f- W( N6 v$ k# |- j
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    % k$ L; C# `- L0 e+ w9 hVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-28 10:45 , Processed in 0.077395 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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