设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    6 q7 j$ }# U9 @
    3 t; G% {$ E" y" J自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
      ]% u; X# W5 r4 q3 f' o% Q3 c) g* `/ o8 }
    速度优化问题真的很有意思啊。
    1 c' I& J9 k" j9 c' H$ N. I: G) t% g9 O7 B; r8 h6 E
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    % l5 H( r3 Q0 {, L- R9 ?把代码贴上来看看?/ ]3 w7 e0 K2 ]; ]

    # j5 `! @2 H: V6 P# g4 a; V难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    . T8 O. R/ @! E4 n2 ]% _8 u& V0 c
    数值分析 发表于 2022-9-24 23:045 w! o" v# j) ?) t& o
    拉下来?拉多少?1 }) c# b  _$ g# d' i5 F
    把代码贴上来看看?

    , P0 I* U, y" z2 f& D7 h9 J
    8 `5 m* y, C* gvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 j, u0 i% l& \5 U+ y
    {
    ; y! R; f& A& l4 X& c  Q        comp temp, xtimesy;
    : H8 c& K6 Z0 X        xtimesy.re = 0;9 _, c* S% E* Q& @7 X% }
            xtimesy.im = 0;
    & f8 z0 _9 x2 d2 _) V2 s' m. i  G        int j0 = lenB - 1;
    2 m  w+ o" |) a7 h( M        int    i, j, i1, reali;3 c4 b0 @+ D, ]( T
            if (lenA % 2 == 1)* N, `# }* e) X$ ~+ u% [
                    reali = lenA + 1;, `6 i6 d: W0 M% R: V3 Y
            else
    4 y( q- S! ]4 {* S                reali = lenA;
      L+ N1 v5 \  Y% x/ }$ `. U        reali /= 2;
    1 U' Z+ s- Y/ z  M3 S+ |
    * M1 @: h. Y2 p        int nconv = reali + lenB;
    8 ^2 K8 X8 v9 D1 L        //#pragma omp parallel for9 x% \5 p/ H! V1 W9 O: T! V
            for (i = reali; i < nconv; i++)" h2 _2 ]& u% G# \" d) p, O
            {; ~% G' H& H$ |3 Q5 m! O
                    temp.re = 0;
    . ?# u" P! {& k' }! P1 h3 P                temp.im = 0;" e0 i( W3 A0 z8 ~$ [' [4 |6 z
                    i1 = i;- q" t8 D( Y/ t* u8 w
                    for (j = j0; j >= 0; j--)3 K& B7 H" M6 ?/ k" x3 l3 s
                    {
    & O7 }& z* s+ K$ C4 j5 b9 W                        /* floating date operation */
    + b% V4 o# i$ R$ {3 R                }
    % ?: E1 j& Q4 H, K! i# z
            }5 d' K0 @0 M3 g' ]+ Q4 C6 y( t
    }
    2 ?$ N% b2 S" i% i# q0 O" M) z9 K4 D2 v
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 t1 E  C. X8 ?6 t8 ~$ n; E8 G8 v3 s- P; k& m% ~) O# K7 v1 M1 o
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。1 q6 S+ I* U% M4 {: Y5 L
    现在call xcorr 100次,耗时78s.
    8 T2 [* F4 s0 Y/ h) k" K/ T
    5 J) y* F3 g- p如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 5 f8 J* @5 j% o/ k: r' O# v* q, h! [
    / m, t: x! |# x; x7 w
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    1 Q. n5 G, `5 YMaybe Debug mode?

    ; P! F4 t( r  W$ ^* c* h
    & e9 |0 |/ j/ G8 m不应该,看我上面的回复。
    * E' L, V( X: _* G/ E* K1 A+ r4 b: a8 v2 E
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ) _: @8 q9 T' X& x6 J' U
    雷达 发表于 2022-9-24 23:546 ]& g' w4 l5 ~( z+ G# E
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 z6 j7 \' U1 [- X2 `
    {" c! M0 ?$ U, `: w9 X3 M
            comp temp, xtimesy;

    9 M* F( c* L' ?' F+ I
      R" A6 T7 o/ D5 q- b这个不是这么比的吧。。。$ A/ m0 S: s5 e4 u- m
    9 ?# F( N7 [# E
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。1 F7 p" u) S" B2 _6 D- H) u
    0 l% M1 y' ^( a, d
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 3 k: G$ y6 d5 q6 j% N- T! u
    数值分析 发表于 2022-9-25 00:20! P  j) G! s. s! `, U, t
    这个不是这么比的吧。。。1 x( o' [. Z8 G8 ^5 K
    + b6 I5 b, ~% a; f* r
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' L9 e: \6 v6 \& ^- o9 _

    ! U1 I& L, H' w' k- `; i" U有道理。
    + K3 r. [( Z! u所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ T: _% L' y" Y# @% s% ~+ _# w6 `2 f7 F
    ; R: q6 {) E" B. m% Z! B/ Q我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46: w% L/ |- C: d% i1 q; V  ]+ x+ ~
    有道理。
    " q1 S" L" c1 Y9 U1 _, G. {3 m所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    % ^7 Q+ A) C7 n' M- n, O3 U9 F
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多/ h8 y" Z2 _7 ?0 h. n
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:206 W- V0 k- o  ?. T
    这个不是这么比的吧。。。
    : b/ ~# V4 O0 _9 w% E' ^; K0 M3 ~  W  ~
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    + \5 R# M- i5 A- Y
    : y- Z" F' a) L0 n0 s现在的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 编辑
    ' ^& A/ P. d/ a
    沉宝 发表于 2022-9-25 01:48
    ( z3 Y- h! Q0 O9 \# Z' `: \现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    # o) S. t; f+ I5 @  x6 ?) p% @0 r
    , J# R+ _4 Q- A3 D( w: L4 I是的,兄台说的对。
    4 b; ^8 ~/ `; Z. u0 G5 ^% c0 Y
    ) ?7 Q2 e9 h8 t* M$ f) b9 W( x% p其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。* W) [, [$ {! r, [1 G' X1 T. \
    + `9 I$ V7 o  Y
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。+ B& R; U) l8 |2 s) \
    , c+ N8 l2 Q0 g, E$ q
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。8 d5 Y6 M+ g, d9 V1 ]5 b" K) c

    : y" n) ^  l8 O2 @7 E! q% G* n" U当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 1 p+ E5 M3 F1 o% j6 A
    沉宝 发表于 2022-9-25 01:27$ N1 {0 \9 r* w. s
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ) K* d) R. ?- C1 E$ K4 {
      S9 d7 o- l! L& M+ [- p5 U又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。  f% U, S. C% {2 p$ W2 F

    " U0 \  I: T! I4 o( r! h2 z# C我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    7 f3 }1 e0 `$ @6 _& F* g又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " }; |8 o  }+ D8 P* @- h* N# {
    时间差一倍的结果可以接受。
    $ I+ x5 }$ H4 N6 C7 C5 |7 T$ W/ _2 q: x4 J; T* u  R
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 5 V( L9 |+ c8 t: g. s+ B7 d( a' j6 r
    雷达 发表于 2022-9-25 04:47
    # V: K4 @- I6 Y) \$ d又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    3 T. K, C1 a% h) w' I5 o- Y, L4 r& ]
    + v& T5 a/ c% M" y2 d* e6 i
    " o) V: T9 X) t& d- _
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 a( V/ |( Y% M4 _' R. w
    数值分析 发表于 2022-9-25 14:589 U* j; @: {5 W! Y' f
    能不能把这个也贴上来,看看和上一个有什么不同?

    , V( l# i$ P, h8 }( o理了理思路,重新做了一个测试。
    0 {. [7 K' c" w" [- }做了两个 vector 和 两个 float *, 都长 100000
    : P& J* ?8 ]) j  b: _外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.) }$ H6 i; x9 A/ b8 s( E' P
    0 S2 _  y2 u% i6 V2 x! N2 d" i7 h
    内循环试了4种方法,- F7 B6 L) h9 y. m- x/ J. V
    1. 直接调用 vector inner_product 247s * B4 x( j# r7 E) g% N6 E4 |
    2. vector 循环点乘累加 237s
    % F; g. A& \& g& s/ F: {  |- w3. float * 循环点乘累加 204s
    + N6 C! S$ @- @2 t, C' [4. 空循环 100000 次 202s
    , M- U" _0 J+ n( `* ?$ o8 {" E: ]. d
    8 A4 P& h( @- U% A3 Y不做内循环 200s
    , ?% T" X! r9 M7 ]' y. c: k
    - R5 i0 S7 z$ j' N# t# C! e$ j你昨天说的对,内循环本身占比是很小的,大头在其他处理。0 L2 x4 h* N' y- I; d0 H1 F' N
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 d( T/ h$ y* C( Y: N# [4 [
    7 _3 X9 U& v8 ], s. H) A( L
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 y8 R* `/ R! ]4 x

    & ?: k6 S- S0 V0 I& m- @(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)5 _7 \# `- o2 d2 E  I

    + v) G, |# i8 W
            std::vector < float > vec1(N);
    / ~& q+ X. K" Z7 h8 H; n$ p% N        std::vector < float > vec2(N);6 f9 F- O& Q2 W! t' k
            float* b1 = new float[N];2 |" Z7 p% L1 l0 i4 E
            float* b2 = new float[N];) @3 U# q# g: z
    + G/ N- J+ X% D
            for (int j = 0; j < 6000; j++); ~8 P9 T/ ]0 v6 B; [* P3 e: B+ }
            {
    + X0 Z- f& y0 }: _& K                std::generate(vec1.begin(), vec1.end(), []() {" C7 I$ z/ k7 ^1 \" A2 h
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; Y& s" _1 b! n2 f1 F
                            });
    ( b6 e7 ]/ ]. X& a; n6 O) l; Q( l0 N8 b
                    std::generate(vec2.begin(), vec2.end(), []() {) q" S% G, s7 o! \& y  R, C
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    1 Z1 l: X+ X0 v5 t; q& n! y- |$ A                        });) E+ \$ N- h9 K* f

    8 ^/ a+ f1 i1 j1 k/ H7 |                for (size_t jj = 0; jj < vec1.size(); jj++)
    9 ]0 z0 h3 O0 G' l- v/ U                {
    $ w2 H9 _2 }6 d3 p8 [" [1 n                        b1[jj] = vec1[jj];
    ; @$ Y; N) V3 ~                }: m7 a6 t9 N' J
    # v# `! S  a* I% C' \" ~
                    for (size_t jj = 0; jj < vec2.size(); jj++)2 Z' ~' t% C( t, r0 j5 o4 P, o
                    {  Y: E3 W8 J6 W5 X! L( o9 m! C
                            b2[jj] = vec2[jj];
    ; K3 n% D7 r- j* R' E6 p: x+ @  w                }
    : F- x9 C( k  j* r. F1 j& ]6 a" d4 L& y1 W. X
                    //Method - 1  N=100000 247s  
    ) I, z9 b7 f  s6 G* c. J1 k2 b                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. [! E5 U6 u8 m; ^& u0 d8 l3 C; l
                                    ( Z- b0 J! C9 P: J) u; U! v
                    //Method - 2  N=100000  237s4 Y" \4 u7 E) Z, e3 s! N! X8 I' M1 ~
                    /*
    1 n6 z2 N. L$ I3 p! S                for (int jj = 0; jj < N ; jj++)
    ' q  A3 D8 u  M- o                {
    / A$ ~  u' l( Z4 f                        fresult += vec1[jj] * vec2[jj];% H6 j$ ~7 T) k1 }
                    }0 J- Q$ ?8 h- Y. B1 D7 K7 {
                    */" R7 O- z( |+ r# c$ x
                                    
    " {' v4 ^% m, o! E- A                //Method - 3  N=100000 204s
      Y# q1 u1 X. o' _) p. t1 D6 `& X                /*: U' `1 S1 N% X/ h* b
                    for (int jj = 0; jj < N; jj++)5 R9 R9 v) ]" r
                    {0 Q; }& I( m( _  N$ }2 o; w
                            fresult += b1[jj] * b2[jj];2 [% R' }- x+ w6 i4 T$ n
                    }
    ! s0 c0 \! p0 U/ q/ \$ R$ _: s                */
    5 x. z  y7 V: k4 H! ?" S5 X3 T9 O* k' [( B$ h+ R2 Z, v7 N
                    //Method - 4   202s
    / H' L+ t. B; l  c. u2 R* w, g- v                /*
    5 V1 L( Y! I& N. ^6 G9 B                for (int jj = 0; jj < N; jj++)
    - [8 ^3 \, G# T3 V  ~0 A  d                {
    8 e; Q* v- b. W                        
    9 Q) j" O1 m' T: G+ H                }
    ; d9 D) B8 C* @- t; l                */
    " o( ]; J4 ^9 t6 N: b9 [                //comment out all methods, N=100000  202s                : v" @5 t0 k& c( b. e4 \* x
            }, n( L6 F) Y) @$ W4 e
    2 ^, h7 E5 ~& P
            delete []b1;
    9 [$ }" S; O. `* O$ d$ x- x; r        delete []b2;

    ) N& B: E$ k) |: u
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ) g8 g% O3 Y/ \1 b6 k1 @$ T! L. d, `; l% o
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?) |' Z; _! S/ a3 Q- B) W; L5 q2 W
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    8 ?& ~+ ~; E7 j6 {) g( U瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?, T1 U9 e* Z: {& v" {( C
    + e; Q- h9 t5 O6 b8 S
    你第二个试验里面的j在循环里面又重新定义 ...

    ' W  b7 d9 x/ f/ D0 ?内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 o/ n: F! R9 U
    8 S( D" [) {( I+ g6 ]
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16& \4 w$ |9 J3 O$ X  \( U
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) b& [& `6 V# D7 j
    + x. W" C; n% J, O' q: F  S
    不和它 ...

    4 I2 a- n/ B7 D; a; b/ q% W6 F2 F/ T7 q
    + r- G2 A" R  f. H. |8 ~不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。' d9 d9 G/ X* V! y9 N
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 ]# f, H" d2 d& L8 ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( P* c1 y/ Q4 p# s" E. W
    {
    ; \3 J- b2 `4 g7 ^        comp temp, xtimesy;

    ) x1 j$ a& v1 w" M3 H% x" p这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。* Q) D# c* ?' y+ z" ?6 M& @
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ( O7 n! M  G8 S: S2 z. NVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-7 07:17 , Processed in 0.040001 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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