设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    + \: }4 {$ v# h2 ]; Q
    3 s+ x) P. n0 n) U自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    & J5 K6 f2 h3 p" h$ L* |! K- o5 q5 n" O( {; n! r$ [- h! o# f. l0 d
    速度优化问题真的很有意思啊。1 n0 K: h* c& W
    ) _6 m: n- b0 j% r" ~
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?6 m& e3 p* y1 D* i& W: O
    把代码贴上来看看?0 T) J& h5 P( ^. O9 N% `

    3 ]- M3 i0 B% g. G6 o! ]难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 9 I6 ]  g  K; a
    数值分析 发表于 2022-9-24 23:04
    - _; M6 G' L$ h+ c7 {6 b  u% G拉下来?拉多少?- U- ~& g4 Y* H8 t
    把代码贴上来看看?

    0 ~# j. ~9 i7 d  Z
    ; [% }( a7 {1 Q0 U8 \" {void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % C% D* U" r# F) h0 V+ v6 u{
    0 D2 R1 w0 `% I/ _/ R1 e- o        comp temp, xtimesy;
    ( ]; p: Y+ `2 [( ~        xtimesy.re = 0;
    ! t$ _6 C' B& D- H' S        xtimesy.im = 0;
    : h  W, }; J% ?/ B        int j0 = lenB - 1;6 U! ?, h9 `' }2 B6 L* }& P$ w
            int    i, j, i1, reali;" l) X) D3 g2 c  j3 s7 ?
            if (lenA % 2 == 1)
    $ D/ A; {( _. h- m- t- ^) h5 x                reali = lenA + 1;, B5 ]8 U# d& s' s) n# B$ y, f
            else
    , [3 f9 }& d. h2 h' |9 y                reali = lenA;
    % q9 E9 v9 z( v/ t) D0 P4 l" _        reali /= 2;# ^6 z. }9 L) ~8 b8 T

    " Q! E: e5 ]5 V( j        int nconv = reali + lenB;
    7 P* w9 g4 Y/ k8 h# p! ?" l: Y% Q        //#pragma omp parallel for$ j* y: b' \$ }
            for (i = reali; i < nconv; i++)
    ; I4 S% ]; f7 c( i        {% V( w+ U( R9 K, P1 l
                    temp.re = 0;
    . b& H8 t6 x" }                temp.im = 0;% ]8 \# `9 g+ Z# Q5 `: o
                    i1 = i;
    5 O% Q4 {8 h0 d$ z9 S9 _                for (j = j0; j >= 0; j--)
    5 [- z" n9 Z3 _                {) A: ~7 o5 V' d2 M
                            /* floating date operation */
    / i, t7 ^) G& _6 B* N9 o                }
    ; m3 D8 }/ Q* W7 c% |5 ?8 P
            }
    : a/ K5 z- \$ _6 B# h" E}
    ; [9 {+ H5 \+ {- U7 T! }2 w; h  K. L* z8 o" v
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样0 q$ t# p3 g8 I; j/ @" C! U. M

    ! ]- F2 W3 _% x红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。' [, s* N6 e9 o/ u  m% u
    现在call xcorr 100次,耗时78s.
    4 K6 L2 J! x$ q: J+ g8 N4 v5 V4 ~8 Y
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    . j; T6 S1 ~# J) b5 D  A
    * {. x& ]5 g- h- Q. H$ Y4 Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33  e' @0 ^2 z. _( l  W
    Maybe Debug mode?
    ' l+ _6 A9 ?' R1 ^

    0 w6 W4 `7 o+ Q  `5 e6 l! _* Z不应该,看我上面的回复。
    : e  q& a( o$ B( d% }/ a% h5 M# R) }# A' T7 z9 k4 @
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ( x. ]7 Z  W# ^) P( F7 X" K0 q
    雷达 发表于 2022-9-24 23:54: I" J8 H% j8 N6 ]% `1 ?2 Z
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 m! ^0 d/ z# u, ~
    {
    ) }2 Z7 h) ]7 B7 b. P) I$ V4 W        comp temp, xtimesy;
    2 p+ K7 \4 \' ~: V! M
    & \. I7 @2 p& t, c% \' W
    这个不是这么比的吧。。。
    ) K2 Y( O) K9 b3 I  ^* ?; E/ z+ r( l& @
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    2 d' i' r5 L7 W  e
    : C7 i; `4 @. S而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ' S, p" r; a3 }5 k! M: v9 T
    数值分析 发表于 2022-9-25 00:20# K" |3 \5 C+ o
    这个不是这么比的吧。。。, H: {, ^) t3 {8 W: D0 ]: a: T
    " L4 ]# ?& x# Z5 Z0 Q; d4 D
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    2 X3 ?6 f* W% B7 [% L$ M9 V/ R5 c  L3 A8 I- O, I: l
    有道理。- w7 _2 g. m# `. \( r: D
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。. U* g3 S, k. j+ |, F0 x. ~

    , p6 q, k# _2 k我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    - Q& {( G8 {" Q& a( ^  W有道理。1 j* t  I; ~' R4 p. X1 y
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ) m+ F, f6 c; E4 z4 Q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多/ f( l) G; Q' s
    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
    $ j. \' j! d: |  {+ [9 L; e  O这个不是这么比的吧。。。$ o, M3 Z& o8 S4 T* B

    & m3 s3 v8 H# K# i. N您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    $ G2 K( M: p, Q2 Z$ J; U
    + y% s- Z/ R: n* x- [9 W! V1 |
    现在的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 编辑
    " x. Q3 P/ J# L# R- V) j
    沉宝 发表于 2022-9-25 01:48* }& }9 t, D. [6 t/ t) G, O
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    0 B+ B3 v3 O  `" T8 X6 [& O7 y2 l9 X$ f( O9 W: \
    是的,兄台说的对。- o0 K5 O: R- L- v4 P

    ( c  P+ v5 w% B$ F4 \4 v* I其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。2 Z& r- s) J" P6 s

    . {/ Z7 B8 E4 ]- p  n& C雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    * o! I8 H) @3 w6 }4 q  i8 F. ~, T3 K( v. p- N9 X6 z
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    1 g, s& c* J, p+ y# V$ ?& {8 ~- h& T
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 2 F7 f5 @3 M& f: r3 D, E6 {0 S2 j
    沉宝 发表于 2022-9-25 01:27
      ]! W* M1 i  D: n& }7 M6 v你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , o+ h* n5 P1 x3 Y; J1 f5 i+ X
    / P0 u. C  C" }- ]- Y( o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。+ o! q# H6 [$ z* q& n

    2 Q5 p  g- r4 @8 V0 h& {我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    3 W; ~3 x0 V" ^; W- K: @又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    4 u! s5 {' t* G* C/ L
    时间差一倍的结果可以接受。
    . p* B/ Y$ \+ E) [# C: o# g- E
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 4 ~, m. n6 p3 x
    雷达 发表于 2022-9-25 04:47
    ; {. [9 Y0 ]0 {又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 a6 u& O+ f% w  u
    ) b3 i! g2 z6 Z) n) K$ T4 F2 i  W0 t9 b: v
    * H8 n" m% E- K& t+ L& }
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 Y. W" i( \/ ~5 O
    数值分析 发表于 2022-9-25 14:586 D, I5 {7 t" V: Q
    能不能把这个也贴上来,看看和上一个有什么不同?
    2 p1 \0 d" n3 ~% r/ H
    理了理思路,重新做了一个测试。
    . O- ^  Y9 L4 G) z& M+ E; O. s做了两个 vector 和 两个 float *, 都长 100000
      N/ w5 J7 ?1 A$ m0 R外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    4 N( `& [5 p1 B2 A  m* l4 l3 k
    ; w; _# W/ f) ^内循环试了4种方法,) v6 E9 Q) o1 _! D5 y1 o- y$ C; G
    1. 直接调用 vector inner_product 247s
    2 \: h" w+ V' }2. vector 循环点乘累加 237s3 O1 w) {  I3 S5 ^; _& K9 j
    3. float * 循环点乘累加 204s
    & G0 \- P) i8 |: O4. 空循环 100000 次 202s( j9 B# p' n; t. M1 G+ ~8 F
    + ]+ j8 T- m1 K8 d! i  o2 t
    不做内循环 200s! F7 P; ^" W& a

    ! \9 B# P6 E- f* \% C% k1 @你昨天说的对,内循环本身占比是很小的,大头在其他处理。; {; J; u4 P! K. Y4 x
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    : t! d3 U% e& t6 t
    ( B) J) V# P7 K% o# F至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    , Z, ~  k  u4 A- d
    * q1 w5 y0 c( ?/ s(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    0 c& h6 h7 J' _; D5 `
    ( T% M- l; O& G- w+ }
            std::vector < float > vec1(N);
    " g& a# m) o4 |- d3 e        std::vector < float > vec2(N);
    / d4 h2 E2 Q6 W# N7 N! s9 K        float* b1 = new float[N];0 K( J" n: J  i" f
            float* b2 = new float[N];; ^2 i' L7 ?* N2 j. V! R

    + \9 b" v4 f, a+ V$ G, C+ I        for (int j = 0; j < 6000; j++)
    ' F5 U2 Y4 P8 S, X" ^. Z9 t1 b        {
    . M! o5 ?+ I9 K6 q# z                std::generate(vec1.begin(), vec1.end(), []() {
    # P% J9 S* n+ ^$ G3 H( K" p0 T8 ?                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 {$ v2 C2 T. S  g% K8 n
                            });: X1 g' }: s; x- Y& I

    9 ]1 h0 s0 m9 b- _5 J8 @" o3 W, J                std::generate(vec2.begin(), vec2.end(), []() {- j% ^1 b6 L. d% R+ o) [; Q1 ^4 @
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 n) F7 n2 S  E- X$ h. E
                            });6 }: p( m  d; p3 K; ?. S9 L: G
    / L3 l" F* S# \% [
                    for (size_t jj = 0; jj < vec1.size(); jj++)" u4 n: p# e5 F$ S
                    {
    : w" f  p. E3 B' A                        b1[jj] = vec1[jj];
    5 B' G/ I1 g5 v2 ]+ ~9 t. K! ^4 a                }( I5 o8 H. A8 x- B3 ?0 S

    6 |' O" ~) P) u                for (size_t jj = 0; jj < vec2.size(); jj++)' z/ ^! o9 ^+ }9 [3 z
                    {& H# P; j  P# D% ^) a  j4 U
                            b2[jj] = vec2[jj];+ D, g+ ?) S9 j* [. X4 t
                    }+ ?5 t1 B; w$ a1 s5 }

    7 T! j( a: A8 o. V  y                //Method - 1  N=100000 247s  
    " k, q3 k4 j' z3 e                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    5 Y4 \; [) }; Z( o/ L7 F                                & l" Z9 J% i( _! c3 p7 U
                    //Method - 2  N=100000  237s/ B* t  o+ m# m
                    /*
    8 I9 O/ I/ O/ k5 U: r9 P                for (int jj = 0; jj < N ; jj++)
    8 N; s4 _( G3 r9 c0 i5 n. I% k' }                {
    . o# _0 w4 H$ l                        fresult += vec1[jj] * vec2[jj];
    , z: S/ y, M( W4 J$ f) E                }) ]; _  m4 J$ O' l: e4 M1 Z
                    */
    4 Z8 g- G: n' {* w8 S) _) @' L% k4 Y# `                                # n4 m  z9 ~8 H& ]+ I
                    //Method - 3  N=100000 204s
    ; @8 L: h  v( ?2 }5 P                /*
    ; ~: Q2 q3 c7 Y4 l0 n                for (int jj = 0; jj < N; jj++)+ q- Y7 `: `9 M$ O
                    {
    ) _9 F4 C* q3 A3 c                        fresult += b1[jj] * b2[jj];
    % ], l% [( Q: H" T) t9 F                }% M+ S. X4 p4 `7 G, S
                    */
    4 J% H) U8 E+ b- \. v! B  e: U
    . K4 a: J9 Q6 o1 h" B( j* A                //Method - 4   202s' N( ]' t3 h/ C% g
                    /*0 d2 X/ k- e, g$ f5 D* O
                    for (int jj = 0; jj < N; jj++)
    $ g* r0 Z# U/ {: t. J0 E+ @! H6 f                {1 W& d, w2 L& D# e) ?
                            
    4 q+ t! d6 M" P9 `3 v* R                }
    7 A9 c3 F( C9 q" l% `& K                */9 h7 ^. B8 ^5 ?$ S% w7 i3 p
                    //comment out all methods, N=100000  202s                : x, Z3 M, l1 `4 _5 ^7 N  F  q: M
            }/ x# ^; g: C% m3 q8 g

    % U2 A2 A5 i9 M  T        delete []b1;
    9 Q) l: I+ o/ q        delete []b2;
    ! ^( z9 M: n1 c+ u6 ^
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?; ?% w5 E! l3 p3 C
    . P* L5 `3 g& [3 Z; I
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    - z/ E( h# o* j# J
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:156 P5 f6 m7 a. p) _) {7 z- S
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    " |7 u% o2 t1 y( J2 Z
    ! a  L. l! C) r; K1 @0 H你第二个试验里面的j在循环里面又重新定义 ...

    1 d0 _. D9 D3 t内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    5 }: v9 R1 z4 K1 N4 }
    ) F3 T7 O# |- Y$ j不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    " _4 `7 G& H3 j+ e3 I1 D9 S0 C内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL8 n1 V3 Z8 n% E; _
    0 F$ p" G# l4 R, ^  c4 H
    不和它 ...

    3 b+ B; T8 v0 {9 d: o( T$ L
    , O2 J% q! S1 M% B不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    & c4 ~0 V  \% t/ K后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54% H0 a% Y. v" a0 e! I' {+ W
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " r2 z  g9 P! I  e5 C; O{
      ]( I& p1 o8 Z4 r        comp temp, xtimesy;
    " N; K  f: Y: e& L* w( K. V
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    0 s, c8 S. M8 V4 J. O+ @  v内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?' {% l5 E; Z+ O' c2 a0 ]' v$ O
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-12 18:29 , Processed in 0.108415 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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