设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?6 s5 M& E; r: h0 @
    6 a, c" U. s/ x/ h4 e
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。* V0 p2 l9 u# Z9 a6 V
    9 P# Y6 Q2 ?2 o7 H! P
    速度优化问题真的很有意思啊。
    * b  w( [( I$ {9 R: [8 {& B9 U# A# z
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    半小时前
  • 签到天数: 1757 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?# C" G$ A# h/ J7 @  R
    把代码贴上来看看?
    0 }6 |# c5 u2 j$ c% |4 @) L  e, l2 c& P- J
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

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

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    % z" L$ \3 j, X  V
    数值分析 发表于 2022-9-24 23:04
    ) v0 b2 d5 U  G$ e4 \2 Y' l拉下来?拉多少?6 B: ?4 E% {* f4 r2 C" [" m
    把代码贴上来看看?

    ; o! J2 g. O3 S% A. w/ t5 ]5 B7 K3 b
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB): {  o& A# m1 y( d' z4 ?2 j8 S6 p/ M
    {1 \% {0 z1 u$ u5 [4 n. |
            comp temp, xtimesy;
    9 Y) ~! v9 ~9 D7 L; z/ o# r3 `        xtimesy.re = 0;% g* a) b8 s/ F# B7 i
            xtimesy.im = 0;
      ~, i# h" J" R: \' q" M        int j0 = lenB - 1;
    - G5 `3 }: A! [. F        int    i, j, i1, reali;
    ' h) R8 r) m, u, [: @! u, v; V( l9 R        if (lenA % 2 == 1)
    & S) m& M. _' g+ B! H                reali = lenA + 1;
    ( l; z3 p$ B8 r; W% r6 H" a        else# e" k4 G3 n, N+ @# ~  J5 }0 e
                    reali = lenA;2 j. [. c! E; r; k3 W5 g9 A6 U
            reali /= 2;
    $ L; g* l$ ?! J/ @" d, x. W7 c" ?  R# u; f# Z7 u. h, P
            int nconv = reali + lenB;
    / {4 W% W/ l5 ~& F) F$ r7 x        //#pragma omp parallel for' B/ W; U+ G, n! {* V
            for (i = reali; i < nconv; i++)5 Q# m; t: s, o' a+ v+ I( n4 n* W
            {
    4 B. ~. m2 e7 Q5 h, v                temp.re = 0;& ^( v4 u. y+ c; D! N
                    temp.im = 0;
    " \9 {3 N) L5 L  C                i1 = i;
    0 H! y7 C6 W. R/ R7 O2 l& V$ U                for (j = j0; j >= 0; j--)
    % f( \) ?! N& v; u7 i                {/ ~1 w9 m, F! \
                            /* floating date operation */
    ' I$ o9 x8 p. ~( ?                }
    , R6 Q; F0 h6 Z5 V9 s
            }# X/ |0 o  R6 q3 O  H7 o
    }7 L+ v$ Q  c) Q* O
    3 ?& a8 A- x* a% @! e) {: @
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ) \  n$ T/ Q- m$ y, D; H" v' C* d3 @0 L
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。! G! d& }; G% V( |- t9 P
    现在call xcorr 100次,耗时78s.
    : ?8 I: i9 Y( H+ z
    : M; T- t- _2 y1 R5 x$ ]如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ) r3 O( B6 ~, U0 E* ~! D% \

    1 z5 ~( _% Y; l# }, R# `
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:336 x$ d9 j( n  z: {
    Maybe Debug mode?

    # `) e2 I4 `# n9 o% W* _( ~+ e. G2 h; i# n7 C- _. y
    不应该,看我上面的回复。
    ' r& i: e9 B/ f& l& F3 y7 k1 L3 b- S  m! ^' B3 F
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    半小时前
  • 签到天数: 1757 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ! a+ `: b& @3 ?) e  D% g* Y' P
    雷达 发表于 2022-9-24 23:545 X  Y7 w* b/ V1 v2 J
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' c, Q0 M- W) c' y9 j# l{- D. h$ G3 u2 {  O- N
            comp temp, xtimesy;
    1 b  R: j* _) M" Y

    ! {  u3 B. j; o& C这个不是这么比的吧。。。" n% s" L: b! N, m, U$ r
    / L% e  r$ F; M  w( \6 }+ O6 |6 I, t# \
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    * V- f: [7 x' o$ H9 z( v7 G7 D
    * {: \7 P/ ?: ]2 X5 V! Q$ W而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    $ a' ]" Q' C. w7 P. k% O' M- R
    数值分析 发表于 2022-9-25 00:20% ?; u  z, P5 ?2 f1 m% b  ?6 ~
    这个不是这么比的吧。。。  X$ n+ u. q- Q" L9 e

    + w7 F% F# ]$ n  L# o6 l2 l% R您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # R/ X! H6 R6 {( x0 v  _

    + N6 }$ D" l8 E3 Q+ `# U有道理。. z! w5 h8 Z. p" N$ a( B3 s$ l
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。4 r, W% J  s& b  e! S

    0 P* C4 v' i5 j3 C我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    # P: c/ ]5 p3 o/ K8 B2 l有道理。. W# g! f0 F+ x
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    % r. T5 X) _( Z+ m
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    $ ^) b' j  N6 F7 fWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20( r( H( t! z9 v, X1 B# c0 X6 Q
    这个不是这么比的吧。。。$ X' P5 B/ c. B& I4 ^/ G: _  v

    % Y) `: _% M/ [$ i您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    5 i% Y; c2 A; d* N0 _
    - l; K- {: H0 j( B8 m7 N9 [2 {现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    半小时前
  • 签到天数: 1757 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    0 f% w$ E$ y# o) `# `: K, |$ a
    沉宝 发表于 2022-9-25 01:488 i6 M( {0 p  P/ A& k
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    4 Q6 N# u7 _$ ~. X
    ; C0 m/ a# b; G. U" p2 F+ K
    是的,兄台说的对。
    2 \, k2 _- u' k3 F1 t, t1 A! a" N' O
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。, y' I8 r, R' g3 Z
    & z  l8 f1 \7 V) G$ ]4 ?( t" n
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    : A+ K9 U# v+ S# H$ f; S2 s9 }3 s* X! S( [
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。) P9 o3 b9 u( f
    2 k0 S* V+ ^: L. V3 F6 L: ]
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 7 s2 A# ]& }8 {; Y% m/ b) w6 ?
    沉宝 发表于 2022-9-25 01:27% o" m/ O9 T- D2 x/ W8 Y+ _. Z0 [
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ' i3 w9 p! \& v6 k  ~
    & o5 _$ ^+ s# A( O
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。0 J' N6 ?' o4 e5 ]$ h6 v8 i

    1 }$ v' x$ h2 F$ v- N- f0 X: A- O我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    , y$ u4 d: ~1 Z* s2 f  c$ I又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( c0 f5 l$ a6 z+ R6 ~* q
    时间差一倍的结果可以接受。
    % q! y. ~: a& }, z) [: W+ O- H7 j- J8 W# b* `$ R- h% T& t
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    半小时前
  • 签到天数: 1757 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    % W/ u3 @, t/ P, K4 i$ V
    雷达 发表于 2022-9-25 04:47
    & n( E% R) ^# @# r! S4 P又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ; Q. |9 l/ j* a" o/ P

    : L  T! q" t) b) Y$ y5 b, L) u

      U' n* L8 h5 n0 r4 v; m2 }7 J6 I能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ z3 h) B2 {$ G  C4 x" \! u
    数值分析 发表于 2022-9-25 14:58
    : S/ I" t# ~- [, r能不能把这个也贴上来,看看和上一个有什么不同?

    $ F' y$ P3 Z  `2 c# {理了理思路,重新做了一个测试。+ T/ M3 c- k. r/ ~6 |. i6 h
    做了两个 vector 和 两个 float *, 都长 100000
    - k% i) o& `# S外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 I3 |( ~* p' ?* e5 ~: w2 p, w
    6 w, a* ]/ d: D7 Q$ r7 f
    内循环试了4种方法,9 r: X2 J3 |$ s. u
    1. 直接调用 vector inner_product 247s
    3 {/ c. ~$ |/ \9 p' u. R2. vector 循环点乘累加 237s
    " @; @# U# D- H# F! \. m3. float * 循环点乘累加 204s4 }( Y3 ^; R, {
    4. 空循环 100000 次 202s
    . J3 K) s+ f7 N, c7 [9 s+ G, t2 M8 g5 q# l& p6 _, q
    不做内循环 200s
    8 g& R+ Z+ o4 E  p  m( F
    5 w- \  `1 [1 f& ?& e) e" H你昨天说的对,内循环本身占比是很小的,大头在其他处理。  i2 W/ M3 b* n) T( t# t4 ^
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: ?% w6 P6 t, E, v
      Q) U  W+ Z: n/ v/ L; j
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)  l5 M1 V8 }/ r+ k, B! ]

    4 Y" Z) c  j2 ]- i/ H* j8 K(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)9 A& D0 l3 y; h2 W) }
    ! O+ f  j4 W9 b, G
            std::vector < float > vec1(N);' o& R0 I) {7 K; W. m( [8 P
            std::vector < float > vec2(N);+ Q* X8 z* y4 U( V5 D! m
            float* b1 = new float[N];% B" f6 X0 y4 O$ b! l" P  q
            float* b2 = new float[N];
    ) k# x/ x9 i( b. A$ K
    % j+ k- t: @1 B$ n1 S        for (int j = 0; j < 6000; j++)/ x4 \7 P! O- Q2 e2 G9 c+ F3 G
            {9 ^- E4 V* k  [+ P0 ]" q$ ]
                    std::generate(vec1.begin(), vec1.end(), []() {
    0 k. H" F" w% X1 C" M7 M/ F& I                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! k3 D0 r8 u+ R. Q
                            });
    : ^  Q7 h. t' P9 g7 f0 O
    2 ~1 s! z1 D! \- x) t/ w                std::generate(vec2.begin(), vec2.end(), []() {
    9 k' P0 w! P7 }. B6 ?8 k# C, q                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    4 r  i5 N$ O/ R                        });' p" n2 t8 K: |# I
    ) a4 c: \$ B8 g
                    for (size_t jj = 0; jj < vec1.size(); jj++)! ^7 |5 |) ]. G: B( w# _# h
                    {( P$ B/ R4 i- C( A5 R
                            b1[jj] = vec1[jj];
    , ?0 Y, Y6 u4 u4 {% }5 h                }1 N8 U) S; H* |6 d8 z

    0 r6 t) r& d8 ~( ~                for (size_t jj = 0; jj < vec2.size(); jj++)$ s3 W4 \1 z* ?3 ^6 Z
                    {
    " c( @% f1 m* G                        b2[jj] = vec2[jj];
    / V1 X. C, D: _                }
    - ^5 i' a; f5 C$ D/ [5 Y# K  J4 J: B* `# j" r2 J1 e; y8 V4 o
                    //Method - 1  N=100000 247s  0 N- D* p! l' P5 J% l
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    % F. L2 |+ a: z0 Q" @" ^                                
      a$ o6 C! K6 H6 a  R; b1 Q: ^                //Method - 2  N=100000  237s8 t! z0 q  N' n
                    /*# D$ b2 R4 Y. _" c3 ?
                    for (int jj = 0; jj < N ; jj++)5 V. i* d. h; M- ^2 Z3 W
                    {" T8 m# ?2 T+ E' D9 x: O4 U, ^
                            fresult += vec1[jj] * vec2[jj];
    & c7 [) _7 {# U" L1 ]/ G                }
    5 f. V% d% n7 ~# i                */
    : R/ Y6 \) o% ^3 W3 _                                ( w  I* T, K4 w1 X' T
                    //Method - 3  N=100000 204s, V) a/ y" [9 F# s2 \8 h
                    /*
    4 D( {# P# u8 M# ], K, u8 J" I                for (int jj = 0; jj < N; jj++)3 I" X7 F! B* m  c+ W' p3 @
                    {4 ~; W! h" w, Z0 Z* J
                            fresult += b1[jj] * b2[jj];
    ( c$ Q4 J0 k, P$ w- D                }
    9 E0 `+ `/ L8 v" [                */
    ' B9 n  ^; P6 V: ~
    6 i: P  h- `2 v* ^5 w6 a                //Method - 4   202s
    5 w2 q  W) m# C: u7 Y  k! w                /*1 \6 Q; p7 b8 l2 w- n- w  V7 c
                    for (int jj = 0; jj < N; jj++)
    1 K" k' D7 P' d1 ]2 V. g' [9 U& J                {
    $ r8 o3 C1 L* K, E) q                        
    $ w' |: \/ L% d/ k5 n8 ?                }
    * `! D9 j# L; k# A                */
    ( C: Q/ |/ {" g1 k& {3 {                //comment out all methods, N=100000  202s               
      h+ S7 j) s$ e. z. a, p7 ~        }, U6 d* h* `) K
    / H4 P. s0 J7 C' q1 q9 u3 b* R# N5 S3 F% a
            delete []b1;
    ' L5 |3 _8 n1 ?        delete []b2;

    / B& N0 A; m" `( u# g: w
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 z& O# |% ]( T

    / n- k+ h0 q  L& B7 P, z你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    $ V% F, W) Q0 l5 n7 ^) y  P$ w3 E" P: d
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    " i3 y  y* A' s/ U+ G! n( i% ~瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 q- I9 c- o5 F6 S5 n

    6 u) g1 F1 P9 I- t7 l) Y你第二个试验里面的j在循环里面又重新定义 ...

    % z5 V: g) j' p$ V内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL6 P+ v; X; n2 W/ l' F" J( ?# l
    * s- F3 s) v4 U' H0 _
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16# d0 V/ D, _8 K9 W1 V. e/ F; H
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL  X' K& E' @) j9 z1 M
    4 Z, e" D2 C! C2 X
    不和它 ...
    ' {* y6 K( G1 [6 [+ s" W( M5 K

    1 Z& |! M, Z" ~  ^. |$ R不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。/ f" h* k/ K3 Q' z4 ]% F
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54) i6 z4 k  I4 r3 e
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) [" b$ ]+ l0 s' C
    {
    . [& w' l3 A3 ~' e3 `  u1 v' |        comp temp, xtimesy;

    * P3 k0 n$ Z0 G  h这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。7 ^% Z8 ]$ |# i2 w5 [* z: d8 Z
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?  k0 R* R/ R' j& z
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-12-28 00:43 , Processed in 0.042752 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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