设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    3 A) O& r, B: x
    2 _  d$ {* ]: N8 B自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。( m$ E2 r% r* V

    ' X$ n3 a% H2 |! v% C: y7 Y速度优化问题真的很有意思啊。
    ! t1 r5 m: g' U1 ^: ]2 d: k  ^, V; v5 C6 E' v$ B5 [
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?$ z! r0 K, R& v- H5 H6 P' r
    把代码贴上来看看?
    ; ^8 z4 ]6 x0 d, `' L' s6 e0 b# u2 P
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    0 H& B5 m7 n8 s$ R* ?# t7 Z  o
    数值分析 发表于 2022-9-24 23:04$ d1 K+ {/ _# P0 A9 P/ _
    拉下来?拉多少?8 C9 K& h6 L( V% u
    把代码贴上来看看?

    # w9 l6 Q6 I4 d1 q8 l. D; m/ b* V4 A' b) x3 {! A
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 O+ m4 a. z6 H- U{, N1 z$ I, e' V$ `) Y2 U& ^: \
            comp temp, xtimesy;: m8 i, G, h0 T5 u, J$ z& K- r
            xtimesy.re = 0;
    + _- K2 V& X/ m% n5 k2 {( `        xtimesy.im = 0;
    $ v8 m) Q! c% }2 x4 Q) s/ M        int j0 = lenB - 1;  `% Q& B( A- x. D6 D1 J
            int    i, j, i1, reali;
    ( p3 B' }, s" l$ O        if (lenA % 2 == 1)
    8 `# }# A" @  u2 o- o$ o) V                reali = lenA + 1;
    2 E! Z7 q' b- @, F6 v+ h9 _        else
    6 R( U# t3 b: c. `$ |, }) O                reali = lenA;
    ; k. @/ ?) r, R- g1 Z  W        reali /= 2;. z+ Z$ }( O  N2 b% b4 S& g

    ' Q$ v4 Q6 a5 f# F" {) y1 G+ d+ y        int nconv = reali + lenB;
    5 ~" r7 c7 y: w: {        //#pragma omp parallel for
    . ]' {1 r$ d( x! {        for (i = reali; i < nconv; i++)
    ; M2 r7 d" V5 {' X        {% V: H- @0 O; H$ p. z: q
                    temp.re = 0;
      `- _0 f2 H# Y- y7 C1 h                temp.im = 0;& {! I1 \+ h2 ?# ^5 |/ p- q4 Y
                    i1 = i;6 \; ~1 x$ }- q0 \
                    for (j = j0; j >= 0; j--)" s- }+ ]1 s2 _6 }4 M( l2 q
                    {. N- P' x  V! Z" N+ K& x$ V
                            /* floating date operation */5 {2 I  n* z! J/ n
                    }
    ) L+ R7 A, e# B% N1 q
            }# h- V2 n6 s; H4 O" f
    }# l  T; i9 e; F
    + a1 c8 g. G% P* b1 u# O
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    9 N$ s& o- N. f
    * B3 t$ @. O# R0 F$ L0 r红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    " S7 E  ~9 d- P3 @6 t4 v' _6 I现在call xcorr 100次,耗时78s.3 [. l4 V( \' m6 D& Y  O$ U2 W4 i

    + O) Q( f1 S6 e2 [3 R如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    8 [3 n" M) C6 n5 }2 y+ c" W1 H- Q1 }) Q% T9 a
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    / d% T4 r( G+ K$ N! k8 T. E; lMaybe Debug mode?

    ! c3 f/ D+ ?7 g& y2 T& @( T' f& U
    9 f8 x2 J2 \; c* m: p! C( A不应该,看我上面的回复。! a$ N0 d( I+ c, z1 ~5 U6 M! K

    & Q0 x, L5 x. y7 D, N# i我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ! B% N7 |7 @+ j  y! |/ E
    雷达 发表于 2022-9-24 23:54
    0 x1 ?$ g, J* `  y# Tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , \' E* ^( a8 L' ~{5 O2 n7 q, B! ]
            comp temp, xtimesy;

    / w% m# d6 c: g! ?) P! q$ |0 A5 p& n- y3 ?( W/ ?
    这个不是这么比的吧。。。
    # [# T" T2 F) C: t. S
    ( J3 s/ Q" J2 [/ y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。) _) z2 h) u/ m4 \. d# W3 ?# M

    ; n2 I+ R' j- [- `, Y而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    / U0 l9 [( [% G, O4 z; s
    数值分析 发表于 2022-9-25 00:20
    * l; s: ^" j' B) i6 O$ ^/ x这个不是这么比的吧。。。( L4 H; n& h! x3 T$ B3 ?4 w5 M
    4 @  s8 K7 Y7 a4 y! P( [$ k3 Q# y
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' T$ Y# g" q# e3 |

    ' {5 H* @( l4 j: k有道理。
    % r0 {, Q" H* q/ h5 t$ \所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    * [" @% c8 M; d' N  @. K6 j6 g. Q" Z" Z
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:467 b8 W2 N9 [" Y. f6 |9 {
    有道理。
    - R, M  b/ F: m7 G+ e, u所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    3 f: ~& Q# L9 _4 A. Y$ h: K8 L
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多  J2 u; y7 l9 f2 h: Z$ l2 l
    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( r' }4 I: a+ g. n2 x: p* i
    这个不是这么比的吧。。。$ y5 W* o: f8 q; K. c/ }$ X: H

    ' O. \9 e3 j( }$ j您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ) ?( C  k* w6 @# f, l- u& m" _1 C, l% C( b; W6 h/ t$ u# V3 ~3 ?
    现在的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 编辑   R. j' O2 ~6 t/ K- B; @" c
    沉宝 发表于 2022-9-25 01:48$ h# P! U( I% e& f$ U9 g
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    9 \4 p4 z: G5 U3 o8 M1 ?, X
    ; d! M1 L4 e8 N% P; J
    是的,兄台说的对。
    7 r( N' ~: O; }  Z5 _
    : F  ]" m0 }% l, x- I其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    9 m% i7 y9 |' f
    2 w! Q- S: @) J& U4 o" z" r雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ! a" C: y* y, x
    0 j# f- I3 }' ~* k/ Q比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。0 p2 P0 ]5 _% F8 L
    6 w3 D" y; u6 H% r
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    2 _, @1 ?* d/ Y& W- f6 m
    沉宝 发表于 2022-9-25 01:27
    . L/ A5 F. g7 C7 X你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    7 L! B! i3 b: h- T) V# L! y6 c' n& m
    5 h$ e3 j! a6 Y% J: e. E又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。. k% I# h/ X1 _8 G4 q  k0 N, k

    . w/ u4 e. K" x) m1 Y0 J我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    0 W) j5 Q$ N4 m又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    / Y$ r* K  }* S& Y6 P& q4 y. @9 e时间差一倍的结果可以接受。
    # n4 E  k2 W. v; w0 B
    4 S1 t8 w6 X( @2 p$ l; t4 N# T你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    : Q, U/ o, v. J1 T* `
    雷达 发表于 2022-9-25 04:47
    ; V$ h6 [) B- q) k! E) I+ g: i又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ' E2 H/ ^# ?. o8 g# y& N8 i
    ( i2 f1 I! q( `+ t, }  f% f
    % k! ^4 `/ |2 E1 w# ]2 V0 K* E& k3 S. v, D# y9 z$ D
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * s% r' o5 I9 }/ O
    数值分析 发表于 2022-9-25 14:58
    3 `+ M) t' }  L6 S6 B8 i/ Y% z( V能不能把这个也贴上来,看看和上一个有什么不同?
    8 v3 J& }% G  _$ n( S. a9 A
    理了理思路,重新做了一个测试。- d$ K2 A1 M1 K- H, l  I
    做了两个 vector 和 两个 float *, 都长 1000009 `/ V1 }* X$ Y, C+ t0 E; x' r
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    4 b. J6 h  P* J0 \2 {, f& o4 u% g
    - |+ l+ n" y% S! h7 d: K; Q内循环试了4种方法,
      @+ f1 O2 V) W% {1 Z1. 直接调用 vector inner_product 247s
    4 M$ q4 g+ }. ~0 D* \0 T" b2 Z: g2. vector 循环点乘累加 237s
    8 {: n# C: h. i3. float * 循环点乘累加 204s+ l- M) a+ u, }& P6 \" H
    4. 空循环 100000 次 202s
    6 K3 P' v% ?1 Y' p( u7 h; @$ ?1 V0 B  ]+ n$ C- Z
    不做内循环 200s
    ( G' J0 r+ k, O) y5 K& X, B$ _
    * a$ `* t% Y1 T你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ( M  E" t' R7 B7 T# \; O另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    & L( W1 w( r8 ]; B! \) N5 @
    $ B5 n8 i% r. }2 c( b: n至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 Y7 ~+ V! M  Y/ ~6 a, s& r! X4 R4 z
    # L# y. x  e# H$ C
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL), X- `/ C! e4 S* W9 }/ C
    5 B* i# k! X% u
            std::vector < float > vec1(N);
    7 V$ J1 j+ a; ]1 \, j' s        std::vector < float > vec2(N);3 N1 }3 j9 C  p7 u$ R9 I$ j! z
            float* b1 = new float[N];- S+ {9 k6 E3 ^
            float* b2 = new float[N];
    9 ?+ B3 c9 C5 m8 V1 Z' D1 E+ f5 i4 `" c8 C- o
            for (int j = 0; j < 6000; j++)/ D3 T( t+ s# [5 x
            {/ y% u$ b- {1 j
                    std::generate(vec1.begin(), vec1.end(), []() {* A8 [) K0 v% S8 g! `
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    0 ^' D5 o5 k0 D8 k3 @                        });
    / Z6 H4 e( {2 z4 l3 T- X8 ^4 w4 E1 q2 J* Q" y* t) w
                    std::generate(vec2.begin(), vec2.end(), []() {
    * W; Q( b$ b- I% M1 T! }1 s( O                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 S' z! ^# {  g
                            });6 G/ I* C# i1 M

    6 }9 H) U+ P' O/ k: m; T                for (size_t jj = 0; jj < vec1.size(); jj++)
    * K9 B. s: ]9 [5 A# f% x0 V' s, v, z                {
    / K, X  l7 U; T, c; U                        b1[jj] = vec1[jj];$ z  d  C: ?+ {7 T# I9 ?
                    }0 e+ s( C6 x# A
    0 {" z6 l' v$ H" B2 x# o% v
                    for (size_t jj = 0; jj < vec2.size(); jj++)) y2 {5 z+ x/ V+ v; s
                    {9 l/ [2 s2 @6 G& m3 n9 k: X
                            b2[jj] = vec2[jj];
    ! Y3 g4 v* n" e7 J8 a) N! n* e( r& E                }
    ( R2 h1 m4 H0 Q! p2 ]2 i; }
    & |# |; ]8 p! \# V' Q5 `4 @: ^0 B                //Method - 1  N=100000 247s  & F+ q% g  w+ M; w; @& L
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 R* e/ W# X6 j: M' x
                                    & e9 y6 A2 Y1 I+ m- |1 t
                    //Method - 2  N=100000  237s' }; O- D, N5 q' _" g1 Y
                    /*
    6 F, M  n# t/ ?6 a5 \5 `$ `                for (int jj = 0; jj < N ; jj++)
    9 |7 v+ ^2 a5 v* X! G                {9 @9 U  t  `7 m. T
                            fresult += vec1[jj] * vec2[jj];5 @) D6 y+ x  w
                    }! z, s2 X$ ^, ^% [2 q5 ?* C4 \
                    */  `& ?+ |& C2 C2 K8 E# k3 w
                                    $ G- g9 B4 B* L
                    //Method - 3  N=100000 204s
    0 r! N$ Y8 L) d8 s! T/ C                /*
    7 b2 O' Q6 q: L7 C                for (int jj = 0; jj < N; jj++)
    , K" I, A9 H: m/ e5 b                {
    6 J! t3 G! f4 k3 v                        fresult += b1[jj] * b2[jj];- J: `9 s( g) o& x) A; @
                    }
    6 [7 g6 v+ _+ E& ?( r                */
    : T$ {5 w; @$ M9 x& x
    , W4 b8 P2 q) |" n  p. `                //Method - 4   202s
    . b1 N1 e8 y8 s0 }7 P& t$ I                /*1 m, X+ R/ c; q
                    for (int jj = 0; jj < N; jj++)
    9 j" `3 O7 _" Z; C& \                {4 H7 C7 n4 X" K6 d. P
                            
    7 v# s0 q" T1 z, ]3 h4 c                }6 n& j* G/ c( w9 t8 ^
                    */
      I) K: R* [9 a                //comment out all methods, N=100000  202s                3 {& t$ N3 b% q! O) N. s
            }
    3 C- C) ]3 ~4 s6 k0 f  s
    . ^6 F& W! _5 F9 f/ \1 ~        delete []b1;# W# Z7 W( P$ s% T4 `
            delete []b2;
    ( d1 M1 ~) }4 \+ S
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ' V3 `8 T; ]2 x% s9 e" T3 N. Q' b: `7 Y0 X" I. r
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 G- w4 _; V% F/ u" Q8 [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    8 [6 ?3 l  J/ J' g% o4 G' X瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?9 _! L9 i* T& Q+ }1 F, S- I. n

    ' z& X( C2 [4 T: r* X) o) O# A你第二个试验里面的j在循环里面又重新定义 ...
    ! Y0 _, ]& S( C5 X( i7 `, p- K
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! W  F( \" \0 {) N2 m1 Y
    9 a1 r+ r% i  c4 ^* r) r不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    & L' i4 M+ ?( Q3 G+ U内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) n& d: a4 E" f/ q( H* V/ s: [
    & i( `  a1 p  p( I
    不和它 ...
    2 J- k- k& v+ \* m
    . x+ V% z  F; _1 f' b4 K
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。/ G/ `8 X- D$ W6 }
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54$ d! h! g& R. {0 r$ s* N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB); v- z3 b9 T) {/ |
    {
    ; A$ i0 b- M( J, V        comp temp, xtimesy;
    5 U2 T+ p* ^+ B' b
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。* w6 @0 t1 e' ~. j+ n
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    7 y* v) i; r. _- J9 k  l0 NVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-17 20:37 , Processed in 0.039853 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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