设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ! B: W: D0 N+ Q% e$ X" N5 X
    - q/ N# o* Z4 L, C0 f自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。9 |& E/ l+ P: }) F1 S$ Y8 v

    4 D8 C! S' }# f) @1 n* N速度优化问题真的很有意思啊。: p( L# c) @0 w  G2 i! @
    7 H+ ?& Q0 I3 ^! O+ G' ]4 R* i3 t
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    % @, c4 n: i( V* ^# w6 q把代码贴上来看看?
    9 F2 z* N* h, g* i/ h/ k7 T( X; p$ S, Y6 h( @( s# f
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 ' l% f9 ^+ s3 }5 y1 ]
    数值分析 发表于 2022-9-24 23:04
    2 \  j& O  O4 `8 S8 x% X拉下来?拉多少?
    . R# r# H8 n) F# d% l2 O7 {" {把代码贴上来看看?

    " N' E' c1 o+ B- K, u6 |0 d$ o) t% O2 _1 k* Q' Q3 B
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    - @# w$ Y' M2 ~! g! C{
    % s, R5 n, u6 ?9 c        comp temp, xtimesy;; a2 @2 O, e: z2 G9 l+ m
            xtimesy.re = 0;
    % Y* W0 M& X. |        xtimesy.im = 0;
    % U' _( X# `- E7 U  j) m1 Y        int j0 = lenB - 1;
    0 C3 C, [$ P$ @% a5 W9 g5 R        int    i, j, i1, reali;# i! a, h4 V6 F
            if (lenA % 2 == 1)
    4 `- I1 C, a- m- ^/ `; |6 w3 ~4 k                reali = lenA + 1;3 `$ [0 p6 a4 I( ~& ?
            else
    , c% s* O1 ?  V9 b' o" B( |                reali = lenA;
    8 w) u) y5 k; r6 h# ]& v        reali /= 2;
    + _9 Y( |) n, [; Q# O- l$ l6 j2 |4 W) a7 y
            int nconv = reali + lenB;# k6 `1 L7 X$ P& ?- v3 v
            //#pragma omp parallel for
    ( _/ P1 M, F$ j; S" Q        for (i = reali; i < nconv; i++)
    8 o  J% |4 |# \8 N3 w        {
    " w; }9 r/ r7 L$ m3 N- j                temp.re = 0;
    # ~7 U7 r8 D; ~4 I' y& |* P) ^- v                temp.im = 0;$ f1 C3 L8 m5 K& D% C, s7 I
                    i1 = i;# b5 v6 H5 T# G4 o% m& k6 B
                    for (j = j0; j >= 0; j--): p8 Q: p& v3 y; E" W$ A
                    {
    1 Q3 @$ m/ z% g" U% v7 \+ o                        /* floating date operation */6 a' t$ c4 I% \% ^8 k- Q, Z
                    }

    9 N/ F( O) d& I- m        }
    * T& ]# y+ ]: B( [}& g6 T6 n- x# c4 S1 p

      a) d7 c3 z% }' c; @xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样7 |7 J8 a% Q8 [+ d7 o, _
    0 C( r3 w. ~9 x$ U, B/ w
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ; a' d- N! u: j8 U( n现在call xcorr 100次,耗时78s.
    % x& ]& j+ X& @+ V! {# ~, \. `4 t& B6 X$ j! ^  L: @4 S
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. * o# q$ b. P$ s# m4 a

    9 V+ u+ G4 G- s$ e% V( W9 S
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:330 ]% A% ^9 ?  A9 i9 W
    Maybe Debug mode?
    $ i9 S& N& S" A$ `: u6 [, V3 ^% ]
      n# B6 A, d4 p) O
    不应该,看我上面的回复。
    / r: R6 }: F6 z. ~! G
    + i$ f: s; N/ q0 n( X; w3 A我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
      n  n9 [2 t, P0 j1 f. F# V
    雷达 发表于 2022-9-24 23:54
    * w0 \% j" D" v3 @( Yvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 ?" U! n& W. G+ N- S" S{
    % u! N: B! m" J: W, X1 I3 p6 f        comp temp, xtimesy;

    9 S2 b$ M! \' A5 J+ k$ d
    ( n9 f- o. f7 g- {这个不是这么比的吧。。。4 Y3 X  F3 m' s* K
    # [. F) Q/ ]: ]( c
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    $ d/ B1 `' ^% f. N! q+ v- A* j  g# X" ?# P& A% x
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
      y  g: E) C1 F9 A
    数值分析 发表于 2022-9-25 00:20; s# Z3 i( \0 o
    这个不是这么比的吧。。。
    ) Q: Z. |+ h( U- y
    + c7 ?& c& C8 l$ ?您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    $ }7 f- k& N! |' ?4 v" f9 Z
    . g4 d# E7 C! s3 w! Y1 _3 D
    有道理。
    5 t/ \" R9 E; V所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    / {* i& ?8 H" ?; O5 G7 H: R- \
    ! t4 b6 _$ z! i! R我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    0 k5 V6 k  r* L有道理。
    $ V$ [, `* f9 \4 A+ S9 E* X: J所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    7 r' j  E' z8 v. V
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    / E2 y: L- q* w4 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$ ]3 U$ I( o- R3 {- S$ ~
    这个不是这么比的吧。。。
    & d4 s  K. ^  C- Q3 w: J4 u( }. I2 d% U
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ( ^, D8 I. W" }4 w4 j' n/ M5 U4 N6 C
    , |3 G" r( j( H1 U
    现在的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 编辑 * m/ b  N! U8 h% y
    沉宝 发表于 2022-9-25 01:48( u0 o6 x+ s! ^. u
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ) h; M. d3 s4 x% z; s
      \7 N9 S4 |" V是的,兄台说的对。
    " U2 }* ^0 y) T
    . S3 y5 B7 [) S: j  r: Z# X3 `其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。9 r9 D, P7 t: v* _* P. E- b
    ! \" @) J8 r9 G
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。9 b3 W+ P! m  D  v  c  c( o" \

    & _* p, L% a* l2 t% G+ i& C( O比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ; U; O) K% K, ~% F
    " B5 }; W) A- q0 d, W; ?3 {当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
      X4 a1 ?" r) Q+ U( J0 T
    沉宝 发表于 2022-9-25 01:27
      f' |: k, H0 _4 b# d: z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    6 f" B# |2 p2 W$ S+ L! c
    , i3 W  g* j4 M9 v5 C) i9 G又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。& L8 V3 W; P8 D% i

    $ L' N. z( {3 ?4 x5 J* `我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47+ m' E- v! p$ q/ p2 M4 R
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ {% M+ Z, B$ G8 W
    时间差一倍的结果可以接受。
    0 d* `7 u( T7 h; l3 r8 F# x: G7 ^
    . Z0 g# Y6 B9 R你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 6 }4 Y7 a6 K5 @6 B
    雷达 发表于 2022-9-25 04:47
      @) ~9 z  h0 A3 E. m& n. o: d: k又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    + `& Q- r/ [$ r8 ?
    9 p; ?$ N$ N; o
    - i- C7 k+ d7 F. T: D6 @4 W! P
    / C( N) ~/ O- j+ Y能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    $ U3 `7 a' M1 _$ e& I' j
    数值分析 发表于 2022-9-25 14:58  f5 A, S% h, n& U' \
    能不能把这个也贴上来,看看和上一个有什么不同?
    ) j% B2 ^& r7 b
    理了理思路,重新做了一个测试。
    6 ]9 x/ q1 @! D7 P+ L) r做了两个 vector 和 两个 float *, 都长 1000008 q8 J$ S: x+ S- ?* M: L
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    1 \) R( t2 C8 I5 x+ ~9 o, D1 ^. p$ J) j
    内循环试了4种方法,* E% T, O' E; W/ Q- k
    1. 直接调用 vector inner_product 247s 2 g1 w7 [4 d' z8 K3 t6 k2 q
    2. vector 循环点乘累加 237s
    " R8 {2 h; j: L  q6 f* [3. float * 循环点乘累加 204s
    . f- q: i5 i* {3 d' \$ D4. 空循环 100000 次 202s
    # f1 {) `' X& t: ^& r4 z) R% z
    ( i/ x& V2 i- g5 f1 s9 Y不做内循环 200s
    . ^3 P8 L* m7 J  d5 D( g8 g7 A/ y+ K: {1 Z
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    / N9 n% Q, r8 |, c; R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 ^# a7 ]  e! U" x+ H4 ^

    8 x# G1 Y+ L/ w5 P' m至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ b; C1 o+ Q/ c7 B- w

    5 c: H+ r3 o# M, h(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    * h- a7 s( X  t+ g9 y! \
    * `' N- s( Q( L3 z! r
            std::vector < float > vec1(N);3 a8 }# v' r7 O5 u# I/ F% _
            std::vector < float > vec2(N);) y: f, R6 W7 n! q3 o/ ]) p
            float* b1 = new float[N];
    4 b: f9 c: O4 u, m* o6 Y& O1 b        float* b2 = new float[N];
    $ D/ e7 G% e7 z! M( C8 i' H% J$ r3 g$ A" {5 R6 f9 |$ F
            for (int j = 0; j < 6000; j++)  k2 U9 N: A$ B4 Y4 A( f: E/ D
            {
    - P' U. l+ T4 f0 h2 Z                std::generate(vec1.begin(), vec1.end(), []() {
    5 R6 ?' L6 D9 T. |* V0 J! B9 ~! g                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 G+ A5 J1 u# U# U% ^$ r
                            });
    9 q" `0 ]7 z5 [: f* _. _
    1 Z0 I# P9 `) {) }7 Y                std::generate(vec2.begin(), vec2.end(), []() {0 i, `1 _: A& j6 j! n7 D' f
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    $ M* c9 g! Q. a0 G                        });
    ' D# e  n: d+ J* f5 S, P9 `6 R
    3 q, k. _( G7 J8 V. O. F$ t                for (size_t jj = 0; jj < vec1.size(); jj++)5 j- N1 q! Y9 ^/ I
                    {& N' _% F. m+ T: c  d1 P
                            b1[jj] = vec1[jj];9 k6 y3 J4 [6 I2 ]) I/ v# i% i& u
                    }: d; s, I; N& W7 H1 N& y0 ^
    / Q8 _: k: W$ y
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    4 `2 k4 O3 t1 p/ }                {# m! W3 |+ \% L* ^! Z
                            b2[jj] = vec2[jj];
    . t5 N1 G- @; Q7 Z0 K$ k                }8 F! I% f% d% C: i9 t0 ?
    0 t6 l8 H2 I  r; `* `2 t$ m% {
                    //Method - 1  N=100000 247s  
    ' h3 S& d  m5 l+ U                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; N8 k, g2 U0 \' P8 u  B
                                    0 g# }1 A3 t0 N+ f5 J
                    //Method - 2  N=100000  237s' h* R3 w8 Z2 w+ S/ y
                    /*# C# i' r) W) z8 `9 b
                    for (int jj = 0; jj < N ; jj++)
    ( }  ~, x2 u0 f- F, m; e, a                {3 v. |( O: f! F# L' o3 b
                            fresult += vec1[jj] * vec2[jj];( |6 Q. e- M* x" J' ^3 l
                    }
    1 M* [3 v1 l. a6 W                */
    : ^3 w0 q5 a2 L& c- E7 p$ J                                
    + G% d+ c  z$ j; v+ r6 `  O                //Method - 3  N=100000 204s
    % f# _9 W' c# K: Y. |- ~. Z                /*
    9 Y% s2 q; e. E- @                for (int jj = 0; jj < N; jj++)% E, U  F2 ~6 y1 l9 j) i& e
                    {
    0 T5 g  |2 O. k0 L                        fresult += b1[jj] * b2[jj];
    ( H  n; F8 S1 {/ q                }/ o1 \. Q& q% r0 `6 f# t8 j
                    */
    ( u, J. B2 J, O( P3 v( ?
    5 M7 b& ^/ ^$ K- D                //Method - 4   202s3 B8 ~- D6 ], d% D8 {' K# y: y
                    /*
    5 i( f  o/ l) b! U                for (int jj = 0; jj < N; jj++)8 _2 x5 y  g4 `' @
                    {6 H3 o0 c0 f5 l0 f! l
                            
    . b' F! ~, O$ \+ b                }( ]: W4 z5 v6 w- }" c( ?" X# P
                    */! X$ y# v- E3 J+ X( _
                    //comment out all methods, N=100000  202s                3 q- o. D  B0 }  `% N
            }+ d; {% W  n. V3 L4 c0 w
    9 ~0 `, Q, o  j$ m
            delete []b1;, x: ]+ }/ m' @/ D: C3 S1 i  l8 F
            delete []b2;

    7 U* x4 j) L) U1 H( N4 S- C, p
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! p4 u& I8 I# j

    & }5 Q$ z+ h' A. J  _9 P你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    " t6 h. C6 z9 B( Z3 b& n
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    7 B. J( S/ l9 t6 O* A& B瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?, k  c" Y% B% N" \; F

    & F, B2 m0 S* N6 ~. F' R' W你第二个试验里面的j在循环里面又重新定义 ...
    % z9 {) A5 P+ Q7 S& s* K
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL0 D" W/ c7 J3 T1 i2 M4 V# t
    / `, L. o! y% {2 T
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ( U+ Q( y: }) r9 N2 E内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    : q! H5 f8 `/ h  p
    " I, b7 J  e) n. N2 B不和它 ...
    # l' [" ^2 ~4 b. b8 V( i
    + I) g) ^* k7 ]2 s7 |; x# k7 e+ r; A
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    $ N+ t/ Y! S+ M* k后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    " Q# \5 `5 C8 evoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 S: z) Z6 E8 A. A
    {+ m) y8 j' k( L% G) I1 D- Q
            comp temp, xtimesy;
    " T0 A$ e( q) j+ \; @; ?( t& N
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。9 ~4 Z) }) i7 x" l
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    1 \2 c5 s+ I5 k  L7 zVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-21 15:39 , Processed in 0.069977 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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