设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
      V% K) [! [% T) \3 E6 [! E
    5 @& @5 U+ E# X  P自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。; q' g! H$ h, o

    - \2 I1 O& F- O* M0 I' @0 {5 v$ g速度优化问题真的很有意思啊。
    8 O- Z5 M$ }8 `0 {; Z. P* X* v5 j, f6 [/ v% ]) ]
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?! w. T# _- }" p# s  b
    把代码贴上来看看?
    / _& L2 v5 L% z) C  n* @/ P5 g6 W' C6 h/ C  g; H7 ?7 M2 J; b' L6 O) ~3 C
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    ( Y4 \8 z) O4 a# L. E
    数值分析 发表于 2022-9-24 23:04
    ; U" g- V& s. ~2 h3 j' j拉下来?拉多少?$ C6 n/ l, \/ z7 ]# @* S! [/ `+ x. s
    把代码贴上来看看?
    : i) E6 L4 U7 }) `
    7 ]3 M- c$ P. M, g0 U
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB), u( f7 c  Z5 m
    {
    * m3 k3 E+ s& {* o        comp temp, xtimesy;
    , t+ S9 e9 }. E  O2 F4 Q: C        xtimesy.re = 0;. x& N  |8 _9 C
            xtimesy.im = 0;2 a/ {# L2 A- Y, ^/ q
            int j0 = lenB - 1;
    1 e% K% c7 |) n- l: y" l* Y! E        int    i, j, i1, reali;# e  p, c: S/ x% y8 U7 R, k7 B
            if (lenA % 2 == 1)
    $ w2 I9 N3 d( O                reali = lenA + 1;
      v; O" I# B$ j9 v        else
    ' v5 _; @- c$ `/ e' G2 a/ p                reali = lenA;7 B/ H+ W8 {$ a7 S7 d5 }9 L
            reali /= 2;
    8 r; ^7 I8 p" a- J7 g1 x* Q4 o6 g6 ^2 n" Y- o1 u
            int nconv = reali + lenB;
    8 e. m6 p( z& ^* k7 K        //#pragma omp parallel for
    9 A& |; e' ~" ^- j        for (i = reali; i < nconv; i++)* Q& R# n! }' k" W
            {
    ' l& i# a0 y  Z/ _                temp.re = 0;6 d5 j. J/ F* @5 `8 Z+ ], H
                    temp.im = 0;
    8 M+ D2 R) R% ?0 u5 X                i1 = i;
    2 J6 ]+ x" B" n, [3 ?                for (j = j0; j >= 0; j--)
    ' b* L8 l$ ~# Z) Q0 W' k' \                {% a& e! n! e% r  b+ L: f
                            /* floating date operation */
    4 O4 _( x3 T; c; H* r                }
    / f& w; l8 ?9 @& q4 b$ F) ?1 t4 i
            }
    6 A5 B* [7 X8 M0 A1 |+ R4 L}+ j7 q- u$ L9 ~& T6 P
    ( g0 M- r. C% \& c
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样) ]# D: N( V9 |; S" [# Q" d" W/ a
    - H- h9 e/ x1 W# r, `$ M! s1 |. m
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    . U1 G1 x/ l4 b7 N" ?. G+ r现在call xcorr 100次,耗时78s.
    ; k* V; @, H8 ]5 u6 R* k3 ?
    # W( x2 g$ v' B# u如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. $ u+ g" O5 Z+ @; K
    & c* o7 G# e& Y3 B
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33; N7 G- e0 n' Y4 Q
    Maybe Debug mode?
    9 H6 J. N( k4 D+ ?' e) h5 O) I

    - z6 w: \& e! f9 m1 Q, i不应该,看我上面的回复。
    6 Y7 Q) m7 Y- g1 V; P  F0 ~; J& S# ]; d9 e; I4 ^
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    & Y5 P7 m, N% q
    雷达 发表于 2022-9-24 23:54
    2 h) N. B% m, r' t5 wvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" h- i' J2 s; }) l9 A) V, T+ u
    {
    8 o& D$ j- _0 o% U8 z8 I% g        comp temp, xtimesy;

    0 r7 U; [6 D0 p1 F: b
    : J% R1 Z& v( S$ o  b1 p4 ^% e7 o这个不是这么比的吧。。。
      @$ o& D& H; A- t. @1 t0 B
    " D; W" k- i9 ]' y* T您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    , X- y) \' C4 C6 y; |0 _: y1 ]8 S) }( }( o, l" `
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    " E" v+ S* }; W: G/ Q1 r
    数值分析 发表于 2022-9-25 00:20
    ( j7 Q; G5 N3 B& H* T这个不是这么比的吧。。。4 O- Q/ ]. {& c( b8 j+ m

    # P2 b* |; ]9 E8 Z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      T6 A1 v( ]& A2 Y

    $ }7 o, a+ o- E4 [7 g' h( m  ^有道理。
    ( s8 ]8 i6 m& `7 O  R所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ a! m" N4 t, a6 U6 _5 B; L, L4 s/ F  d6 S* B( f6 c
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46+ Z. p7 _( l! c: A* M- W$ w
    有道理。
    + C+ c( }. m' [* s9 j所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    3 Q( W1 H! n2 p6 r" e% H+ @. M
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    : o) A7 t( k. I$ Z4 XWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:208 s6 `% z) d0 L, i" C
    这个不是这么比的吧。。。
    5 O9 S4 u. q! n  D0 _, R2 L5 }+ [# P& N( @; X6 N" A
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    3 w  ?" p$ r1 @- ?* n( U4 N# A7 z+ `* W6 Z2 S4 A7 N6 A# j7 w$ W  x8 z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 / g2 e% o9 s$ e/ h0 D: q
    沉宝 发表于 2022-9-25 01:48
      Y* s0 \! J5 Z: u6 Q现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    & w, h9 z; `. X2 D, \4 K
    ) `- d' B$ O1 s0 r6 M是的,兄台说的对。( }# U3 n  T, {! `! b- U
    # s# ]5 N1 U/ {( X: E& _
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    , R' |" R# u  p3 B
    " }" ]* P& u; c  A# c0 G雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。6 O/ U/ A9 T+ A. W% n# a( n/ Z4 U
    3 L$ e) K0 E, c  K/ D
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ) j  e8 M3 |* S8 Z1 |  l" q2 K* ?% d+ q5 F+ [
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    " y% O- t1 z& F, t* [* g# {
    沉宝 发表于 2022-9-25 01:27+ G2 D# L5 v' w# f# j7 C% P: b- T
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    1 S: g2 ?( j: B
    0 W2 `. Y  T( F& u5 z又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。/ d, `4 [/ _* k* g1 B3 b( \8 j4 X

    4 O( |1 O- d7 o我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47/ m+ S, u; d3 \1 k% j
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    " `# U- t: d% A5 _& Z4 s时间差一倍的结果可以接受。6 b0 H' i$ I  Z  d, D

    4 G+ v& c$ H4 S1 D7 W2 S4 Y你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 3 N6 q  u0 t' T; C
    雷达 发表于 2022-9-25 04:47- b5 i+ x2 N$ W; O' e7 U+ ^
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    5 V' o0 K. d. Z7 }. C! q. ]2 o$ Y5 x0 Q( A! |: S- ~3 x+ r+ D! c

    + t" u; p3 e/ d- O" X3 S/ ~+ R# t' o( j0 ?
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    : N1 O* v) h. L8 P6 g' I1 L
    数值分析 发表于 2022-9-25 14:58
    9 r- X5 ?0 A- z* @能不能把这个也贴上来,看看和上一个有什么不同?
    4 A) O  ~4 J* Z1 [
    理了理思路,重新做了一个测试。
    2 i8 ~1 m, Y$ K; T+ A做了两个 vector 和 两个 float *, 都长 100000( L1 ?  I$ q. l3 [: g0 `
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.- G1 s- S' ]7 r
    1 f; t+ T0 t& l* t2 r
    内循环试了4种方法,
    % V9 `0 h6 A% i7 W# s% W$ B0 W1. 直接调用 vector inner_product 247s 5 ]' Q; k4 m- F+ m) d
    2. vector 循环点乘累加 237s5 w3 @) f3 \5 _1 q/ H6 u
    3. float * 循环点乘累加 204s8 N; l% t% p1 S  T; ]# k9 F7 q
    4. 空循环 100000 次 202s
    7 \; i  N: s3 i% _: ?2 P
    7 p6 s& z- T' g! ^4 E0 [) }不做内循环 200s
    0 d  |- ^: X9 V0 n3 L* [% T
    . T$ p/ X  n1 s1 i你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 _* d+ W: ]+ _& {0 j
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) }! F% n& C0 `4 U

    7 L/ \6 W* ]# O- J至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ( ?$ ^* k. l& S, q& I7 g6 U
    / W8 j+ z) l/ Y4 a. C5 }! U. q/ P(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)9 u% z. a# @1 A
    1 G- T( s( r; V3 s8 ]; }9 K
            std::vector < float > vec1(N);& e9 ~+ p! [" F, r- M8 |1 P
            std::vector < float > vec2(N);
    . e1 N* X$ ]4 `# C( j, S        float* b1 = new float[N];
    ; H, q+ `4 ^3 n& r+ P1 i* D        float* b2 = new float[N];
    8 B& ^  E+ J% a8 e
    ; }% v3 E9 d! k* q        for (int j = 0; j < 6000; j++)
    ( V; l6 y3 Z" f' J9 c) Z. M9 e        {
    , w  N5 I$ |5 }7 u' ~                std::generate(vec1.begin(), vec1.end(), []() {0 I" S0 t  R7 j1 _6 p6 C  j
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;( a5 c/ R! V9 U* }2 u  b& M
                            });
    ) P* a) w) k2 S1 k
    ( [9 w0 q5 t; f. l9 j                std::generate(vec2.begin(), vec2.end(), []() {
    ( I+ u3 W8 O. x: O. J+ u                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; [. E8 d. i# b
                            });9 `# _8 e* n7 s7 H/ I
    ! S$ H# o4 p, Y7 o3 D' ?
                    for (size_t jj = 0; jj < vec1.size(); jj++)- l& a1 U6 c6 B5 V# c! U2 r) T
                    {0 d+ [4 c5 y2 o% E6 o0 S& F
                            b1[jj] = vec1[jj];
    # r! }; l: [! _4 x                }
    . a9 D+ E7 x) @) b, f) F, p* u, J$ J2 a
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ( X+ ?9 _6 w5 }6 e; N                {2 Q6 e! x! P4 t
                            b2[jj] = vec2[jj];
    " D' B- C( v" S- `# u                }
    $ J7 F2 P' i0 h) b3 Z% t  o( @4 p$ e) J7 }- ]
                    //Method - 1  N=100000 247s  3 p8 W) B# w6 z( R4 x2 ^
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 T$ k* U( k0 ?; m& `
                                    
    - E1 q5 C$ E5 A- ?                //Method - 2  N=100000  237s; a5 Y5 k1 _+ _/ X% u0 d
                    /*
    % ^0 q3 n9 }( S, t$ w8 }; ^% w                for (int jj = 0; jj < N ; jj++)) l2 x' q5 _0 I  x# F. c) z
                    {
    9 }/ ?7 s5 V& Y                        fresult += vec1[jj] * vec2[jj];
    6 h& B" S+ U& K+ z: o5 k  b4 _                }
    ) n' v- s# L2 n  \+ U) w/ {  z9 C                */
    # p& t' q5 T$ y# O7 K                                * _0 f( ^; M" c3 g0 O
                    //Method - 3  N=100000 204s: B) W' }# h' z( K# j
                    /*4 Y1 y# q, k* Y5 [* y( G2 u( b
                    for (int jj = 0; jj < N; jj++)( c9 L/ N/ \& g/ Q
                    {
    ( H: G- N, ?+ U. n                        fresult += b1[jj] * b2[jj];
    . Y; W5 S6 D1 C$ m                }3 ~3 C; y5 g( z* r- @
                    */
    : n# M+ o6 Y7 V. B( \1 C3 Q+ w- K* X8 Z" @3 c$ Q9 Y
                    //Method - 4   202s
    : d; Y9 S7 v, J+ W% }                /*
    9 Q6 ^4 x- N, G% c3 _8 I% q3 d5 d                for (int jj = 0; jj < N; jj++)
    ' g( Z2 U" j+ m& ]) z" E% B* I                {
    ' M9 i. g( u6 e8 C) t& N                        . E- G- j  A. d. p9 b' D3 q
                    }0 k, x) f) d/ Z' \0 M& @
                    */
    $ Z7 x# ]; U5 F- F9 t0 X, j                //comment out all methods, N=100000  202s                : l0 I; `  W4 w
            }
    ' C) ^3 k5 b. F4 p+ `
    ) |- q3 N& z. g1 s: v        delete []b1;9 H  E' o/ w7 v1 d3 Q
            delete []b2;

    # R3 O$ O; Z! t, C/ l- x4 e
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 i( v9 i- I' X6 O' i: x

    3 @0 Y/ l  o2 L0 o  k* ]你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    5 Q9 b: C; b, I9 a5 @* P
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15, }, ~, S& d2 x- j% h4 ^
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?" w: V- P4 S+ v* O; w

    , G# d, W  i! E& m' f你第二个试验里面的j在循环里面又重新定义 ...

    2 d3 S/ C" o' W1 J( O内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 ?. v1 _: H( P1 C7 i4 ?" }3 ~6 Y7 ~4 |, S
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    6 _( o+ H* a! r* D5 y+ [内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL& N3 k; F$ y( V& u3 c6 {+ p

    7 P; ?3 w1 @: X. H不和它 ...

    8 Q, z/ D( w# M' f2 G2 |1 H" R* y7 ^9 F
    ! a! z( a5 k! Z1 C; C& X不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。. z! C, \( T% Z9 m
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54+ Y( X9 s# L! ?9 t4 c
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 k, i8 ^! Z9 Z4 p" M3 x; L5 c# Q
    {/ N( O# N+ F- b6 i* K  F0 X% F' w
            comp temp, xtimesy;
    7 G; {, X; b  a* n: p
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。9 A8 @4 K' }/ T. l+ h
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?: c- i- M4 q% ?/ d8 Z* w8 I
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-7 00:23 , Processed in 0.070385 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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