设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) V8 v3 P- s" D/ P) O5 J+ }) R; Q' d
    ) [. E4 v0 {6 p8 P" z% U
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。% K3 W+ k  V8 A
    ( L- ]% M, |. w. t
    速度优化问题真的很有意思啊。7 z: k: |% C3 N
    2 T0 {. U  ]8 q
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?3 Y9 r2 I# y% x: p8 u7 q; H
    把代码贴上来看看?
    ' ?. j; v4 l) h2 B- z5 I; [
    $ \% }* Y4 t- u4 {/ o3 N. I难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    5 M2 d: `1 q+ D5 D
    数值分析 发表于 2022-9-24 23:04
    . l( d( k2 Y/ B3 N( Y, n* i) a拉下来?拉多少?
    2 ~8 Q& Y1 {" p2 R4 Z" b( |+ f& F把代码贴上来看看?
    6 E+ a8 a/ u! I: N8 P7 ?
    ' |0 z, e6 ?; t( m2 `; }- N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % k% G4 n% a- F+ X{
    ( s: C- Q9 H9 r9 n  Z- ]        comp temp, xtimesy;
    8 [" Q& ^* }" e5 K% s7 L* h# j        xtimesy.re = 0;: G7 W1 R( P0 G" `/ l9 T2 Q
            xtimesy.im = 0;
    ( \- v4 S9 {. d# w& c2 d        int j0 = lenB - 1;
    : p9 T" z  S5 a& W        int    i, j, i1, reali;
    4 v% C+ p1 n- U4 x7 l; x        if (lenA % 2 == 1)
    7 r% X2 A- l) G# z1 k                reali = lenA + 1;
    ( O( ]1 F- f# `, w+ M$ ^        else
    . L+ m4 q; g* N# h                reali = lenA;/ N, P7 R: p3 O( Q. a$ P
            reali /= 2;  Z! T- g- D2 Y5 e/ J. t

    4 j8 l: A6 M; q        int nconv = reali + lenB;
    3 G  s0 ?/ Y) Y' x% N5 g+ k5 E+ M0 f        //#pragma omp parallel for
    $ a$ G- t- q) b        for (i = reali; i < nconv; i++), k4 _# K! i& J$ h. K" z5 y
            {8 o$ G- y: R4 m0 [
                    temp.re = 0;6 N: R/ _9 X3 ~- `% r3 t5 W
                    temp.im = 0;
    3 L$ h% d  w8 S$ R6 O9 y                i1 = i;
    ' `4 q7 q6 d4 D1 `3 B9 g                for (j = j0; j >= 0; j--)* `+ f5 [3 J2 O! ]5 l! n) B
                    {
    + e) F$ x% _# k! U3 G$ K  D                        /* floating date operation */
      O5 Z* S  b; D; X. T8 d+ w  \                }
    0 A% Q8 T7 S+ y  a# H/ }" `
            }5 W5 C, \; C0 i4 o/ w, C
    }
    * @& [7 z/ s0 c- k: \' l' Y# P* a
    & l  }2 [4 f% r; ^8 k+ vxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样( A/ ]4 X& M: ?+ h+ P- o# ?/ ?) T  c
    & I  p1 J$ p' p* x) c
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。2 d  y6 K2 v1 |: P
    现在call xcorr 100次,耗时78s.
    6 F  y2 ]1 @% E4 s
    , I1 ~% q. x( q* r如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ( S" E/ |, }+ V/ F/ N# ?, j
      c7 o) v9 K) l% s- a' X& J
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    & K* m; K8 B" x" o% U2 cMaybe Debug mode?

    , X$ z* D5 D- s% P7 s0 o5 ^6 a/ c" m7 N! R
    不应该,看我上面的回复。
    6 I6 E* y( f% C1 y( p+ X; c" _0 t3 \
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 # D" \8 L2 c% F' w8 K
    雷达 发表于 2022-9-24 23:54$ A4 Q1 c9 {% b# \
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 U8 s+ T" E" p. r* z" T6 J
    {
    % C+ z( O9 I3 g6 Q5 t" Y" i        comp temp, xtimesy;
    & G( E# j# i& v+ M1 c( y: t

    ; X4 v% k, H( m- k" Z2 }' v3 [这个不是这么比的吧。。。
    0 h7 b0 W2 L( C5 [' K2 R) k
    7 ~6 F: a3 G4 `) p( j您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' x/ o  J0 ]( F% \0 C/ D: A3 j: P& `# B5 S; F7 w0 w: j
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    . w% r' r+ }( R( \* p, B
    数值分析 发表于 2022-9-25 00:20
    ! C% f1 {% A0 d& h/ V这个不是这么比的吧。。。4 [; U+ y* a% f9 T5 R' H, \
    / N! E1 ~* O$ B5 Y3 a! Q, I/ h
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    4 D$ W, s( Q1 B5 j9 P7 d2 k' O" _
    ! F, Y) J- u. S: K5 ?  ]有道理。
    . L* H( j9 d9 T9 N9 y% z所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。& H* L% t* [  u: A# v! w

    $ j# \3 ~( N1 ?/ d6 R. K我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:468 |+ J2 \0 ]. [0 `
    有道理。
    & b3 ]) j- \, y' S! s2 z6 H& X所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    + u2 E) T$ V. c: s/ j你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多& n1 c; X8 i7 |; k( e
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:208 v4 O4 t* t  L! t. K6 a" M
    这个不是这么比的吧。。。7 W. `+ d/ b, h9 W$ I  M
    # P- r# I+ F0 E' c1 K
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    4 @' q  |+ c/ w
    / m  K  L3 I; B现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 , O5 R$ ^4 x! Z5 [0 c
    沉宝 发表于 2022-9-25 01:48- }, W5 r- Z0 O  J
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

      f% N  z$ V  v/ `" n7 @4 X
    ; ^: I8 {  O( Z是的,兄台说的对。
    " T: Q; Q# `. P
    ) D& u- p, o8 h其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    + U- S! Q& M2 R3 l2 c5 T% k' F, F& @3 V9 |3 J
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。* D# t" ~3 _6 ~' \' l
    . K: J, ^! {/ _* K1 ], k, w: U
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。; }! j: n0 Q; c" g% v" I

    : j2 e/ y9 M3 `+ Z当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    1 F/ v* K" b, |) Z1 }. e1 N$ s
    沉宝 发表于 2022-9-25 01:277 D5 E$ a" J& |4 y+ u/ f
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    8 `6 R+ V  m( s
    ( X0 J& |- N0 o! A7 }
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    5 `. r/ b! g& H% o! Q
    0 D9 Z& B' s* X. {/ W我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47* H& F. ?& w) ]/ d. G
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    0 w; j4 M8 [6 M' L1 x* r' v) S! [! W时间差一倍的结果可以接受。
    8 q7 T& d9 U9 K1 \) b# I  ^1 Q4 v
    ; V6 n; y9 j! W8 \% Y1 t你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    + d4 y% y8 e, z* _4 ~2 K7 K
    雷达 发表于 2022-9-25 04:47- ^: {: ?) P- a7 C. v8 S4 G1 l/ J
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * z0 d# Q1 `* p- q  J

    , j  Y( q0 ^1 K5 i. V9 o; T
    / H1 a2 W2 B* ]
    * m; Q7 x) ]2 ?  K" g. ^能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ! b9 }; R# @' s3 q8 I9 {
    数值分析 发表于 2022-9-25 14:580 c8 f2 o9 u# a# w8 N
    能不能把这个也贴上来,看看和上一个有什么不同?
    # m4 g/ N# |: U) P# ~2 I+ C- p
    理了理思路,重新做了一个测试。1 p7 k8 O# g- e4 h, W
    做了两个 vector 和 两个 float *, 都长 100000
    0 j5 S6 A! q5 x1 @6 n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    : \5 K5 v7 Q3 X' ]; z2 K% ?
    ! U( @& x# t: x& O9 ^+ L内循环试了4种方法," c  t" u" `" D* e* N0 B
    1. 直接调用 vector inner_product 247s 6 e; z! M3 K; c% {& G  F2 V
    2. vector 循环点乘累加 237s( y/ r9 U) w" @/ e
    3. float * 循环点乘累加 204s! _! Z! j  N. V/ O, Z
    4. 空循环 100000 次 202s+ X" M2 r6 |- ^9 @' @

    9 j0 I: N% H, b, ?- o' e3 r不做内循环 200s5 j3 X6 c0 y/ X( w+ t  C' T. u

    " q7 i& i+ ^5 h' ?' |  m你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ! `8 z( ~5 r/ ]- I另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) [, d* t& Z# X

    8 }- [6 V) ?) W; I1 u+ z  O至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 ^: P& i& n! i1 N4 x5 z, s
    : U# [  A- y" K
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)4 n- S9 t8 B# |& u- F

    - X5 A5 L7 }2 r# A: Z& c
            std::vector < float > vec1(N);
    . f3 V# l% K( N4 F6 m        std::vector < float > vec2(N);# s4 s1 w" a0 I! ]' M9 t  q) p" Z
            float* b1 = new float[N];& t9 }4 h+ u- |/ T, j% E
            float* b2 = new float[N];5 V; c! x, }- t( d$ s1 w5 j
    ( E% h" r$ V( i3 o" c( u" h
            for (int j = 0; j < 6000; j++)' R% h8 k5 O% I6 T4 o% |
            {1 v. c% S  o& a* U  N' _
                    std::generate(vec1.begin(), vec1.end(), []() {
    # \4 N$ ~) S4 j) K0 \                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ r/ \. E; M. g, s* o
                            });& b3 F3 N5 o+ A; d" z2 y
    ! d8 D$ N/ M8 V) E3 k
                    std::generate(vec2.begin(), vec2.end(), []() {: t7 r. p( e# F2 H
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 i  k8 C5 a1 H
                            });
    . d# o1 {8 H& v! U$ Z
    5 q) T. M4 n1 o& @9 }                for (size_t jj = 0; jj < vec1.size(); jj++)( P9 {. [. _% i
                    {
    1 {9 _! i9 u6 e% U' w/ S5 T                        b1[jj] = vec1[jj];
    + q& N( S# l, g1 i$ F, |                }
    * n/ m( o- A- s8 S7 Z
    # y+ G9 l) }8 o1 k  g                for (size_t jj = 0; jj < vec2.size(); jj++)
    + L/ G! @( G$ L6 `: u- _" {                {* f+ Z4 G! P+ B4 t. m
                            b2[jj] = vec2[jj];8 W2 X7 W/ e( S0 S) d
                    }
    * t0 D. b2 g2 l$ p% i% Q& w) [( `8 v6 L- T( t4 @* F
                    //Method - 1  N=100000 247s    x3 O9 ]2 H0 o* c  [- |2 I" k. G( A; {
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    / e, F1 |( c  C9 ^9 H                                
    2 ^5 m, i: P. p1 r% s! Z# h                //Method - 2  N=100000  237s
    % J8 L- `2 ^0 j# {9 [1 N5 w                /*
    ( G) @* Z, L( Y* i4 t1 l                for (int jj = 0; jj < N ; jj++)
    : K6 P; w1 l' E. L, H! @                {# z8 ~- R2 V( O. t
                            fresult += vec1[jj] * vec2[jj];
    + B! u1 Q8 i! N9 N# N1 R                }
    4 }6 S/ s4 ]8 d                */% y/ q5 n: Y6 S5 w: K0 {7 N* g  ?
                                    
    * c3 t4 V: E! R, y                //Method - 3  N=100000 204s
    ) j" |4 I+ E5 y, ?                /*
    5 p; V9 Q0 c2 j5 \                for (int jj = 0; jj < N; jj++)
    ! q5 `0 B2 e% v' M* k                {
    ' [# z# [$ J( d                        fresult += b1[jj] * b2[jj];
    7 K+ B. x5 v) ^/ Y                }' Z+ r  v. v5 d+ }$ }' \+ n, x! E
                    */: K5 Q3 d1 K6 k4 M2 x1 h8 @

    + U  |9 @' Z" H8 a( `8 l& T/ t9 \                //Method - 4   202s
    2 v, ?. M2 b3 y3 g                /*
    2 U$ W  E" j6 i/ p; o                for (int jj = 0; jj < N; jj++)" X: Q/ m+ l9 G* \/ ?2 `7 U; u4 E
                    {
    2 C+ P9 _$ k" d5 t                        ) N' l* M! O  A& H- ~1 s
                    }  h& ]1 @1 p( V& |7 F1 s8 E, c
                    */9 T. R, H# V, N' V
                    //comment out all methods, N=100000  202s                7 C% y! W2 C* b0 s$ k0 a+ q
            }: z% z- Z6 a8 c8 U( Q1 K- }" V# F/ l
    2 C# O' [, N$ E' M0 s. e
            delete []b1;8 g1 }" g* a& c, A8 y3 G$ L6 N
            delete []b2;

    / d7 S3 V5 j5 r- Q# B
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?' M. h5 J0 Q7 t: W$ ]+ I. A) \
    . W0 L  f/ o& N- ~& |8 j
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    % }$ C7 x9 @( e. c2 A: F! a
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    " A$ G8 B2 F$ R) X瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! P4 ~6 F7 L4 [( u8 z3 i, I
    - L* Q* A" [1 |) F4 p( g9 P4 C- g
    你第二个试验里面的j在循环里面又重新定义 ...
    ' D! {6 E* o4 s/ S: D7 `
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    - v6 L5 R+ z$ Z6 u; M; M
    # P5 ^- |+ c8 e/ L4 i1 u不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16, Z& j* M( Y1 ]/ {* p  l
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL$ o8 \' n: h: Q" N
    % v- j. P1 i. z5 Q$ P1 O
    不和它 ...

      B! M/ ]- |# J; V# a+ k' T
    $ r# l9 l( }, o- c6 P" J+ _. Q不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。* T, E" Q+ s: m# y: \0 ?* t+ e
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:549 ]/ J/ A4 _' ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 e$ W: |* ~" H1 O- ~; W
    {2 H; q9 P/ j. j, W' I  Q
            comp temp, xtimesy;
    4 J8 j( ?4 A, ]% v* Y4 g
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。4 S7 H; P4 N7 J, \- D  D( e) h
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?+ S- ^# G4 b' r% e6 E" J* t
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-6 23:43 , Processed in 0.040368 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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