设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    $ r6 O1 X6 U% H1 I
    - T0 ?" l! Z, _. ^2 p* p# G自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。4 P1 L2 y) x% S1 O
    0 r; l/ y8 u& p* z& t) e
    速度优化问题真的很有意思啊。1 Z- y8 O) m& `+ P  X( D
    , Q7 D7 i2 a, }/ a+ t( C
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?. r% S% I' C- G5 I- \# i% e( w; h
    把代码贴上来看看?+ w! {: R4 ^: \5 }: w- c: W! @

    9 w% e- \# E1 I3 M$ b) x难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    0 n, u  U4 F+ Q' f& e# e
    数值分析 发表于 2022-9-24 23:04
    / p' g0 v) g& j6 ?) F8 i拉下来?拉多少?
    , K4 N' Y+ A" u. Y0 G把代码贴上来看看?
    7 T' s7 r" n5 s

    # R3 W5 F# j5 K9 Q: xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : M* F# e% t2 F2 E7 ?{4 G6 {! l- i- {7 ]$ `" y: T
            comp temp, xtimesy;
    ) H8 q1 R  W' |' z        xtimesy.re = 0;4 D" P, S' ^$ j% _- [2 F$ u, X
            xtimesy.im = 0;2 E5 s( e& M4 c, O0 Y. z* g4 Y
            int j0 = lenB - 1;4 R2 m0 f9 I0 N4 m. N
            int    i, j, i1, reali;) C2 q& `: |9 L! C6 A; v0 {
            if (lenA % 2 == 1)
    ) f' U; s8 F3 e* |! c# W                reali = lenA + 1;, f3 `* l5 D5 N% g6 r& G
            else1 q+ r- l2 F: }
                    reali = lenA;& g' R& N* `$ J; ?0 X
            reali /= 2;# z" U6 @2 k" w! E: n
    6 R! ]9 s& q8 X# _0 e$ c( S
            int nconv = reali + lenB;5 d' \0 ~2 k# O+ u6 V6 d5 F4 w9 Y
            //#pragma omp parallel for
    " I0 j0 v: g6 L' g* B        for (i = reali; i < nconv; i++). e, B$ R' _% R8 p
            {
    1 E8 u4 }7 ]% j% K: l7 z                temp.re = 0;: C, [. x5 l/ B' e5 |& ]
                    temp.im = 0;
    * N" Z( j; a0 W8 X4 i% U                i1 = i;! J" H5 b  z) y( O( ?
                    for (j = j0; j >= 0; j--)/ v6 S& [1 _" E9 w) h
                    {; d+ ^! O5 f8 K, T( D  @1 {* m1 X
                            /* floating date operation */
    , u$ J$ V9 z- B3 y, \* H9 o! l                }

    6 }- d. Q) @( G; q4 a        }, r" `1 l' Q  L, d) }! `% J
    }
      A  {+ B4 t% t! L2 s; ~% Q8 }* B/ v+ S& b: ^( ]) U& V! V
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ; ~* i  k, H( ]" \
    6 e+ I( g% U" H' }" N- e红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。# F/ B- A$ R& w: D- p
    现在call xcorr 100次,耗时78s.7 z8 j) x  F- F" J
    & _1 z5 E& b& g8 q$ f
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. - Y: K  J6 V2 L0 b2 r3 T
    ( H4 P7 i6 z6 G- k& v2 H$ @3 R
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33/ d( ~- c* J$ d' m2 e6 T8 ~
    Maybe Debug mode?

    $ V/ y% U; R# W5 C3 I- G/ F
    $ w0 @0 v: x9 ?6 J! Q不应该,看我上面的回复。% s" \# u5 x/ ?1 g' e+ ?1 X

    6 b5 A# k: M/ g, @* O! m我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 % h, l+ Z7 `  ]9 L
    雷达 发表于 2022-9-24 23:54/ D, P( T0 e& A5 @  j
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 z2 ]3 u5 f& D1 l, @{' I# M3 G: p  d2 y9 q6 g3 A
            comp temp, xtimesy;
    & G3 A0 K( \) W! _- i

    . [% j# M: M5 A5 [# O这个不是这么比的吧。。。& s1 r* I8 S1 @1 B1 |. M% C" B: Z
    9 E1 e. l+ y' I: [1 _
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。, [% a# m5 \! J( G

    : [. ~; Y- G/ x% G3 H而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 0 q4 S5 p, N4 ~: w$ @: m
    数值分析 发表于 2022-9-25 00:20
    5 H2 B, g& v! F" ]这个不是这么比的吧。。。' |5 r1 w1 R& b! d  D2 b

    ' H9 R# v* M$ ~您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    * J, }  \3 ?5 W9 {2 i8 f" p' d8 w, p4 G$ a
    有道理。
    : i+ {# S' v* E) U& J% X8 t# n" U& W9 O所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    * q. ?& m3 o1 v$ ?- j
    & Z2 M2 u) ]0 e- B- k我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46( a+ k3 W6 ?* C
    有道理。! h( d! S1 I( m; D
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ! P7 L; [" E8 E6 E, ~
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ! B2 s; Y" r& m6 v2 CWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20: f7 @" M; Q$ j+ \
    这个不是这么比的吧。。。
    ; W- s. f, i( Q1 X! y! x
    ) P6 P/ v* Y1 i# g& @您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    4 `3 P6 M+ o6 E* F# e( w0 c3 G8 ?/ [& m( \
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 4 I6 i6 Z, @/ l, L# E% k
    沉宝 发表于 2022-9-25 01:48
    $ i* {$ k- M: k( K现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ' R8 b- i% X9 r
    1 [0 U1 I5 A: n& _+ e% b- g是的,兄台说的对。* ^$ L9 ?, j4 Q
    - V8 Q# v  }8 L2 P4 O
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。  ]9 c( O+ Q1 L
    $ q4 \9 Z+ G) S
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    0 f1 M- q% K& Y4 R. O2 w' W9 t3 V6 s  |" I8 u/ ?
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ) H, n, p- r: c! w, Y
    ' E" f3 y4 d5 L5 p  I8 G+ l* y当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    % D0 A* h) J, [4 s6 i/ o* C
    沉宝 发表于 2022-9-25 01:27
    " i$ Q0 G' p# x9 u$ q你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    3 q* k! H$ h+ L1 F. r2 Y4 L
    1 e7 L' i) {) E; p& J* x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。; z2 D$ B3 y" u! _4 M5 L# r- u; N" `

    " J4 Q, \$ L# Y我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    3 _; G2 R* B" }! b: t5 T8 T又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ r- x  f$ r. a, g2 d; B
    时间差一倍的结果可以接受。
      e# L7 y1 E' b6 H0 c  x
    " k) j: t% @1 u0 w- X你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ( T' C) m+ f  J; z% x
    雷达 发表于 2022-9-25 04:47
    - H6 c8 n1 L0 b3 k2 ~又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    0 B) ]6 d: `/ u- e/ ]0 r* t8 w
    : {6 D8 n' f8 f, r

    5 i; p" W9 ^/ B. _* _7 C, }/ t' ]1 ^/ W, }
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    , Z8 \2 l; x/ {) W' t! n0 s
    数值分析 发表于 2022-9-25 14:58
    5 Z$ w& j( p/ i; k7 S5 X- I能不能把这个也贴上来,看看和上一个有什么不同?

    ; t+ T/ a$ G9 z  u; \理了理思路,重新做了一个测试。7 i4 U# ]$ R) Z( O
    做了两个 vector 和 两个 float *, 都长 1000009 M" c$ W3 H1 Y/ k! K& \+ C- ^
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.; a  J: p& M+ M$ k3 {3 ^2 e

    8 K; i! I% y) S6 k内循环试了4种方法,
    ' v5 w# F+ C4 O% P6 M1. 直接调用 vector inner_product 247s 4 e3 o: p8 z1 b
    2. vector 循环点乘累加 237s" A3 q) a, h: [: A( d% r' J
    3. float * 循环点乘累加 204s
    ; K+ h) ?. A1 {- W' q+ n4. 空循环 100000 次 202s
    4 `) X" Q# f/ |( x$ C, R
    1 x# [2 D" R# L' p7 L+ C! y- M不做内循环 200s% N& A2 ?9 l1 `/ W
    ' w5 F2 S% A0 p" Y9 N# w  i
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    * J( o/ F! l, a, R2 S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% w. O& M& T4 S7 p8 P
    2 f+ R* J* [! s) {$ u
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), Q! r7 q1 ^. z9 g

    1 J; b1 B' a6 S1 G(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    4 R/ `0 l; V2 H5 z# o! s& Q: L
    . D8 P- J3 U! S& q; A- l. R: |
            std::vector < float > vec1(N);+ d: m. L2 X( u1 n5 d& e
            std::vector < float > vec2(N);
    # l1 J0 i  W3 j7 |0 B; K: O, q        float* b1 = new float[N];
      F; ], ~; M1 d. s5 b5 O        float* b2 = new float[N];% ?8 w1 |2 L& I# D% N4 J

    " I; k* i* ^3 s& t  f: p: e+ k        for (int j = 0; j < 6000; j++)" z* s  z; @" [9 \0 P. [: \# j( U' `
            {5 A/ a2 S$ N' W6 T
                    std::generate(vec1.begin(), vec1.end(), []() {
    5 z* Y% Q* _+ d                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ; }; _; X: `/ f7 B1 j7 l                        });1 @3 S; C5 q8 j. U. v4 A- C4 U2 f
    6 }: j2 P" `# f8 V0 K3 e
                    std::generate(vec2.begin(), vec2.end(), []() {- t% ?7 u0 Z$ |* u4 \  O$ B
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    / S- D+ _& j" p& V                        });
    ; D6 x1 b# E; w9 Q
      T6 \* A6 ~5 q1 q* a3 ^$ H                for (size_t jj = 0; jj < vec1.size(); jj++)
    ; q7 \3 O( P2 k" h9 {- s3 b                {$ U' H, E4 h  A  k& g
                            b1[jj] = vec1[jj];
      a7 i- r3 w/ X4 K& j7 V4 h                }0 V2 q5 Z, @; Z& a/ r% j

    ' _3 W0 c4 i) U+ V3 I$ q                for (size_t jj = 0; jj < vec2.size(); jj++)7 Y9 _8 c/ _6 b& U2 t6 n4 i
                    {
    6 f; D9 G% A& T$ x3 h                        b2[jj] = vec2[jj];5 k, v5 O4 |2 ^' l1 ^* n( ^+ Q
                    }
    8 Y- _. T7 J$ @( Z2 C% s  h$ `1 Q+ F) g& C
                    //Method - 1  N=100000 247s  9 e) w1 V5 c. A; u
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ) S  j1 {$ a3 R( p5 K  g' `                                
    0 Z# ]- Z/ Z" [' ^5 \* `" Q$ x- A: ?                //Method - 2  N=100000  237s
    2 g5 i: H: E7 R* d2 t  }                /*
    % n8 s# w% u7 Y6 B7 u, Q! ]                for (int jj = 0; jj < N ; jj++)
    3 \- X/ c% B, z" J0 D                {% L0 H  Y& n. D& _$ A
                            fresult += vec1[jj] * vec2[jj];' [/ j& [4 @3 b% e: l& E) M
                    }
    % i- n: |; s: h- C/ s$ E" v7 M                */* Y# j& _# K1 F9 l1 Z9 k
                                    
    ; c) K- w; D/ O! H2 u% E8 D: a: X  W                //Method - 3  N=100000 204s
    # `8 `! r" ^. K9 T! X( _                /*
    * `6 Q1 M( I5 H/ Z  R/ R' @                for (int jj = 0; jj < N; jj++)- U) s9 F: i2 V! P# B7 [
                    {& `8 g! {& L( u4 o( F
                            fresult += b1[jj] * b2[jj];: K; i# u+ l) X. I1 v2 J
                    }) p# `! U4 t6 j8 ]  L
                    */
    & q; T/ ^* M# U. C6 u4 O$ c3 d4 R6 {/ G9 q' A7 L
                    //Method - 4   202s# z# U# J( ]( m0 ]
                    /*- P0 S+ I3 y. V- K1 W
                    for (int jj = 0; jj < N; jj++)
    . u7 `. w8 Z7 v+ [                {
    : t1 c) B; X! N  q# a2 L                        ; P& S  |2 G! H
                    }3 @! E' ^- \" F2 z& ~8 y" ^
                    */  M: T7 |3 a. U7 O
                    //comment out all methods, N=100000  202s                ( \! J3 x$ U3 ~4 P/ ]4 @
            }
    2 \5 M( k2 t4 p7 l3 ]3 t7 q; K/ g( z
            delete []b1;7 P3 z0 g* I/ {& q
            delete []b2;

    6 ?' {1 `2 p- I  z0 p' l
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    : Q9 G9 p% G8 c9 D
    $ X/ O) L, i4 r* a" C( k3 s你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    : ]/ o6 X; `3 Q. h" M. K
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    & a' ?+ Z; T! Y+ M0 f8 K+ }瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?$ Y$ _2 k4 f; e5 Q
    2 `# o6 ^% Z) S! H; @
    你第二个试验里面的j在循环里面又重新定义 ...
    : @. s' F- ]  B- T6 E
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL; P3 b2 T, Z. u' j) t
    , ]5 _0 J) M5 W  W2 G$ y3 N) m
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16/ s3 e2 k' F6 ]1 V! r
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: O3 L4 D0 f3 D  B' C! a8 J" Z7 Z

    7 }: M; L1 G4 z/ `& B* F+ c. c不和它 ...
    $ _0 J  b4 ~2 t  ]6 u8 w
    # O& d8 C3 ~' J* P" m+ o1 i7 S
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    . _) M3 ]. N6 ]( V/ E5 G, M: P3 p! p后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54- O3 c- Q9 J- X: e& H6 F" o9 e0 ^
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    - ~  u, d3 U; E# p7 V8 U{2 ~" v$ J2 t; a+ _8 n6 q
            comp temp, xtimesy;
    ( G9 k9 j- U' b: Y2 D2 P/ T: L
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    0 X/ p% E) ]1 E( I/ i/ I内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ! }9 e' i! y! c2 `& xVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-9-19 22:38 , Processed in 0.059127 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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