设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?% P( z" X- ]+ _( F# T- Z# f

    + |* ^2 ?- J1 \  i% s) B% ^; C; W7 `8 Z自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    3 G; F3 a3 H) e8 d( ]9 _2 P8 j, t8 p& e0 A: C& K3 R
    速度优化问题真的很有意思啊。
    + k: d! \4 @! Z) R$ I! w! Y- w
    ' w" X2 E0 N2 }6 Y: ?7 t) w- S8 ?$ v) w欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 1666 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    & [! `& z* k& q5 ~把代码贴上来看看?* v: `/ ~4 U1 _: t

      n- {. X9 f4 C* f" O* 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的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 % ~. S0 T1 X& q
    数值分析 发表于 2022-9-24 23:04$ W8 P; f, s7 Q: g
    拉下来?拉多少?7 G' ?# S4 `/ y- E2 q* ~
    把代码贴上来看看?

    0 Y  Y* ?) F- D8 P! U) [0 y2 j- P
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ @9 \" j7 {; C' q{/ G& W* |( `* y: _& k5 u' @
            comp temp, xtimesy;* ~8 ]% ]( x' M: w! l( S
            xtimesy.re = 0;. C' |1 u5 Y6 P0 I2 j, W
            xtimesy.im = 0;# @0 d, A) F7 L: k8 H: Z) P
            int j0 = lenB - 1;
    " L9 r2 v$ g% v        int    i, j, i1, reali;
    3 q. O; d( L& c% V        if (lenA % 2 == 1)
    ; X, K2 ~7 G; h/ X                reali = lenA + 1;0 g* {1 ?# W: e2 i/ E' F
            else0 q8 z  `  t) @
                    reali = lenA;& p! a4 b1 M3 u7 ~/ U
            reali /= 2;. K4 y  k! t" ~- c
    * |# P4 J; \1 m7 R; U9 p% u" M
            int nconv = reali + lenB;5 p5 e3 u$ E; u6 I1 W7 O' x1 f" d, e( W
            //#pragma omp parallel for
    # v9 s0 v% h" @, P        for (i = reali; i < nconv; i++)6 M: t' M" k. t* F, S
            {
    + H4 a' I9 J' @( `                temp.re = 0;
    ( |9 `, v* j4 n+ q8 x+ S0 I0 {                temp.im = 0;1 p) y8 y1 [& d: P( k" m
                    i1 = i;9 Y! a  }+ i3 \1 m
                    for (j = j0; j >= 0; j--)
    5 i: ^7 P/ @! T+ }7 N$ \0 @                {. E9 j0 z, t  Y2 q2 a) P; g. O, A
                            /* floating date operation */
    & s0 M- A; V& V( W1 @+ l: D/ s4 o5 Z* q                }

    % m& P5 H% y9 C7 w! S! B0 H        }* S+ m  L% L  i# g
    }( A6 Q: N% [# d6 W6 o5 A$ t
    ! @+ R' P5 }; r7 g
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    : T# F3 H0 r: v$ I3 D( E  ^3 @8 g; v, g9 K2 j
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    , M! x5 r# ~8 b8 H2 {8 X$ a现在call xcorr 100次,耗时78s./ }: b4 F  N* W

    # e7 y! m1 p" d/ b如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    0 \& B2 |. O& w0 f8 f8 h. p- r1 F0 x
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33: i+ X6 q6 P% q+ f- @6 k6 z9 }& ?/ {
    Maybe Debug mode?

    # l! I+ b% C# A3 C4 Q6 o; A$ V$ |. j$ |; a0 \. w- x9 q) G: B
    不应该,看我上面的回复。
    % v, ~" o) s1 w
    + I9 ^' `8 h3 P% s% `1 {7 M, h5 S! ]我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 1666 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 / e- _7 y9 k: u$ {' P
    雷达 发表于 2022-9-24 23:54
    4 D( t8 @+ ?- y4 rvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    # s+ G9 a5 [$ A0 O& d1 Z{
    / |3 `4 {; R* N7 }& {( D+ c' B1 L        comp temp, xtimesy;

    ! V. b* h6 ~+ F. ^0 z0 K- Y6 d3 `2 [7 _5 c
    这个不是这么比的吧。。。
    7 W+ p0 ?1 T" p$ A; N- h) g. w: ]3 N% B
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! A" M% j, W+ o4 [3 T) o* R, X+ H4 w8 r. s
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    7 Y! E. I4 z+ H) e  X* v  j8 u
    数值分析 发表于 2022-9-25 00:20- A& u  O( R7 w4 t0 I/ w4 y
    这个不是这么比的吧。。。
    & ~3 t5 [1 T% F1 S( ^5 ~) F0 q2 n, C1 G  M$ l* W4 f" V
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    9 B+ o- L. J2 F0 ]. a
    * T7 r: Z2 G9 y4 u5 S" e
    有道理。" }. _4 `# j" }* T& J: i
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。8 L5 t% T; f; c7 Q
    % G0 M& E" Z' X0 G
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    + R- x9 p9 [0 T+ t2 i- _. [* N有道理。! @/ G5 j* Y8 ]" d7 ]+ b
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    $ a- ~9 }3 M$ W
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    0 L; N% ~) v' Z5 m7 y- `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' n$ L' E/ r' V/ ~# D* v+ z, W" j
    这个不是这么比的吧。。。6 l3 B+ m" f. O0 H5 y. Y2 }

      J7 S6 y4 I6 o- D3 J  |您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    & z" ?6 s$ H, a# ^. h* S2 I$ L
    , s- M' Z8 E0 |# E- \现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 1666 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 6 ]5 ]. ]' _. m- l, p
    沉宝 发表于 2022-9-25 01:48
    . @0 F0 q$ k+ H! }: `# A2 p, l: G, K现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    5 P" J. w5 C) H2 ~: F/ w% W/ U2 Z3 ]# k/ {6 S, O
    是的,兄台说的对。: z+ h8 b& [( m2 u" m" ^

    9 D$ }& B4 p0 @8 |  m% ]( j) I其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    9 t# j, u9 f" N) k, I' o$ c7 J4 P! s* q: e6 p
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。1 n3 r4 g  D3 I; V  Q- H# f

    1 A( |: c% }; h7 T. ]# C5 T. O比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    # i: U' w. i6 F. v: K: ~
    " ^: \6 t( l2 X5 r当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 % X) C3 T5 i' N; q- j
    沉宝 发表于 2022-9-25 01:27
    - ~6 A/ T2 V1 H, r1 O8 i% s你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    & |' b8 e- P) t% {& K
    - V$ \" N, T6 t/ }9 k( J' T又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    / L0 B1 |. V1 Y0 C/ K& T% W+ E) y1 N! R! Z  b7 w; G$ Y. z- |
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    9 c( u6 [  u- @# d又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ! _) p" }5 {9 i3 i
    时间差一倍的结果可以接受。4 l4 E& C- `" c9 W$ R2 w7 y- M+ q

    ( c, A% g  h4 h" g你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 1666 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 9 s6 \+ o8 X! U5 p. i
    雷达 发表于 2022-9-25 04:47
    & p0 |' A2 p3 d2 m又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 Y7 S+ N' Z2 k- R1 Y
    8 e8 r# y, K: U* i  e

    3 o- k8 H8 w; I) p
    3 W9 m* }- P9 E+ x' o" T能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    & H9 m; ?2 u$ {
    数值分析 发表于 2022-9-25 14:58
    ) r1 S# r- K' I# W能不能把这个也贴上来,看看和上一个有什么不同?

    , e  O8 ^0 S) |- u$ O理了理思路,重新做了一个测试。
    # z" L7 F8 h3 Q5 f( N做了两个 vector 和 两个 float *, 都长 100000  ^# h' ]1 `) m- Y
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    " h9 @0 Z, K4 B
    ; s. \2 ~" |/ w; `( }4 E: G& W内循环试了4种方法,) i1 [2 t7 v) y) r' F, }0 N- z) S
    1. 直接调用 vector inner_product 247s
    , q- {5 W& D1 a8 K' Z% P. v7 E2. vector 循环点乘累加 237s
    ! j6 {8 `8 A* h3 @3. float * 循环点乘累加 204s
    % Q# c* F$ a' h. G6 \4. 空循环 100000 次 202s
    3 a1 @3 k" j- }# r$ }0 U$ _. t+ ^3 ?- m1 |
    不做内循环 200s
    4 F. M) C1 v: p+ H) W/ n' s! ]9 }8 M0 _9 P$ T4 k
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ x- p$ O" N2 Z4 z  ?
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    & u/ F/ J2 ^& m0 S  P7 Z1 P! E3 I, \+ Y+ ^: R9 |3 @& e, p
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 r7 X4 d6 `; R5 s3 W" ~
    & Q3 F: S2 S5 t3 {5 c
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)8 e3 K0 x. C6 f  F" j" E7 a

    7 o' f4 K1 s) n$ @+ O0 c
            std::vector < float > vec1(N);
    4 l5 @, Q( B9 I5 C$ E        std::vector < float > vec2(N);
    * H! ?8 W7 f, D5 O5 O7 k* x) N        float* b1 = new float[N];5 C$ q8 f* l7 U* D
            float* b2 = new float[N];
    ; p% G: `" k" \4 A1 \2 A6 w! v+ ]4 w* V7 s7 I! A3 {3 e4 ~
            for (int j = 0; j < 6000; j++)0 w( w, h4 {+ l" ~) }, h) D0 \
            {
    " v2 x! y+ I# j5 O; l                std::generate(vec1.begin(), vec1.end(), []() {* D  Z# [! G! z
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    : E( j7 V$ L1 B3 l                        });
    : I3 p3 z+ {) S2 u+ Y- l1 W# Q1 @' E4 l$ p3 i
                    std::generate(vec2.begin(), vec2.end(), []() {1 z( ]$ X" h5 W) w! U' M
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# U- z6 o5 L1 k; q
                            });$ k$ ~% b. O: v) C

    8 T( w2 n/ @3 y3 {9 h( r! D# f                for (size_t jj = 0; jj < vec1.size(); jj++)# o8 J* o6 R/ R& P8 Z9 G$ }
                    {1 s: s8 I/ a; M& o! g6 t0 B0 u
                            b1[jj] = vec1[jj];) j0 U1 m9 z4 k4 o% a- \' g2 g
                    }7 s. A7 ]7 Y8 D# i; \0 }

    " y+ U5 d$ ^/ L1 i+ C! R0 X                for (size_t jj = 0; jj < vec2.size(); jj++)$ [( `! y7 r, o
                    {
    8 g- [# q7 T& F4 I) F# Q# @9 u                        b2[jj] = vec2[jj];
    5 ^1 w1 f* g0 j3 c7 j. S8 z# t                }: g2 ~" o3 J7 m. m; y' D! m; _1 T

    4 i( P0 l+ R4 f( _; @% G7 T! H                //Method - 1  N=100000 247s    i( W' r# P5 @# k4 n$ f
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ( I% ?6 O  ~9 K( g/ ~                                0 x, P3 j4 M! c  ~4 l* ~
                    //Method - 2  N=100000  237s
    ( V* u9 K/ ]- h                /*
    . ]2 k, p% G4 e5 c. _# k                for (int jj = 0; jj < N ; jj++)9 z- W) w( r7 _% g0 k! g
                    {
      d* c  o" i7 z" f; ^                        fresult += vec1[jj] * vec2[jj];1 _4 }- ]& {& G, j
                    }
    ; W% y. O  o! T: Y0 F                */& i8 L& ?" J6 Y6 u
                                    : Z3 r( a6 R) S2 z
                    //Method - 3  N=100000 204s. v) k; T4 y. |- ?; W2 C
                    /*
    " |9 g  W; A/ o                for (int jj = 0; jj < N; jj++). F5 D# i" j* o' m0 O
                    {& I2 M) c$ w% {, I, n) `8 ^
                            fresult += b1[jj] * b2[jj];
    ( J) E0 r9 M- q+ p% r, ~- L                }9 _& z- z' I* \- G- k6 P
                    */
    / s5 X" c  N' [4 C6 I) q8 u5 V# d
    8 h" o" R2 m* S4 |                //Method - 4   202s, U: X! k( o( p& h- N
                    /*3 b2 `0 p: a0 N& F
                    for (int jj = 0; jj < N; jj++)# j; j. z1 F: i! j; P% s
                    {
    % D' c/ ~+ U/ e9 z$ j# [% B/ S- C                        
    1 s: L4 }+ v, ^; E                }, w/ M1 Q. i+ Z+ w
                    */$ R# F  F- {( l4 U- B. N
                    //comment out all methods, N=100000  202s               
    ; b( O3 S! b% G( ]- A        }
    9 C$ o, U" H9 G- Q& ]) |3 s7 w* v; ^& ~( c4 [
            delete []b1;. s- i! w! ?5 }' `/ u
            delete []b2;
    - w8 X# S; [2 k2 f3 N2 W2 g
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    / n4 G( }3 K5 ^1 o
    0 F, J) O, i. Y" W" D你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?# N) D. R* b2 V/ A
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15$ ]0 l. ~4 \; {
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 }, y6 o+ d. @% ^1 @/ u6 {
    0 Q3 F2 E7 y1 p2 T' {6 f. X# R- i
    你第二个试验里面的j在循环里面又重新定义 ...
    2 Q1 K) ?% l4 _0 i
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: U5 p" w3 ?0 t. h5 c

    * C7 m; ^$ ^2 z) a+ a+ C不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    / r& `" x/ U; |: f8 P& Q内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ x) F! _. L2 D& L* _

    % I( {" U8 w; l& [) K. `. t不和它 ...
    9 F; A4 C5 ]+ w! D  c

    2 e: s4 D5 M$ r* t不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ) f3 w3 B, t' ^: G7 G0 }. O+ T7 y后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ! @4 {7 q  h& r2 y" [/ A( Jvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' h: L- T. n1 j9 t* i+ |) F
    {
    # P+ z! B% d8 Y# _0 f: o! b        comp temp, xtimesy;

      W. \2 D# g3 B) N, ~3 A这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。* @; G$ `, J/ I$ {- X0 F; U
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?% L1 {/ h/ J3 ]' N% q# ~8 l! f
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-5-27 05:04 , Processed in 0.043300 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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