设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?% i, [+ z+ J9 X$ V' U1 h; j

    9 ]( g8 o; _% O* q# D# G& T6 l; T自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。3 L1 V1 \4 g# ^7 h& h% a! i

    5 b' x. \: R" F# W$ `速度优化问题真的很有意思啊。
    + I' D8 ]$ a, j( [4 X; E  m' e6 n' B" V1 y$ v6 p9 J2 m
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    昨天 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ) a+ z9 v" [; m2 U把代码贴上来看看?
    * ~( U# m) g9 ^, q" D+ C" d8 A% z
    0 Z( R$ s/ L; b) S4 x& w2 w难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 , H/ t, ~  X$ f. M
    数值分析 发表于 2022-9-24 23:04
    4 l- w' w: }8 Y7 ?拉下来?拉多少?; {- N3 N6 w% z$ s) V
    把代码贴上来看看?

    ) R; |8 z0 v8 q% n9 V
    8 F2 I8 _; @4 p' _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 B' S2 E4 w$ X: \5 u6 y{2 m# O) N8 ^# W7 {4 L# w; {
            comp temp, xtimesy;
    3 I& {7 i7 h8 ~! }" R6 f) }        xtimesy.re = 0;1 Z+ M; Q! N) `! T: P
            xtimesy.im = 0;, n; j% c$ `+ E  C
            int j0 = lenB - 1;) w5 l! }# y/ _' ^! W( F, |9 Z
            int    i, j, i1, reali;  C; V8 ^- i7 u$ B. E, U* K  c
            if (lenA % 2 == 1)5 ?1 ]" y) L- h$ [! T+ I! y: S
                    reali = lenA + 1;& h3 d1 [: f" J/ V: n
            else
    / t/ u# N6 R" j- e8 d* w) _) g                reali = lenA;& ?/ K" z: T# b9 J. a$ w3 g, P) g
            reali /= 2;( p$ ?5 k0 q, B- g# C# f

    ! A# v2 V" r6 Q/ H  Q; b# B        int nconv = reali + lenB;/ N6 n- a% l4 J' A$ k5 A: v
            //#pragma omp parallel for; o% I  D3 M0 A- i) e
            for (i = reali; i < nconv; i++)
    % b/ z& k, f/ ~) g        {: o7 [. w; ~  S. ^/ s" e) q
                    temp.re = 0;1 t# @* ]( b* e& `& P
                    temp.im = 0;
    4 [$ R2 q' n% T3 g8 V2 @8 Z9 H                i1 = i;7 G/ c  b" C  v1 y% |
                    for (j = j0; j >= 0; j--)5 J0 U# a9 F& `8 W2 `" j! {
                    {
    $ v" ~, l/ K- Z" [8 ^$ {* P                        /* floating date operation */
    0 `5 Z  s" m$ \& U4 O                }

    . ~* N2 X8 p4 q8 S4 E2 U8 E        }1 o6 }  q' {9 Q% ^& ]" [
    }
    2 A2 |: k7 _; J+ `0 Z6 {' p( u
    0 c( P3 d; N. c) pxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    6 a4 s9 j5 h) M; n6 k4 F2 W& ?4 G- B$ z6 {6 V) R( v
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。. I4 O7 Z2 r0 f" i: \% Z' t/ b
    现在call xcorr 100次,耗时78s.
    $ g" k4 P: h3 D1 L" Y  @) V! J
    8 d# N6 w2 J* q2 _+ N如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    - t* b2 R( f, \. w% U% m0 n  p0 G) ?" u; M0 T
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    / ~$ W# s  h9 I; W) Q1 G! q# bMaybe Debug mode?

    " T" W! T$ S! H& g4 p$ A
    / p: h0 Q; w8 R1 A+ {& E不应该,看我上面的回复。. c( Z; N  x, W3 a0 x8 b

    2 y! z" ^+ L* A- X8 k5 |7 n! r* d我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 % n3 l) w: b  \" d
    雷达 发表于 2022-9-24 23:54
    2 e- B* u3 q8 yvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ' _3 C+ c& _0 y0 u4 i7 O{2 V7 y2 e2 Z! q* k
            comp temp, xtimesy;
    7 D. C+ y( E% G: @# C* q6 d" Z! V. q

    ' Q: d- `) F' i  y0 k$ {这个不是这么比的吧。。。- b; E( |, M2 P3 S! o$ f
    : f7 T+ t3 k! n% k  u$ W
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。( x& y& m+ ?8 {: D8 b+ W0 B+ B
    : v, r* `5 i$ h) z% J% q
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ' t) O2 B$ n8 Y! j1 M5 F. l
    数值分析 发表于 2022-9-25 00:20
    . v& h: t# @( n5 ]这个不是这么比的吧。。。
    ! j- F2 N8 b% l: |7 v! y$ b! I4 g1 i
    # S3 t, _8 F3 M0 }您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    " `# W) d5 w- K! _, {& J/ |
    7 P" b/ O2 x# n1 S8 z有道理。
    ; F( j3 B4 U8 ]/ `2 t: z所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。( @5 t6 v  ~  _/ }0 g9 b
    4 F6 I" R& P8 G6 k4 t
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    0 H5 T$ N. p5 P& S有道理。6 l: K! O! ?/ F8 E( a& ]
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    7 |+ [1 Z& ?# s8 ?$ a" h' M% e
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    $ w! ^" T" [5 k8 \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
    % e8 m. o* l4 E* ?. k/ P这个不是这么比的吧。。。7 ]6 K" k# v3 n

    3 w( t- b: i6 Q4 U) c, z3 J! ]您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    . h8 {% o! e; ~, o6 {& v

    ! r, u0 n$ G, `0 {5 V; K# l现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 ! k+ O3 m: V5 B
    沉宝 发表于 2022-9-25 01:489 i+ V1 ~; a* [$ V  E- A1 Q
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    8 q" h$ u( t1 c

    - i! Q3 c. Y! Z是的,兄台说的对。
    6 K, R6 O; h2 \5 B6 _
    ( G. P  t# A3 X7 u2 _其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    % i* W- S) b( n
    7 K1 N& S2 F0 |5 e' e4 y" s& D- B雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。2 E- q+ b- s/ N% ?. _

    5 L1 `7 b) k1 w. ?比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    + m; B; K( \+ D% q
      i+ q- h' O. R: P+ d当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    + k0 H0 o8 Z) X% n" K) Y% q& p) L
    沉宝 发表于 2022-9-25 01:271 z  K) r$ J8 s4 |, G& x. c) m  Z. @1 P1 B# A
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ) A# W! g) o9 h+ j. F& i5 X9 h5 Q
    & c) l' h7 @( D3 x2 \% {: \
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    % D: K! g$ z  e( y/ E# I4 `: t
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:473 p0 a, r$ Y5 J( Y  B, e& c
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    2 n9 Q8 c; ^' X# L5 H时间差一倍的结果可以接受。* @$ p  K" x* w9 D8 [6 K4 j
    7 m7 \3 q3 E" Q8 P& u7 c
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
      W! M/ _* @" A" x
    雷达 发表于 2022-9-25 04:47" H& u: U' F2 ~) e. R0 p- A2 f
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    2 h1 f8 H& R8 |
      R% X, ]; d. P* B8 z' I2 q# e+ _. S6 t. Z3 [( s! U, y
    # d  _4 l/ _! c% S
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 - A2 Q2 R* Q1 o/ P8 d! L" S7 J
    数值分析 发表于 2022-9-25 14:58/ x8 `, {6 s5 \' u
    能不能把这个也贴上来,看看和上一个有什么不同?

    ( H& l! c  l; Z/ J( \7 ^: _理了理思路,重新做了一个测试。4 G: L3 u- z6 w3 x/ p2 {2 ~
    做了两个 vector 和 两个 float *, 都长 100000( |2 l, c9 S/ v2 l/ Y- S
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 a; e5 m3 V  v: L9 ~

    * |' D+ h( _$ J8 x8 L内循环试了4种方法,
    , e3 _5 t- _; c  m" z1. 直接调用 vector inner_product 247s
    . |7 P' G9 Z$ S2. vector 循环点乘累加 237s
      S5 D0 ]9 e' F9 Y% v8 ~3. float * 循环点乘累加 204s  B; Q0 J3 N" T6 l/ G
    4. 空循环 100000 次 202s
    9 `& O; w, W& j1 L; s6 b
    ( U( g- w+ [* Z5 ]% A4 p不做内循环 200s, z& M2 W9 e& k" x5 h! j, @

      E8 J/ w9 C% X2 O0 o& \) A你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    & D7 \5 a) U& ]另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    , s/ b& W! m& }: L% {, _( L% ]& @2 s, ?! q! N: L8 R; c
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ! Z( |# n% J! B- ?# d; u
    ( x+ l) w/ `" j, g) p2 _; h& E! G(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)/ g; E( o' W: i: a" g8 a
    - W' \4 e3 Y& ]- x5 X
            std::vector < float > vec1(N);
    6 `' G. r0 s$ L6 A        std::vector < float > vec2(N);
    % g& M" B5 {) F' L        float* b1 = new float[N];' u, u: L% e) ]1 I
            float* b2 = new float[N];
    $ w  M6 b) D& ?5 G9 E5 B) w1 s7 r1 c- s* V7 M
            for (int j = 0; j < 6000; j++)
    8 w9 l! k9 h# q' E        {8 t* v; m" i4 ?9 T
                    std::generate(vec1.begin(), vec1.end(), []() {
      i3 c0 f3 G1 i                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    , p  {8 [( _( U6 n5 r                        });5 X# Y& E- ^* ~3 _6 u' a

    & \8 q, S4 H5 ]' _0 g6 `                std::generate(vec2.begin(), vec2.end(), []() {; }4 B% B' y9 ]4 s. I: m
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 s  I5 T# G5 C+ d
                            });" @+ V& n& u7 Y3 R5 F3 u9 \

    6 a5 N% J5 p! X0 L4 T3 P                for (size_t jj = 0; jj < vec1.size(); jj++)3 t" |* A' H' e6 q6 N5 ^: e
                    {! F$ v4 @5 W( H& G& W. w5 K
                            b1[jj] = vec1[jj];+ K4 ~, Z- W5 ?# k
                    }+ D, F' I. t# R9 i# i
    5 s6 y# r2 ]( ]; j7 \+ k& s
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    # _; Y5 \' l3 j  R* ?2 r, s. A4 }1 w                {
    ' y' _* j1 |6 F2 R; j, F. f                        b2[jj] = vec2[jj];7 N. k0 M! V. C, f& f
                    }6 S7 x5 X- T7 {- r1 ^) G( T

    5 A4 X1 j) p$ }  Q1 O. C                //Method - 1  N=100000 247s  
    5 n  m9 I" p6 d5 C# }                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    " i% N. ^# M+ u* Q! U% L" D                                ( U. _  \. z9 ~' l
                    //Method - 2  N=100000  237s
    + v+ u& W, c8 v! r# O% Z                /*
    4 K8 A4 m2 i9 [+ L& V' B                for (int jj = 0; jj < N ; jj++)5 W( W' W$ C: `& _5 K2 S
                    {
    9 I' b9 g& o9 M* J0 U' u                        fresult += vec1[jj] * vec2[jj];
    , x4 P9 U5 ^! U1 V9 k: }/ M                }3 T9 Q) E9 y0 d4 S/ z, B
                    */
    % R; z1 w+ b: _& v; d. t, A                                , y0 A7 q) x: f# E+ }
                    //Method - 3  N=100000 204s' Q( L9 t/ k9 K
                    /*
    " J: x$ s- S  V! A. V6 f4 A                for (int jj = 0; jj < N; jj++)
    & N- ?7 d, ^6 P9 f* L; |- u                {4 a* m6 h! n/ V/ o
                            fresult += b1[jj] * b2[jj];2 Q  ~. C) v$ A$ _/ V7 C
                    }
    + `- w* b! `$ l6 A                */
    # W* \0 N5 }* Y
    . z2 H+ V. r$ M( \                //Method - 4   202s0 h8 D9 h9 @! a
                    /*
    3 N& h+ V& ^( n6 f5 ^                for (int jj = 0; jj < N; jj++)( K  i0 Z: b1 L3 _7 J
                    {
    3 T; ]2 U& |9 y& Q0 a' m3 _                        
    ( v. P+ Q! S9 M+ V# o" `( H                }
    . h! D) j3 M- q8 P: ^) x                */1 }" D; y! v8 A5 J9 o
                    //comment out all methods, N=100000  202s               
    8 \  |/ K: K- G        }
    ( V* B; O: Z. \# b, c) P6 e! c6 n3 ^. @4 X( ~# p1 v
            delete []b1;- q7 Q! i7 v+ E! M* }+ ]
            delete []b2;

    ) w( D7 R) j9 e  f, S
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 N. r2 i2 G. }9 g

    2 v" K' T) M% f' T你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    4 e, {2 l: F+ g: e  s
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    7 l/ P; X6 V  k  }8 a) [6 i# f. w' H" c瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
      U! q* x6 k2 H! i" N8 \* `! v
    5 x, _1 M  H4 D& ?' {8 {* N你第二个试验里面的j在循环里面又重新定义 ...

    % t+ s. U% B+ A. X# ?( a内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL$ z% E/ O; p* Q  ^  Z5 ]( U

    4 X! @7 P! c' D: a4 s8 e3 _2 b; t不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% \( ~; O5 {' z1 M4 t2 a" [
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    " w3 W9 k% b( Y, `8 K
    ) }$ ~3 ^7 l9 z, Y& K4 U5 ]不和它 ...
    0 q& I. v# q3 Q. `6 n+ V$ ^
    ' U9 f* x$ m3 C
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。4 ]/ c1 M' o( L) @% N6 b- ^& N/ j
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54  n6 }" q, r2 S
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 z: l; g( @- y2 r% |3 b! b{
    . j* j5 U$ s& x% D/ L8 n        comp temp, xtimesy;

    8 I, m8 d9 ]8 z6 ]5 c这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。1 U# D  R0 s: g8 ]
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    7 b# X: G- r+ PVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-29 23:52 , Processed in 0.052581 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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