设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    3 g; h; _) r- ]8 `* _
    * x. l' T& k4 e+ u, V" U0 V自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    $ Q) r) T+ V' z# m" ?( T  [* }2 d3 O  G9 w" a8 f9 E
    速度优化问题真的很有意思啊。5 {" {, e/ |/ }% g/ Y2 C
    3 h4 Q2 v* ]$ l. e$ N& X
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    22 小时前
  • 签到天数: 1781 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    & ~, d. }, o8 \, k: @9 [把代码贴上来看看?
    3 ^, k4 {$ @& L" i
    : Q  X8 z2 S+ N% c7 G% e6 C8 E1 L难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 7 v' J4 ?+ h" c( l+ Y) y/ S
    数值分析 发表于 2022-9-24 23:04
    ! C! n! A9 }" S( `拉下来?拉多少?3 l9 D# A7 J) A
    把代码贴上来看看?
    3 Q; e+ I! X) g
    ( W" ~; M0 G0 `
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , U: v+ l+ U# \' a6 p: J{% q( n* h/ ]9 j- T( Y2 A
            comp temp, xtimesy;2 j% P; B( E5 h
            xtimesy.re = 0;
    , d) G" Y2 n" G: i1 i        xtimesy.im = 0;$ g6 m: V( Z. U& L" t
            int j0 = lenB - 1;* i) P3 \1 Z$ _; U* v: R
            int    i, j, i1, reali;
    * t& B+ l7 N& \) f$ M! w. _        if (lenA % 2 == 1)6 M* n4 }* U' q( U/ J3 n
                    reali = lenA + 1;
    5 s5 Y1 S" z% q3 R        else
    - M) \9 M* o; k* L) d8 f                reali = lenA;
    7 w: R; \, B7 D* A        reali /= 2;
    . r% c8 G6 t  q* L
    . t' j: L! O" {        int nconv = reali + lenB;
    1 k2 J( i' L6 m5 q$ D1 J2 C1 `8 \        //#pragma omp parallel for! I* i" f6 _8 w& [
            for (i = reali; i < nconv; i++)
    & M6 W+ Y' R" h! b" I! W- w        {
    9 k" P7 i/ d/ u5 a' W  F" R                temp.re = 0;4 F7 N" G. R( Y/ ~
                    temp.im = 0;4 I, H' O; B! c: T: ^
                    i1 = i;
    ' q) G  N/ i' c/ l                for (j = j0; j >= 0; j--)
    8 k7 B4 f* G/ C- j& I                {- H' z% t, Q  d+ L1 g2 T- K
                            /* floating date operation */0 w7 ^; o7 q8 G& h8 V
                    }
    # P* h$ K+ j, ]$ Z9 B% w! k( m
            }% O9 H( k: |( Q. G1 @% Q* y4 u5 G
    }
    ! C7 |- V) H: A& k( ]! d
    4 W3 x+ o( F. Dxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    , \% _/ z' z1 p/ e; X, w8 z; m. T6 C$ `9 f
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    - M% V) p* p' \) p' [) u) T现在call xcorr 100次,耗时78s.% W& d5 p6 b& U) z$ ~, \* `6 x
    - A& l5 I6 X+ y& a+ J* a( u/ c
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 7 L' R( X  e- W8 ?6 I5 z4 j

    9 ~' {& Q! K0 `8 L" `
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33" P- _, y% @$ U1 }( d8 @# L) |; X
    Maybe Debug mode?
    2 |1 {( |/ f, h3 o: K/ X0 L' ^
    9 Y/ E% |' m* R9 m
    不应该,看我上面的回复。
    * Y% ^( u8 D( ?" M) Y6 I- ~3 ^5 v. i' E' P$ O$ F2 x
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    22 小时前
  • 签到天数: 1781 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ; k# N% ^/ o' G! z! ?: {& f
    雷达 发表于 2022-9-24 23:54
      g) @! e  P9 A" t2 q& Fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % K2 ~  K. ~2 D( Y, _' A{2 U" M$ }4 ^: y# }: [
            comp temp, xtimesy;
    + d/ K4 l0 L. J* F
    + J1 R, v; X' g
    这个不是这么比的吧。。。
      J! y# Y2 z- ~8 [( z0 C1 c1 P' X  o
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) i' w/ `6 H  O# ^5 ~% G9 A4 x, J$ j; M6 @& a% e9 N5 B. W
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 2 x# K8 J& O  L3 f: X, d+ A
    数值分析 发表于 2022-9-25 00:206 y  v; X, Q- U+ R- x. x
    这个不是这么比的吧。。。4 i2 y* v& A- [0 L

    0 \+ x, e# s8 [8 R) i, O) w3 b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    1 w. V5 p) g) e0 c4 L
    ! I9 s: l2 B4 [6 p
    有道理。
    . K: v" U" t0 a" r$ [. K$ e所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。, [, y0 _* c. v7 e' v9 V4 r
    # ]3 H. W3 r; S! U
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:468 ?  K: N6 t7 v1 c
    有道理。2 T# N6 }5 l1 d
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ' C" `) L6 H/ X2 R! L你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多- ^5 p+ S9 G, w7 ^3 c
    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
    7 I' I" d: H0 N4 `% A& i这个不是这么比的吧。。。
    / U# R+ k: a; P- D' u; }8 B& ]3 z: b; T  s/ Z
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    $ @8 z+ E' N- B/ k
    8 \" S7 Z  L0 U2 @现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    22 小时前
  • 签到天数: 1781 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    8 r/ W0 o/ ^: g" U( h
    沉宝 发表于 2022-9-25 01:48
      K) h$ M2 T8 F* ]. z" [现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    " p$ w( B. _# x9 X; B( B) o* M* y7 {7 L$ Z1 S( Q8 e2 g9 Q
    是的,兄台说的对。  u1 d9 ]- Q2 }9 \
    ) [/ ^4 ]( y! t1 P4 l
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    + M0 E; N* ^* [0 u9 p6 t- r# O
    9 G. w$ W" z3 _% ~$ S9 S; v' E雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。  t% v2 h& y+ q, _, g; ~  M0 [

    ' w% m; A% r4 }; E( f! O' \比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。6 ~. ?0 u. d" Q2 E9 y+ W2 [

    2 Y& X* A' Y+ ?: x当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ( f$ O6 _. B. G, I
    沉宝 发表于 2022-9-25 01:273 C$ w  e2 ^9 V" k( t( s) f! s
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ) W9 \4 M) k2 d, K+ c6 J# ^( Q6 z& J9 N0 I& s, p
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    : h& C1 h: ]; b  t3 Q* H+ Y2 }' `' c' B2 ?' i
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47$ W+ P) w6 c1 q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    6 N5 R# k1 i) p- b: r
    时间差一倍的结果可以接受。
    . K3 l: j; W; S! L, E9 T$ D6 {
    % j3 v2 A/ W. C你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    22 小时前
  • 签到天数: 1781 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ( x9 i! y2 Y6 o/ V( R% d
    雷达 发表于 2022-9-25 04:47% Z6 @- z& Z# c- \- `% ]
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
      ?1 L$ T# W3 J1 _& v$ ^+ N6 D
    ! i6 x  p/ m. m# }" I
    , n! {2 v  L1 R4 `

    3 v; u" U4 v1 D3 t) a能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 - Q+ G# i- V' X* p( H$ l
    数值分析 发表于 2022-9-25 14:58
    / D. t" w. U7 s; U# I: F能不能把这个也贴上来,看看和上一个有什么不同?

    6 ~' b! B7 e1 ]* S理了理思路,重新做了一个测试。
    " F4 q: X) A9 w( i做了两个 vector 和 两个 float *, 都长 1000000 A# s3 n: W) y. f4 j
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." f. f& Y2 I- R* i- Y$ w, m

    # z$ g7 V, l! L( E4 `7 v6 o内循环试了4种方法,+ {2 e* X3 J3 ^% n& O
    1. 直接调用 vector inner_product 247s
    . Q& D# T- K: ^2. vector 循环点乘累加 237s. Y% ~* e( Q( g& Q+ u: t
    3. float * 循环点乘累加 204s
    2 r; T$ f7 w  |$ z# I5 i; V4. 空循环 100000 次 202s5 d+ K, z  ?. y8 M/ R
    # Z+ F- l7 H: J% }
    不做内循环 200s; o( u: l" s4 {2 x' q5 u

    / c) k: \3 X. h7 a7 O( C( s你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 m) H3 X6 [% [# P
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: r" \& o; ]! P4 d8 _. M

    ! x. F- r" J$ S9 X+ j% ]1 J至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    3 W; Y5 t# v  Z$ V( o1 z3 m+ N
    8 `% B  r' W, L2 H2 }7 ](为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ! A# u$ E' X3 J2 M6 O4 z3 K( E( k- K# |  h) U2 _* t
            std::vector < float > vec1(N);
    ' `2 S+ z- R9 g6 {; ^8 ?5 i9 u        std::vector < float > vec2(N);
    6 P4 s4 I: Q" w        float* b1 = new float[N];1 E/ |; }) I. i# Z' T' o+ N
            float* b2 = new float[N];; b6 ^7 x: C& x! ^6 v' T

    $ q) k: `, o) }% p( p        for (int j = 0; j < 6000; j++)
    2 I+ g2 d: k+ d" g        {
    % G( ^! s# \7 O1 F2 L1 |                std::generate(vec1.begin(), vec1.end(), []() {4 _" i& g' n! ^5 n& f, h$ I
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    0 p- S) B5 V" V8 I. N* Z# X                        });
    ; ]- K: B2 y- w) ]( d
    $ ~  V) f  B, h# t4 X6 h                std::generate(vec2.begin(), vec2.end(), []() {
    ) a1 O' p3 b0 z* d8 @& M                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# o5 |# {0 u1 I. v- d; k- z% W
                            });5 I1 q! O, ]. u3 D
    - ~/ b. x0 }9 X# [/ W. q
                    for (size_t jj = 0; jj < vec1.size(); jj++)# C: P0 |6 X  T7 I
                    {) F& ?+ }; O% h
                            b1[jj] = vec1[jj];, R! l, H1 x. A, l+ s: ^
                    }6 X! Q6 K, B9 t9 V
    - Z( u" s5 Z' M9 z' B7 o5 J
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    % O/ `) o, Z" W: ~- @                {6 r6 a" M1 `! J& d- R8 m
                            b2[jj] = vec2[jj];3 m2 X. g, ?* |& z* O* K
                    }; I- v) o6 P  Q* t6 f) A( |

    1 @( V3 f8 e. d$ w  ]2 n                //Method - 1  N=100000 247s  1 B+ b* F) n5 S6 _2 g& s
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    & h% X0 u( c+ H8 J+ X                                " O" P8 ]) D/ Q3 V) D0 z% W
                    //Method - 2  N=100000  237s
    . @6 e4 c1 ?# [7 I                /*9 u, y( v* b4 u6 Y  D
                    for (int jj = 0; jj < N ; jj++)
    0 y: T. z5 t' E1 a4 U3 s/ P                {7 i- `2 w/ h1 z  J5 X) `# z9 s
                            fresult += vec1[jj] * vec2[jj];6 w$ e/ Q/ r- P" l5 o- {
                    }
    : Z# U+ X5 d7 M/ I- t& u# a% P3 J                */
    ) X! u& h4 A4 O! [( C+ u                                , |/ z9 T2 j1 G8 m4 k9 f& e
                    //Method - 3  N=100000 204s$ ^  k4 b, l3 E+ `  ^. z
                    /*' _6 h6 s- z3 r  W0 f
                    for (int jj = 0; jj < N; jj++): }3 u  I3 [" R( m3 g# V
                    {
    , @0 g4 L/ b3 u) v  v4 l6 N                        fresult += b1[jj] * b2[jj];; `+ t2 w4 Z* U" F( X
                    }
    * P# H7 h6 p% @  i" [! D                */
    4 p6 S# X& }, P. a+ E# \' l
    , h( j! w2 W: H                //Method - 4   202s
    & T$ V7 F$ O7 |) y5 ^( s! U  j                /*. @8 h- Y. T+ x* ]# j
                    for (int jj = 0; jj < N; jj++)/ `' \4 \& L  i8 {6 l
                    {
    ) h6 h. ]8 N6 D% r" R                        5 G) f* [; P, p1 m) G- Q$ l* C
                    }
    7 f  {' ?1 @/ r: \/ A2 }% d1 Q                */( w8 L6 [1 w9 y- f% m- F6 k# y- V$ g
                    //comment out all methods, N=100000  202s               
    9 [; z; ~' Z$ q& B        }
    6 g5 z6 H: A& ~# }
    9 z2 H9 P% z# H- L) a% p( c" b1 Q0 s        delete []b1;8 `) X5 r7 Z7 T3 V
            delete []b2;
    4 S# T& i# V2 w6 B8 i; z( y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    # C9 W" W$ o1 \5 w$ a) L4 u4 i$ l4 `, G: U6 s
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?/ o$ ]$ T/ S# @; t1 h! H
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    3 j0 M/ v2 S5 F% M瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ) A- x. {$ ^8 h$ _' M1 T
    ! Z% q) c7 e3 ?  R6 s2 R你第二个试验里面的j在循环里面又重新定义 ...
    8 Q3 o* w, {( a$ J! V; N* Y
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    9 R: H( {0 V/ a1 t3 p! J" N/ s
    * n; L( p$ @% i. X不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16, U( r& z; [- o3 ?1 E: _; b
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
      [& ~% L7 R* o: n( x+ T2 L# s) B% t' d; {( d/ q' r$ `" c& t
    不和它 ...

    % q- \  h7 m2 i9 t( t% |# e! X& q, Q
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。, C/ o! h" y  {' \
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:542 ?7 r7 ^) w& _4 L( S$ k
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB): D  I2 H; t) c& [7 g9 W! L
    {* M5 B9 f1 ^! q/ L1 a3 T1 g# `
            comp temp, xtimesy;

    " r& m& d6 z; D& t这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。3 I5 K+ O) Z0 Y
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    6 w/ c+ g$ B9 }2 l7 s7 [VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-1-22 23:39 , Processed in 0.055937 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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