设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    : g8 Q8 p5 R% k( K. Y
    2 ~9 ]  v1 f6 l' y% X' v% ~' c自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。0 }( u8 Y. q& P' q7 N) z) l; g* r

    - R0 o, {6 J3 X$ p! A速度优化问题真的很有意思啊。# R. P5 g/ c5 p# @* d& s
    2 h2 Q9 ~: j: N5 W8 |& o4 L
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    9 W6 y$ t) B/ q5 o1 E1 z6 N8 ?把代码贴上来看看?$ o, ]6 N% y6 U; A9 X, S( `5 o  }

    . u4 @2 Y& A9 S7 x4 F! m# k+ U# g难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 ( b6 {' E  `, i% M
    数值分析 发表于 2022-9-24 23:04
    % }7 V% }7 y& h: T2 p拉下来?拉多少?
    - i5 j# H/ J9 s. [  a& y5 D$ R把代码贴上来看看?
    # L% X; ^/ P! w1 z
    . F; e' ^( ]7 x9 P& X
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 S/ q* l' [' k1 b2 e) Y5 c{
    4 O5 U% O* ^9 p5 C        comp temp, xtimesy;
    . `' B2 j" n# d- i! Q! W        xtimesy.re = 0;) e4 L2 s. w1 x; m* i* z4 {
            xtimesy.im = 0;, N& d5 `. E/ r
            int j0 = lenB - 1;" m$ c2 S4 ^2 Y+ A. Z1 E5 o
            int    i, j, i1, reali;
    7 i1 d- k! c' ]        if (lenA % 2 == 1)
    ; i' ]! d: U$ ]" Y                reali = lenA + 1;: c( ~6 `/ w5 k% H9 p, g
            else) g' f6 C/ d: o* \% c1 b
                    reali = lenA;
    ' a5 @, |6 d" I8 k6 X        reali /= 2;
    # _. a" U4 C0 F+ w$ j3 x, G" E3 ?9 T4 M4 \, N7 O/ B
            int nconv = reali + lenB;% M" d* p" [/ ?7 w
            //#pragma omp parallel for- `# P( K" V  U) \# A! |
            for (i = reali; i < nconv; i++)
    ( f, o5 n; p5 E' D/ N+ H        {+ o. i/ U" ]4 D/ `% l1 ?$ U% _, i* ~% c
                    temp.re = 0;
    ; @& `7 G: T$ Y' K% b+ p                temp.im = 0;
    5 |$ A/ G3 @0 ]) h7 s' D: x                i1 = i;" M* @" M( u% z0 t+ a4 q- s( [  O
                    for (j = j0; j >= 0; j--)
    ! Z- _  B' v9 Y  G2 E' Y( V# c2 M                {5 ~, h0 \2 Y. ?- j
                            /* floating date operation */
      a1 e! c1 T' t9 j  w                }
    7 q8 s4 C/ S6 a
            }; t  M% ]# h( z7 Q& K% w/ b
    }
    7 h1 P* {" m9 E& U
    , g4 i# _+ A0 @9 r# f* h* v* V1 N, qxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 w) `" u+ `3 J
    9 I8 ?: h0 g! X% G: J- f红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    / E1 p, n7 h* j$ o现在call xcorr 100次,耗时78s.2 A! g/ ]$ v- V: W- M4 Q
    ) H& R% S7 U8 _8 w
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 6 ^  T) B$ X$ f
    , Q& g% }* p1 }/ v+ Q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:334 ]/ w" ~( A( N% E
    Maybe Debug mode?
    * v: R8 X  q/ B3 A& h! `

    7 t& l6 c) o" R6 M. M4 S2 M* A! M不应该,看我上面的回复。1 p0 W& J2 B/ L  X  X7 C
    8 c. X$ ^' ~, z' I/ u  ~4 ?
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    7 B. ^6 W( w7 c, l4 h% X3 h8 M
    雷达 发表于 2022-9-24 23:548 P; E/ G$ `  p8 u& G
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! C+ H( y2 g/ m% W9 y$ ^2 B{
    ; F8 r( W6 b4 ?( s" T0 l        comp temp, xtimesy;
    " X4 w! q$ D$ u- _
    8 }+ d  G0 E4 S4 S4 I
    这个不是这么比的吧。。。
    ' L/ H' R3 _7 q* J) F- F: ?+ Q5 m* z- i2 m9 f/ r
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ; _' A- N9 o% q! W0 X* |7 [; H' `7 ~  a+ ?8 v2 p5 Q
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    * m6 A% U( H# \
    数值分析 发表于 2022-9-25 00:20
    ; S2 E& E, s6 |- T2 d4 Q- ]$ K这个不是这么比的吧。。。
    * t0 `% t9 _' I7 R9 u* w
    . e4 G- P% l- A; P1 ]您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 G+ F2 k' Y* \# u( ~6 I* C
    8 d$ y' e0 `; ~. V$ V0 x
    有道理。. C4 _( c1 G" B! {1 ?
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    1 |7 s& m& t( i
    6 U) i! f) C- x7 ?" x我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    8 Y. M2 y+ B" X8 c  d. b有道理。
    1 g9 n0 b  A0 b所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    / f% i$ R* L; |- }; k- J" i7 x你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多0 y% ]5 C5 m3 n0 W5 |8 }
    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
      G3 G' }% ^/ b- f4 w这个不是这么比的吧。。。" S$ n2 F: u- @( D5 Z3 {  f5 d

    2 Y: b- |* m) |3 r; i) l您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ( D, l7 I- I( u% j2 A) u: p, M* K4 M# ?
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    2 ~* Z. A7 @  Z" U* l; p/ g" b
    沉宝 发表于 2022-9-25 01:484 U" f3 }% \/ Z+ i5 U5 }, a$ t
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    # W1 a/ j: E% {: e
    " s9 ?1 x# T9 w* Q$ |是的,兄台说的对。
    . V$ ~" q6 S9 s6 k# u+ A: _4 o$ P$ `- {/ F8 b9 R
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    : q/ A) R8 C8 M1 [& O
    $ _, n, y+ Z3 I% F' q4 o. c  [1 T雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。9 }8 ?7 l7 o% S  Q

    ' y- ?) u( x: F5 m3 _, ]比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。6 d% @' L' w6 {0 g' r( r  f

    3 C' o4 q; \# [9 O8 S8 O当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 * o" ]  x: ?- h
    沉宝 发表于 2022-9-25 01:27
    0 s+ a4 k6 k6 a3 d* @# o# T你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    / X8 g, X* T6 d/ i
    + L/ p& n5 Z( q7 s/ n  N# ]* c
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    . K" \5 |& r$ ?5 w! \# D- M0 v# E0 m* W: T" Y& O: ]
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47/ S4 \7 Q1 _+ s; ~( x1 M
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 r# R. c7 w7 x时间差一倍的结果可以接受。
    " a3 z4 n. m; W& E& S
    ; l# _# o9 i4 H$ O你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 & ^% Z6 p7 Y$ g+ ^& y( y
    雷达 发表于 2022-9-25 04:475 \' q5 k  ]7 `' n6 E4 q* Q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 v7 c4 F* j/ p: v% l, a' o7 @+ w% A

    . P3 |2 k# w: n( b
    2 g+ s" Q2 H& N3 _# N) |( _3 S& _能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * T6 E7 W% }) p' X. f, }
    数值分析 发表于 2022-9-25 14:58& t/ c( w0 W9 {/ \. r, {5 ~3 T  _6 ~6 j
    能不能把这个也贴上来,看看和上一个有什么不同?

    $ e; M! ]! X8 @$ U% l0 J理了理思路,重新做了一个测试。
    ' Y3 ~2 j8 y1 r% c7 p+ Q* N做了两个 vector 和 两个 float *, 都长 100000
    , C) e7 m. i+ W5 D& G2 M外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ) F* E+ u6 E4 R/ w& b6 v
    3 [& P- L* B) y- c) i内循环试了4种方法,1 k) V4 `& ^7 e- b4 W
    1. 直接调用 vector inner_product 247s ! L. s7 A% w* Y1 H7 ~" |
    2. vector 循环点乘累加 237s, i2 G: V( {6 E- S, M" b8 E- [- R* F
    3. float * 循环点乘累加 204s
    & \  d5 v9 M! _9 L, q+ T4. 空循环 100000 次 202s* \# R8 c. A1 D# r

    , R! U2 A  C3 N- Y. H: }: w不做内循环 200s
    - t: X0 ]& u8 J- E! a( @; ~9 E" z3 M# Q4 }8 P9 _; B
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    - J& n) V# Z3 n2 {1 o# q, e另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ) b* w. A& B4 y( b3 j6 Q  p! ]- ^4 c0 Z0 x
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    6 U' E8 M/ b( D' M4 ?" Z7 H6 s# O( i& E
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)  {4 |  A3 I' R! G. ^

    ) U0 u& h; i! [* R/ c' T* Q
            std::vector < float > vec1(N);7 @4 j5 h4 q0 @/ B( Q# b! f$ ~
            std::vector < float > vec2(N);6 p/ c4 S) N4 y0 R% b: G* N- m
            float* b1 = new float[N];7 o1 M+ b' P+ s2 I( d' q$ Q
            float* b2 = new float[N];
    # {1 L- _+ A& u# S: `8 `+ \3 ^# e
    & z6 G  v! L0 V        for (int j = 0; j < 6000; j++)
    8 t# e) R& d1 X  n        {
    8 L4 D) x1 B1 R3 W                std::generate(vec1.begin(), vec1.end(), []() {
      a& N, N& z2 L$ f- N                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 G* Q* E! A# ]$ s; M
                            });+ j- M% Y: r3 Q  H% W' L: u' s" j
    $ F6 u/ D! t- R" D
                    std::generate(vec2.begin(), vec2.end(), []() {- m: G, E# Q* x! y: V% X* x
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    - Q& Q7 E- v! L                        });
    . n3 l$ A  }1 K% P5 D# A
    : f3 K5 x9 H5 R5 e0 t/ N                for (size_t jj = 0; jj < vec1.size(); jj++)
    ( d2 y1 g- i2 ]$ g  X9 q4 l2 C                {
    # I/ @% H: j. X+ }1 R                        b1[jj] = vec1[jj];- k9 q+ y7 L7 t  H% t
                    }
    . X1 N, Q( [4 y- [
    # J% V  k5 l5 [4 f) J3 E7 B                for (size_t jj = 0; jj < vec2.size(); jj++)
    . _0 U/ G- z, R1 K+ F                {
    5 `& M, |; c! G# E8 m6 K                        b2[jj] = vec2[jj];
    2 ~( U. ^% g7 y                }
    1 _( C; u; H& L, Q
    " Q6 Q; Y, r' f" X+ E& H$ O                //Method - 1  N=100000 247s  ; Y& S- o5 @8 X
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    # A7 |- w; p* w7 a* Z+ x7 l" C                                4 m! f; K2 A9 y) w$ }) M, j
                    //Method - 2  N=100000  237s
    1 `  s6 ^6 i( r! y                /*
    3 B1 W3 a: H8 N; e                for (int jj = 0; jj < N ; jj++)+ u9 i0 h. y0 E- f% S3 {
                    {
    3 e- @( v  T% Y/ S1 I4 o' l4 h0 u3 E                        fresult += vec1[jj] * vec2[jj];
    & |8 @+ i0 Y/ i/ g                }1 m' T" p# v$ H- I6 ^$ A
                    */% a+ m  C& a' _% `# w, a: \- B
                                    
    , q/ F8 v, Z  [  a/ N' e+ Y1 A0 z                //Method - 3  N=100000 204s
    - y7 Q0 v8 H: I( w" e$ _8 G                /*
    3 B. t2 s: {$ p2 E+ d+ g                for (int jj = 0; jj < N; jj++)
    5 V; k( w* D2 C0 A                {
    2 @& v2 X; B5 o                        fresult += b1[jj] * b2[jj];
    ; r6 Z; _. i- n) a                }
    $ ~* x6 O1 O5 r/ p: {% z                */5 g. f% {7 b, Q6 {
    9 v( F' z  R. q
                    //Method - 4   202s
    ) H# u) T1 H6 H  C  g                /** ^9 h  O0 ]# M/ ~. J; w
                    for (int jj = 0; jj < N; jj++)
    $ ]  M3 F6 n4 J4 U4 L                {9 b0 m* p( d; c+ P, [5 s" C6 K; _/ |( }
                            ' |6 n$ n# z' F' w5 z. `, B7 F
                    }: B5 G' d! I- v5 ^& \
                    */1 d2 ?! z  Y) J, L
                    //comment out all methods, N=100000  202s                ; S5 J( n8 |' Q
            }
    3 O6 |7 g1 U3 `% U4 ]& Q5 y
    % C; T0 V2 n3 p        delete []b1;/ ?. y% E- A3 G/ l- ]$ i' R" M) U3 ^0 a
            delete []b2;

    - \* G8 {7 ]. V+ z& \
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?0 c7 o4 S- h6 ?8 [
    7 V- `6 B$ k+ v3 x3 Y; r3 C
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    & U6 J6 c+ N7 Y  ]! Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15$ y3 b: a, J9 Y& s' v5 Z+ [9 C7 W/ y
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 Z2 w) c& f" F; R' F& f- m$ a7 L' x5 `" [
    你第二个试验里面的j在循环里面又重新定义 ...

    / n" F( n' q: `$ q# ~6 T9 i5 i# j) j内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    / J1 G7 X" N- d. [: w5 N3 c$ Y0 T
    - u; @- X: q# B7 j  s9 x; A; b* w. [1 a不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # p6 T+ \. X; [内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) U- J. d) [- C, l# C! v
    4 ]8 e( T. K: n+ @2 J4 d
    不和它 ...
    7 V5 G& N  Z: A: x
    / P7 i# D4 S& {& _1 B, }* i
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。+ N+ y- J1 V% q8 R
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:540 R- t) Q8 K! F" u# m3 P* X% H
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 r3 @3 t8 h3 N2 y/ B{: D: G% S- c4 M7 n
            comp temp, xtimesy;
    $ Z3 O, g  [, H* J6 ~
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。& M/ |0 a' j( ^# x8 o! W: ^# M5 f
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?5 S1 b- G3 f; [. O& q
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-7 21:24 , Processed in 0.073648 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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