设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    % M( b6 b/ x! W" a" r. r% o
    " S0 v+ t* j3 q' J* N自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    # ^1 P9 u. T: m9 O2 ~& D8 @! @8 Z
    # q$ i0 N- w& }速度优化问题真的很有意思啊。
    # ]  b, @1 S7 `* E' i
    $ s% p* u" Y8 d6 k3 I' N欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    前天 19:30
  • 签到天数: 1931 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    / |+ O8 X$ d) l! I- Y把代码贴上来看看?0 P& G  S9 V, W" {0 E: }

    7 R7 B4 s; T3 f. \9 \. Q8 v; q难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 4 x7 f0 ^+ C( T3 R
    数值分析 发表于 2022-9-24 23:042 ~+ T; d6 |7 M$ _8 ?
    拉下来?拉多少?; @0 K' _$ \- o: @% t1 t! `
    把代码贴上来看看?

    7 G3 B2 X- X' i) E- ^
    ! f# F% z3 Y3 l3 g, ?* zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB). v6 L; ]& H* G4 l1 G/ D  n
    {: {8 C- |8 ^  g
            comp temp, xtimesy;& X& J3 {, ]- |' z  M
            xtimesy.re = 0;! c( c1 l: O# k9 T
            xtimesy.im = 0;/ y2 O8 P& I0 g$ p( P7 _& s- o
            int j0 = lenB - 1;. A) |0 f) ]% D
            int    i, j, i1, reali;. a5 B& S5 ~0 ^
            if (lenA % 2 == 1)
    - ]- \0 n$ z: ]                reali = lenA + 1;
    2 v# [" V% I! j- y3 ]        else
    - H$ x  x' J3 j- f7 W6 r! q' E8 F3 L! t                reali = lenA;5 ?# e$ b; L1 }  O
            reali /= 2;  K9 @' i9 o& C3 r* w; p

    # g5 Q! w' N! T- x: H" H        int nconv = reali + lenB;
    6 c, F# f( z1 f& T/ l3 O( E        //#pragma omp parallel for. G* V) v: g9 ^4 M
            for (i = reali; i < nconv; i++)8 y) s5 d( M8 x4 \; P# d/ E
            {
    ! |5 @( V% u8 |* M9 x; H                temp.re = 0;
    0 A; ?& V* G$ A( j' Z. w                temp.im = 0;
    + T: x$ M7 B1 T* |                i1 = i;
    * @( i: W4 h& T2 w' ~# o* B0 Y! C* m                for (j = j0; j >= 0; j--)
    ( x8 P4 d% K& ^& I2 b# \                {
    0 d/ F. q( H: n7 e7 N                        /* floating date operation */
    8 z! L1 V4 K7 c, ?$ w0 g0 p  I8 }2 J* K                }
    . I9 W1 ^( g5 G2 U9 G1 f  ?
            }2 [6 A4 q0 @: a& \8 n( f
    }/ x2 V7 t. F* }/ M

    : r  ]# a6 M( n: _/ ^xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    + r0 ]* ?" h- u" [3 r% X& F) Q* T; j% G- F5 H
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。! F/ F: w6 _, z" g
    现在call xcorr 100次,耗时78s.
    . F7 r3 U( p8 ?; I: m
    / O. s6 e; }- i3 s/ q  s2 i: P7 O如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    5 ]$ g  R2 j+ S9 I" L# I
    / P+ \: O- F& J7 z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:337 O6 I. h- ~+ k0 t$ }
    Maybe Debug mode?
    7 i5 h5 u- K" l' b! @& }

    0 [2 I9 C2 A  e% t+ R2 x7 Q不应该,看我上面的回复。
    3 n/ U3 ]  s! X1 L& x5 c; R2 o! d) ~
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 19:30
  • 签到天数: 1931 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    . I$ G' m# b$ f2 `1 w
    雷达 发表于 2022-9-24 23:54
    # q. M" |" @/ ^- O1 Y0 I$ `, Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) r# c7 Q: N0 [0 p- d: j' {, n; y{
    % R  P& `' y, v2 A: [        comp temp, xtimesy;

    6 _5 j( }+ s4 N! @- D
    5 M! G6 [4 }7 R# `这个不是这么比的吧。。。
    - g* V4 x. c$ F- |9 u) ~, ^9 a, ^, e0 S7 K( s8 k- T+ j0 t+ K
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。' s: W. ~# w: m* n5 C' [: r/ N& O9 f
    2 S  u% V- a* c6 Y
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    , g* M" Y% q! c% R" |8 _
    数值分析 发表于 2022-9-25 00:20" J% b1 n8 {) Z; g* ]! X3 ^
    这个不是这么比的吧。。。' s8 T- b. b# P& u" N
    : [) H: m: c1 Q, e& w& U4 b& j1 }9 A
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      u$ j% k+ i( Z0 P# S& m8 a
    . E& u$ o! n# B0 y0 p2 v0 F) |2 t
    有道理。2 f5 @1 c7 r) h+ C; ?
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ( A: H+ n# l5 C- t
    , q( ~: H) l' J- k  Y我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:461 w& G5 ~4 f) Q' t6 {
    有道理。
    ! b6 i2 P# i  W3 r. _所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ; h$ V! j$ ?7 \  k你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多% e( }  v) q6 k+ q0 G; {5 ?
    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
    / {8 a, x) _' q  R4 E这个不是这么比的吧。。。
    : Z) K9 w9 c1 _! t" ^
    , `& d: t4 f% [9 L# m4 u. O您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    & p6 G2 w# y9 Y4 N8 K! d# S
    , X  _0 C7 c" a现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 19:30
  • 签到天数: 1931 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑   q& F* C3 g, c5 ?, d' g" ]
    沉宝 发表于 2022-9-25 01:48  k% n2 f" ?$ r  y# b, n
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    - \2 t% M( f0 Y: o, b
    " y8 x/ k- u7 T5 Q2 K是的,兄台说的对。
    ) |& \) Q6 H0 A: J( t
    # Y- y4 h' ?& i; V) T/ w其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ; Z* F1 ]  w4 i! @* `3 z  R6 x3 \. Z
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ; h/ h/ z* r3 f4 ~$ _3 w/ e& k* a- G) T( p5 N  O9 z
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    : l  D  W: z( f0 s: ~) K
    $ F4 F8 F4 s; y$ j3 Z2 a当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 7 Q7 i- d& L* u
    沉宝 发表于 2022-9-25 01:27' f  ~+ D( X7 J0 M; ~* J
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    * Y" G- v4 L7 Y9 ^
    % C* C2 V- a' V0 i; J+ c/ O
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。9 }1 G+ h: v" {+ N8 ?
    + [$ g* j4 K- q- A; R
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47& h# p; `: r; ]
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( X+ u3 _5 C/ B# X
    时间差一倍的结果可以接受。/ @& W7 N" y5 K: k1 |/ I

    " D) }3 ^: f3 J3 o你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 19:30
  • 签到天数: 1931 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 . x4 g+ L) l( _
    雷达 发表于 2022-9-25 04:47
    ) s. i5 P6 ]( v' Y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ; {' \$ n! ^" s( e
    . ?% P: V) v9 b1 H
    3 A, d# T0 S( u8 m* Q9 c; @( C: m1 H+ ]/ F0 v
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ) U9 b- m* p3 E0 E. r3 J6 H+ w5 q
    数值分析 发表于 2022-9-25 14:58  V9 Z. A6 F9 _0 i# j, n; D
    能不能把这个也贴上来,看看和上一个有什么不同?

    ; [( G; ~0 N$ `' _理了理思路,重新做了一个测试。
    ! B; ]6 {: M# `$ p3 {. h做了两个 vector 和 两个 float *, 都长 100000% w3 _$ {* i5 N  D1 f
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    - _- K: q0 o* g. S0 B/ _5 p9 o7 X) ~9 K1 N; j
    内循环试了4种方法,
    7 N+ g- p6 J& T$ m1. 直接调用 vector inner_product 247s
    & A2 S; Z1 i( H. r2 g; l  b! G# r' Y2. vector 循环点乘累加 237s
    ) }. Y5 C! e/ Y) F1 O! a' n/ k5 P3. float * 循环点乘累加 204s0 w; K* W, G2 K. o& H5 o
    4. 空循环 100000 次 202s
    7 N, o1 N4 @# \! L" h7 t* S0 [( x( n' P5 s6 C2 H
    不做内循环 200s1 ~0 q5 u2 y$ J! j1 V
    & w" @7 K- B( @9 U
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 G: I* ]) d, T$ T$ Q- n1 t
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ x- f4 ?6 H2 ^, p1 Q  K+ E

    ; u& E" i% M  f1 t至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    9 X- ~! U8 T& c  S( v: k
    ; N. a; q$ a% H(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)( G, Z1 J8 e! S  B* I
    0 r' k' ~) c0 P& _
            std::vector < float > vec1(N);
    % Q9 W; e  `1 k7 P( {        std::vector < float > vec2(N);( n: D- |, x; Q, j, ~
            float* b1 = new float[N];# Y- i) Y5 C5 N8 Z! _" |6 a
            float* b2 = new float[N];) I' t* e, W1 ^5 v6 k1 ]

    3 m7 N8 h$ {+ W# \        for (int j = 0; j < 6000; j++)' F1 T/ }  g0 u3 I
            {: g$ k- e( a0 H2 J# M6 Q  P
                    std::generate(vec1.begin(), vec1.end(), []() {
    % T' }) v: @$ S" f& d                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    / |' H5 x5 |) C3 F                        });
    ( R' G7 C2 b; |+ y/ X6 M0 [7 t0 K6 ^( d/ H8 j& w  M' \, j
                    std::generate(vec2.begin(), vec2.end(), []() {& d9 F0 o* n4 v: R+ T3 L0 @
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) l; }" v* i9 q3 r1 |
                            });
    9 Z) X% r- g5 k- q; j5 W2 ?) |% j. p" B& j" z6 ~
                    for (size_t jj = 0; jj < vec1.size(); jj++)$ |! u( z- d# w% v8 l' ?' f
                    {
    5 F7 |+ m2 A! {5 @+ z; j) K                        b1[jj] = vec1[jj];, A1 }+ H' W5 m0 P
                    }) T4 L1 x! J  x
    9 U5 D: ^$ Y, o0 w* E  k) ?
                    for (size_t jj = 0; jj < vec2.size(); jj++); o( R+ S3 k- W9 C5 v0 O3 l
                    {- D. B( L1 s; f1 w/ {9 O& N
                            b2[jj] = vec2[jj];7 b( E/ R% h2 x
                    }3 |8 a; P4 C) l9 d% L, _! Y! [; p

    * r; ^* _$ D* T5 E2 u! p' b1 M                //Method - 1  N=100000 247s  
    2 d4 H1 C+ d# n* u  x2 b                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    8 O6 A7 R8 C- ~7 J                                
    * I8 b. h, [  {* g/ k5 k                //Method - 2  N=100000  237s
    - w5 W" z% V* ], |" w) u                /*# |/ R" C3 ^! K
                    for (int jj = 0; jj < N ; jj++)( z* ?1 w1 U* j! U# O2 f
                    {: e2 s; M- ~' V1 M) D
                            fresult += vec1[jj] * vec2[jj];0 o& ]' G+ ~, T6 v2 u
                    }" T. @! C" h! s; ]& ?: P& t
                    */
    % Y2 ?, _( F  [                                
    $ T. d# b$ D) Y# `( V                //Method - 3  N=100000 204s
    - i, E% F7 ^$ h& C2 \: Z8 Y3 M                /*; S. M4 F# F0 @+ B; F5 {  T
                    for (int jj = 0; jj < N; jj++)
    7 |- \0 O( V/ U4 T                {
    ! P& t% a+ X6 U$ q2 Y2 a                        fresult += b1[jj] * b2[jj];
    : E3 j+ b- S* w: Y                }
    ' i* M8 ^- \( f# V) x" E# O                */* E/ a5 ]8 a* r- J# C0 `

    2 a3 W0 r2 w3 y% J                //Method - 4   202s6 q/ A5 H6 p5 m" [
                    /*
    # y4 k- Y9 x1 V$ k                for (int jj = 0; jj < N; jj++)
    * A5 I4 I! y" a" ]                {8 Y8 j8 ~7 W* G6 D, Z/ B% C4 [0 H
                            2 e; G- N: t8 O0 s. z* b0 {' Y8 W
                    }* A: @# [% P9 s' b
                    */
    0 W' q% C& |* t) W3 b/ y; a                //comment out all methods, N=100000  202s                8 F7 G4 Y9 t; C$ Z3 V
            }
    2 W5 T- Y0 p; D3 N2 A3 f5 d6 l+ S' P+ y! \3 ~/ ?/ f; V0 E7 t
            delete []b1;2 i7 n$ I! E7 U! f! L
            delete []b2;
    5 R$ q8 X% D# k0 y9 v6 F) z
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 I, v" a* f& P3 s
    ; Z) o, \1 ?; J3 b. |4 ]7 u
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    . I3 U$ S& I) y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    5 c; p7 }' p3 Q' z4 F瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ( V. r- A1 x- r0 ^
    ! N5 e' g& Y. a你第二个试验里面的j在循环里面又重新定义 ...

    + y. c% T, V. J内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL5 o6 x+ A+ }: d% F3 c; Q
    . @2 m" [( l' d
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16' q1 z3 \( p/ t4 ]; J. t
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' P8 k2 h6 m% E& i9 y. I7 ~& y4 s+ h' {& v7 d3 r/ h
    不和它 ...

    / Z# p3 x. P$ r) [4 ^% K  e4 Q8 V* k' p! F7 V$ a
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
      ?  b2 a+ C# R7 v  Y8 f  n后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54* \+ g1 q" b) Z9 \' |# U
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* G, M) R4 B& @; U0 U, B) d
    {
    3 {/ t, O& P0 d0 B* z8 \        comp temp, xtimesy;

    ! h) e: @/ y" ?; ^# e+ M这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    1 r% N. ?4 H' p9 X; L内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?9 J. Q, }9 d2 L* E* j# G2 i4 ^. {/ E
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-14 17:17 , Processed in 0.058330 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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