设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?' g9 m! f" X7 c* Z. ^" h

    4 z. |" u% x3 y自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。! e# R. h+ x7 t/ {! q
    3 q: c4 _# F. M  S- A) `* W4 M
    速度优化问题真的很有意思啊。
    , T3 Y4 W/ z$ u  p! S/ a# ~7 }# a% M' a$ u) h: p6 \
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?. ?" V: V# _& @+ a
    把代码贴上来看看?
    " H  E9 @) }/ E- l4 a3 i: W
    4 s$ A1 \* @8 P0 Y难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 2 H( m0 e, }9 X2 w! ^
    数值分析 发表于 2022-9-24 23:04! u* }% {# c- D1 }6 }2 k
    拉下来?拉多少?
    - A0 }- z5 K7 k) y- e! O把代码贴上来看看?
    % a2 p- B' L# j6 U- F
    ( k' u5 O- F+ |! Y. `2 A8 B. H7 Z
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 t7 Z' L6 Z  r4 d' B2 H- ^{* ]: ~+ F$ L5 r, t
            comp temp, xtimesy;. C2 F* \% c0 R; f3 ~1 z
            xtimesy.re = 0;
    5 x& G3 ~- `& P" w3 F* i' G5 [        xtimesy.im = 0;
    3 Y( D5 o! ^9 m( Q+ @        int j0 = lenB - 1;0 ^9 H* b. z4 L/ I
            int    i, j, i1, reali;+ V* H- t" r  h2 N$ e( v; i
            if (lenA % 2 == 1)
    # g' D1 ]0 E9 @                reali = lenA + 1;
    1 ~" u% j: m+ A; D% s" A$ e3 j        else/ P! _* \; n! a% {0 g" \
                    reali = lenA;
    $ I* k/ S+ M% w) ~% v        reali /= 2;. J$ f* @, V' c' J

    + b; m3 x% ~0 u) c/ E        int nconv = reali + lenB;. j6 v- F8 t/ x
            //#pragma omp parallel for
    ( t7 `* L6 S; C. j7 Q! _        for (i = reali; i < nconv; i++)
    . c2 }, d0 U6 ~4 b        {
    $ m0 [& g' u4 y# t( {. k& [& K                temp.re = 0;7 b9 ?4 t( X( e  p6 U9 {! Q0 S
                    temp.im = 0;0 K5 c+ z% b: y9 V
                    i1 = i;
    ( @# b7 q8 c' w" Z                for (j = j0; j >= 0; j--)
    6 \3 o3 X8 P, N                {' `2 I; M2 Z$ a; |6 r/ K
                            /* floating date operation */8 [( d* a7 F* q3 V( e
                    }
    9 K4 u" j/ v# w. K, n* ^# V4 V
            }. J' o+ w* S$ Q; Y5 f$ h6 ^' H) A' b
    }
    % j4 o) {) P  _6 t* {# a2 V( K, j+ `; _8 k' G; P* D
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样" e- @: H) ?& M9 N: h

    1 s8 T, X5 A9 i8 c% b- y+ k红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    5 @: o2 T( ~: D" N5 h现在call xcorr 100次,耗时78s.# M% H/ `8 {& K- \! L& x8 `
    & q# Q0 p1 X; v- A8 k% {
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    / l, g7 B( c0 v
      }' G! [2 \9 u  a
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:335 d  q/ w! e: y* k* J2 x8 \
    Maybe Debug mode?
    2 C7 Q- D% U, f$ }
    0 g: n% f6 R' |, ?; ]& r6 p  N) Y! D: g
    不应该,看我上面的回复。( `6 Z. c+ Q. v" z
    7 i8 Q# x8 u% Y0 q4 N! C
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
      b9 Y$ U; z8 t
    雷达 发表于 2022-9-24 23:545 g  v7 T( d0 |: x* g( S: q" B1 p
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& F  `* M3 T) G) }5 z
    {
    % A$ ?, v1 Z3 r/ y9 o$ O$ m        comp temp, xtimesy;
      _( `) T6 h5 T7 X1 i5 Y3 ]; p. `

    $ s: k. k1 D! f. V这个不是这么比的吧。。。9 W0 p2 `1 ^" B5 ?( d

    & k! s" z0 i# q/ S7 O$ E- b, ]5 E您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    & F  K# _, `" ?3 C! z5 y, g) _1 ^( \
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    & x; x4 N9 w+ X* v
    数值分析 发表于 2022-9-25 00:200 z* c7 ~" @6 i6 K
    这个不是这么比的吧。。。) W& K9 \; c5 t$ P( |

    ' h% T7 c# `  l( I# ]( E% k& `8 R# u您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ( s( r8 I  l. b1 U) O
    ; n" n: I2 {, i  E9 }3 o有道理。
    " X3 r2 S( l3 R( V# M7 b) k3 Q所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    - @$ S) b  C% ?( L' b2 Z4 P+ |  V" s8 k  F( J2 g
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    2 g. B3 P# R. t, W1 z有道理。  M9 G+ R: w. Z) D8 P" G: n+ I
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    $ _# k/ ^8 U& }, k# Y你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ; T% y, L# s3 q( V5 ]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
    $ G; E, @% d* e- {这个不是这么比的吧。。。
    # n# f: O! |) k9 R7 r9 B0 T# |' C
    5 W" S3 I( @. ~; U: O; Y/ O3 |. o您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ! c1 M7 C3 a) G+ M+ \
    , N. `7 ~, v2 r' c+ c现在的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 编辑
    ; ^% F) ?% }5 G6 R
    沉宝 发表于 2022-9-25 01:48
    # h! F8 `$ r9 j3 D6 X现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    / [8 f/ D7 `( f( h: L

    2 ^9 x$ q) Y) f. ?  F4 B是的,兄台说的对。
    & S: ^% n% ^, f1 G  h
    + x' X; g# o: U8 B/ J其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。- \7 E- K9 R! \0 x
    * r& x# L* t- B; @/ E4 u
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    : l! D# b7 a- V2 U$ F% R  ?) J. O* \
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    % G& x9 M: ?5 S; B( k# b1 A+ O1 \4 s
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    & r- r& M* l- M3 p0 M1 S2 A& T$ F
    沉宝 发表于 2022-9-25 01:27
    0 t2 l  P  O5 c" P/ w! g: x你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    6 n1 M  r2 w" y) v0 {+ I/ ?8 _  Y) k: R; X- x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。) Q/ ]! K$ v/ [8 l$ E5 v
    2 E: T% b- x0 z3 [- e) I- f9 i
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47' S; h* G# m! q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

      H7 w* H) {! y, H3 l时间差一倍的结果可以接受。
    ! N  L3 M4 R  q# ?4 z8 Q
    6 |7 i8 @* a" W- }4 Q* [你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ( I" X2 ~; `- I
    雷达 发表于 2022-9-25 04:47
    : I0 S+ X* `3 d( V又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( J% N4 T. D% z$ @7 Y! N  S3 M7 x" P
    % @" E2 J+ n. x0 t; X
    & d0 j' a' {4 E+ ^

    % S4 x' V$ H! O& Y% i6 y. P能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 / x# ~7 m0 c. d3 g+ \6 B3 n  B* |
    数值分析 发表于 2022-9-25 14:582 `/ i) K' i6 N( K# ]5 O* q( k
    能不能把这个也贴上来,看看和上一个有什么不同?

    3 @$ ^1 z7 u. y: F7 |7 v& d理了理思路,重新做了一个测试。/ U( k7 U! ~5 B' |7 t4 s
    做了两个 vector 和 两个 float *, 都长 100000' c' A: H2 u8 K5 }% m
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ e9 Z/ s& ~! }( g6 n' M
    . A4 F  @" J" g$ h
    内循环试了4种方法,
      a: @6 R$ @" {7 P; a. _1. 直接调用 vector inner_product 247s - Y/ _( U! K) [3 n) l* s: S/ s- ~$ x
    2. vector 循环点乘累加 237s
    & `) e' q( z0 y) d: @6 a% t5 E' H3. float * 循环点乘累加 204s
    ( A1 Q5 z% y2 H+ T" c) _: b4. 空循环 100000 次 202s
    7 w5 c! |3 `) b8 e9 O; {
    - x$ Z. L3 w4 d* y3 X4 c. Z* ~不做内循环 200s2 ^# B+ f: X; e' `0 O6 f

    1 e' B8 n- J, ?$ E你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    * c0 o: y$ x# P另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 H( L( Z4 E1 F8 f' \5 G

    8 e" i/ j$ c: K; F! e- W: B! C  l/ y至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 m: r7 u3 V0 t+ p) \
    0 K  q  t+ R8 d) X, \/ K
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)( q+ m- X7 |6 n' z& r2 ]* P

    4 h4 O" ]' g" r
            std::vector < float > vec1(N);
    5 [2 S! I- _, c) }7 L+ _# \        std::vector < float > vec2(N);
    7 Q3 @  J2 `, x+ L; o        float* b1 = new float[N];
    9 u' L3 V5 k4 m3 H" l        float* b2 = new float[N];! l. t4 I# n+ u& ]
      P; P2 c! }  S: ~
            for (int j = 0; j < 6000; j++)
    7 Z- l4 Q+ X" J% D* _        {
    . K0 n0 I" y7 j* _$ l6 K                std::generate(vec1.begin(), vec1.end(), []() {
    , R( D; e  t5 l" o                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
      R! |5 t0 B0 z/ V                        });
    + ]- ~  y) c( }
      ?6 E7 E/ g, X                std::generate(vec2.begin(), vec2.end(), []() {
    + i9 [/ i. b# j; C2 M7 _                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) N8 r, Z& _  v) s7 Y( K  m7 x4 a6 o
                            });8 E$ d& ~5 I/ g  Z

    8 T% d! [& ^  R7 f' l4 q                for (size_t jj = 0; jj < vec1.size(); jj++)
    0 D, [2 F# _& z- G: O* X" g( j2 D8 d                {! m+ B  o3 Y( B: g" D0 }7 T6 v
                            b1[jj] = vec1[jj];
    2 ]) L# h# c9 S) V) ^" i+ X                }( K# n- s. J# `" P

      U2 @! p" m, X8 W: |2 S                for (size_t jj = 0; jj < vec2.size(); jj++)
    ( _: W( Q1 I: K2 r7 Z                {
    / r* @& X4 v8 T' B5 `                        b2[jj] = vec2[jj];
    ; O3 Y/ ?. W) `8 W; `9 W                }
    1 Y# ^4 J+ R6 W# ~5 S6 S" M0 [
    % U, ]  @! P( h. z                //Method - 1  N=100000 247s  
    8 f5 Z  O0 [7 Z# c                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    9 B; c( L9 q0 o9 u9 l7 @                                
    0 N3 P# t. t1 s0 V* j9 f7 ~                //Method - 2  N=100000  237s
      `7 \) S# F$ U' l; u: l. `2 [                /*) {9 n( R/ y" o! P4 g: @
                    for (int jj = 0; jj < N ; jj++)! Z# Q8 a5 T$ j$ x
                    {
    ; ]* o, {* J* R5 d                        fresult += vec1[jj] * vec2[jj];
    9 u: ?+ f# M8 q. d3 I                }
    : j+ d8 W9 X# o                */. c# Q3 m, N6 [
                                    
    / t- Q; x2 k' x$ o                //Method - 3  N=100000 204s+ s, r- J; Q0 G7 H3 v8 \& P/ H
                    /*3 d, Y' V  P! D+ h
                    for (int jj = 0; jj < N; jj++)9 J! x- K: W) X  j$ |" [
                    {* U4 z+ }6 f: Q
                            fresult += b1[jj] * b2[jj];
    ' f5 h. w* l& ^4 `1 k/ b; Z                }( w  U) {: r, p& H
                    */
    ' z1 M0 H  |% G2 `4 _
    % [7 \6 t/ S' l  O! U                //Method - 4   202s
    6 X, |1 }( [3 _- m7 j  v1 L, c                /*% n. Z4 k. A/ l( H" I0 [$ s) D
                    for (int jj = 0; jj < N; jj++)
    # C. K% B, w3 U( @' i* {                {& h- [+ R" Y! c  T& K2 s0 d: y) n
                            
    4 N4 I. l5 L, M; \# I/ T8 Y                }
    2 Q5 x, H) `0 f                */9 p% h; w* P" v8 v9 B" C3 w6 f$ k
                    //comment out all methods, N=100000  202s                7 C% ?( b: W" o) ?9 z: p+ M  B- \
            }
    2 G. B5 F  l* B& ~8 c, V( [2 x3 X/ w* e
            delete []b1;
    2 z4 S) H: _0 x        delete []b2;
    0 e# o# i4 ~8 f5 J
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * u  u1 n1 e' G% L/ t8 Y$ q& ]
    ) o, L% ]" g9 e: M+ ]0 L: S0 S7 P你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    9 S! p9 {7 u; u
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15( Y& F1 M: n, j; m9 d: B% J9 X
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( X/ Z2 o4 o5 y% A7 ^2 f
    ' T/ q( K( l- X8 ~, x: D) l, u9 l
    你第二个试验里面的j在循环里面又重新定义 ...
    # r+ X6 v: F9 p
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    # V. H* K6 P! W' z/ e$ k- _1 L' N- E/ W- S; b
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ' \8 \5 _, X) q$ Z内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL5 U2 G! O+ I8 _8 `- ^
    3 J: O2 O8 e9 c7 m
    不和它 ...

    2 f& B% a" ]1 s% k; T2 M) X0 Q
    1 v! d' `  L& j& Z不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ! V7 _* L4 ^3 ?. N0 e' x后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:549 W7 c# ~, C. ]! X$ N9 m1 \- ]
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 ]% `1 t1 Y4 C$ \
    {
    * G( x8 H2 G' w, M  X5 a        comp temp, xtimesy;

    6 }8 d# _* B$ t6 u* o2 }: ?! W这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。- r8 w" b. e8 y
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?2 O# [9 |& }$ r' L+ k' k. P
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

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

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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