设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?/ B% S9 u% r/ S- Z7 v5 w

    ( D3 `2 b  m6 w/ K  Q, l( T( l( }自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    4 M' Y8 m: a; L" I+ z/ J" {6 g9 m; o" V; ~& N7 N1 q
    速度优化问题真的很有意思啊。
    : R$ _9 o) _/ D( ]! y9 t. y
    8 B/ u! m. B/ t2 X% Y1 H& m9 b0 T% W欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?6 `: K  N% P- s! y2 y
    把代码贴上来看看?
    , G! ?% U0 }$ ?* q2 ?, e' G2 N" c
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-24 07:04
  • 签到天数: 126 天

    [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 编辑 . _% E. }6 b: p1 X2 V5 D
    数值分析 发表于 2022-9-24 23:04
    " s) S. X+ t& o拉下来?拉多少?5 ?" w8 O# u# M' R
    把代码贴上来看看?
    % N; b3 f; r" Z; `0 k4 u
    % m7 }5 b/ m+ A* y3 Y; X, @2 I$ [
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    9 e6 U7 p+ G% C/ r5 {{6 B3 ?9 }  I" S& v: h1 K
            comp temp, xtimesy;
    3 M3 R' P8 B: U& ]$ o2 y' ^  ?4 X        xtimesy.re = 0;
    % Y; R* O1 U  G5 k# B7 q+ M        xtimesy.im = 0;  h+ l, U9 V; Z  U; _) s& k+ }8 _3 n
            int j0 = lenB - 1;
    . o5 M$ Q& n# n        int    i, j, i1, reali;
    # u4 d# v. w4 |        if (lenA % 2 == 1)& ]6 j1 L7 O8 q9 B2 M
                    reali = lenA + 1;
    * F( W: y$ E' i( T6 }8 R        else4 B" {- P3 j/ V1 v/ L
                    reali = lenA;; N' s& t5 S1 u6 |
            reali /= 2;
    . z- D7 M+ ~! k% U  I* T' i/ p; u$ ]2 d- [* W
            int nconv = reali + lenB;5 }: v2 q+ t. e5 q" ]; f- P7 [( F
            //#pragma omp parallel for
    . D5 n/ g( A4 h# H7 {& d        for (i = reali; i < nconv; i++)+ x! `4 i2 ], P# R" e  r) ~
            {
    1 \$ T+ o; {  u% N3 o+ x; X2 s  ^                temp.re = 0;
    , h# {; C  o; x( o/ |                temp.im = 0;
    ! [( @* v8 c% g# v                i1 = i;
    5 S5 ^4 _: a0 V! p: Z) J. W                for (j = j0; j >= 0; j--), B) i- _  |- S0 d+ \3 X3 J
                    {& k* a2 t" p5 e
                            /* floating date operation */+ d: c& }+ m0 d4 g" B& B
                    }

    3 L# p! ^% ~8 l7 K. b& m3 o' D        }7 w  h7 o8 q% e' Q5 I
    }
    4 s7 B3 s  B/ a/ G8 p( K; a
    , N; J& w. d2 xxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样% y: Y5 L. }2 [8 ^/ \
    # I  H3 z) S0 T5 q
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    0 n& x6 G0 ]# \6 _: }( ?! ?/ [现在call xcorr 100次,耗时78s.
    # i, m/ V7 M# l; i/ A; O
    - P& H0 K: x% H- |3 @如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. - e1 F3 p9 j$ C8 _9 i

    & f5 f8 d, Q" E( y. Q5 Q, X$ I- ~2 u& D
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33+ r! M0 a& L$ O9 j
    Maybe Debug mode?

    . z/ X: [3 L$ Y$ n. V' x1 T; u; i' O% r
    不应该,看我上面的回复。& E7 f2 i4 a/ e6 l! [

    ' `: c0 B! ]9 N  [3 s我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 " _6 v! g1 i( v( C) C' }
    雷达 发表于 2022-9-24 23:54
    9 s4 Q: {0 O8 r* u  ~) ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ \. j" q0 H7 E6 B8 L: r
    {" D8 T/ Z: g2 q
            comp temp, xtimesy;
    , W7 e' X4 o/ ~1 q* Z
    . h% u" s: F0 W. |
    这个不是这么比的吧。。。+ o: W% [5 @/ x& m

    0 x- W9 `1 {. w" @; L: f您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 G1 L# ^2 w- n/ P' c% O0 r' q! u
    . Y. B% z+ [+ n* ]而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 & r* Q  o9 W9 a% [4 m& K+ V
    数值分析 发表于 2022-9-25 00:20
    6 T1 O4 ~, V  @0 s这个不是这么比的吧。。。
    0 F! W; A  i! O" S7 _/ t) D
    9 p3 m  L1 L7 q) P, G( n; B: T2 a您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ' D; F, l' Z2 |( L8 D# Y. M8 k  R! n( i' w# r
    有道理。, P8 ]  j( [8 G: g+ X0 L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    " F$ h: ^) ]1 N. p) z' ?8 X
    % B+ f3 L! b! F+ o% T, i我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46; k! g! X( N9 S7 f# B
    有道理。  r5 X7 y" O9 U5 m
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    " ]/ C& p, y% S, X
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    " h0 i/ R. Z5 j! |# @0 OWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    4 e7 m/ F3 J$ Y这个不是这么比的吧。。。
    $ Y3 l1 m. z' ^0 h5 e
    7 j* O9 S! Z1 B" ?您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    - Y3 ~4 _7 V' x% I# ?& \* ]  \6 y/ T3 {- r) r* q' K
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    " J8 L2 u2 D: u* S
    沉宝 发表于 2022-9-25 01:48; f, F* m. J( a: z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    0 _# G: c, P. r: U) {6 _& s! D( Y
    ( H; G& T: ?# h% F9 K是的,兄台说的对。$ M! z. E% M$ r3 l& @! h5 Y- F
    2 O# M( j( z$ Q# @5 W
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    8 y7 A: _8 a2 x2 h% t5 _$ h3 [
    2 c# X- V: |( |; J* d, R雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。% G' ^( Z& U! i3 \! ?  b6 o
    ' ?0 @2 \% t  R- m5 M  W
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。) j: X$ I5 s3 S8 v% G
    ; N1 K: F( i5 ]4 w3 l4 v* ?" Q3 M
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 : F7 h" i" M; s% x
    沉宝 发表于 2022-9-25 01:27% k6 X  `* Z( D) ~
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    3 h$ V* Z' x  s7 P$ A+ r: y
    ( ~6 e! C8 H% T) r; W# F& G  {又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
      `1 u& v: q( p- I3 K0 Z$ o  R
    6 W% V& r' l& v& K+ z我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ) t$ {+ ]4 z7 ]. z# f  ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    & ~2 q% m; |/ r0 v1 ^5 B7 e$ K! D: v' E时间差一倍的结果可以接受。
    - ~4 b4 Q, X" l5 W/ v6 a2 M# b9 y7 y* H
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    1 f% D) b; ]  z1 s: @7 ~
    雷达 发表于 2022-9-25 04:471 t: D3 \9 z  m# E  [% ?
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    8 H6 Z7 y7 V% Y
    $ K1 u4 m& m5 ^- d. `: U' c; d0 y' q8 |" U$ r; a3 P7 |2 s
    " u& M; n. b: l: P. v
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    % r- y' `: f5 j: r! I3 B7 }& H
    数值分析 发表于 2022-9-25 14:587 e% v8 L' q5 p4 V* c& x) w% [# j- v
    能不能把这个也贴上来,看看和上一个有什么不同?
    9 h+ q; l. @: O3 T* b5 e- s( L, \
    理了理思路,重新做了一个测试。! a) h% {8 F9 d- O6 H3 M
    做了两个 vector 和 两个 float *, 都长 1000009 ^/ T* m9 y2 x5 U
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    7 m$ ?2 y( {+ e2 N0 w# W' P2 f
    & G( Q& z) X7 y* C内循环试了4种方法,
    + L) j: E0 H2 l. G) n1. 直接调用 vector inner_product 247s ; h# R, J0 j, X0 T" p1 W9 w
    2. vector 循环点乘累加 237s9 d3 _/ u. a" _
    3. float * 循环点乘累加 204s) L2 S3 Y5 S; }2 K5 I) P
    4. 空循环 100000 次 202s
    . [; p2 _$ z( \0 I1 I+ T
    7 q2 d/ b" U) c% |" P5 W8 ]不做内循环 200s
    / t: O: a3 L4 j) k( V( F9 b" A! Q" F0 y/ q! i2 _
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。! @" M6 ?6 x+ b+ @6 g* k1 d% O, P
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ( t; J  y. P: `$ T# G7 D4 a6 |' ?8 s6 Q) \6 Q
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    $ M  ?: c# `) K+ V+ c4 F; J+ e9 d' ~: `! t2 O1 `
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)" _. X, @& Z' h( M% X* O" q

    9 ~9 \6 l/ A0 D; `# H. H
            std::vector < float > vec1(N);& k4 t3 T+ ~1 a# b& r6 `5 G
            std::vector < float > vec2(N);
    3 v. Q4 [9 o$ ?) M; M        float* b1 = new float[N];
    & Q4 w9 }) F: U8 @9 y- _: Q2 I0 \        float* b2 = new float[N];0 e6 Y6 i4 p6 x: Q% m9 n( Z

    4 _* H& I4 d" c) V' K% Q: K" m2 j        for (int j = 0; j < 6000; j++)
    7 a6 v/ f; m! G% g- q  x        {2 s4 @0 K7 R) \- ~/ [5 u
                    std::generate(vec1.begin(), vec1.end(), []() {
    3 a, c* ?2 S) `1 w/ K: V                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 n( N6 l0 X7 E
                            });
    ! \! z! e  H" U2 V* P: `
    3 o" p2 p: X2 k3 Q5 a4 o) p                std::generate(vec2.begin(), vec2.end(), []() {: P8 @% ]8 M6 _8 d3 a- T6 U
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 r8 a! I, @  p. j
                            });% r* P; d, O- E, S0 E

    & ?% Y6 \. m8 P8 q' j& W8 Y                for (size_t jj = 0; jj < vec1.size(); jj++)% j1 A% x$ O' f- A
                    {; `& e' [% U7 t. V4 b( A9 |
                            b1[jj] = vec1[jj];
    # Z, Q' l6 r6 F% `! K! Y; ?                }
    6 i! e- ^* U$ k- Z9 l% f! x
    - H2 c: L& X/ u" ]1 V                for (size_t jj = 0; jj < vec2.size(); jj++)
    , t' l7 z6 ~3 v' X) B: i                {
    " s$ s2 s0 M- d  N. l6 \3 m                        b2[jj] = vec2[jj];8 k& D6 G: V& v) |" v
                    }! w! Z7 G& r7 w0 ~7 D2 F# x

    / m' C+ i# K' ], `                //Method - 1  N=100000 247s  
    1 G/ M  H: j( `5 U% y                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    " A. k, z2 [3 v& C                                
    ! s8 B) j  Y& O% A/ l                //Method - 2  N=100000  237s
    2 a# H( `  I& k! W                /*
    ' e  N2 i2 `' `- i                for (int jj = 0; jj < N ; jj++)
    & S: l8 H% w! C4 B9 u) v3 v                {1 g- D/ M0 f% A+ M0 @5 X" r% k8 R2 x
                            fresult += vec1[jj] * vec2[jj];
    . w$ z3 G8 x  |. n) }9 }$ k                }
    # e5 t# `  m2 L- R# u5 o; `+ o                */! D5 M0 W# Q, l  X
                                    ! b# a0 |5 a: E! O
                    //Method - 3  N=100000 204s
    / v! ^( C! X6 e; A                /*
    ' ^9 v$ m$ K5 k$ p& _1 ?" A& f                for (int jj = 0; jj < N; jj++): m) C6 O, U0 P6 c; M$ B! i( y
                    {
    & C; E% n- l+ r                        fresult += b1[jj] * b2[jj];
    6 o# E; Z9 x- j                }
    & o9 x! F% p  T  M! J! `) {- a% K                */3 \8 \7 v9 p8 C9 I( q
    9 ?% m, E& @' e1 g; v( Y+ E
                    //Method - 4   202s
    / \' b0 s! t2 {% M0 O6 M                /*
    . X6 c) }5 u( \( Y6 A6 ?9 E                for (int jj = 0; jj < N; jj++)
    5 W0 V, {4 B6 W2 g9 O- K0 H9 f1 K! B                {' M" }8 I% B* E3 l/ M
                            
    # x" C! `6 B$ ]& I  V                }
    3 W6 |2 F# a; U) R$ y8 S                */
      q2 j+ N: t( j9 l* G/ }                //comment out all methods, N=100000  202s               
    - W0 Y: ~- y" U        }
    9 s3 k. `" e6 g& ^$ I! C' a/ e2 f8 D( l4 e% q+ V
            delete []b1;0 q% e) T- ^. k) N
            delete []b2;
    - |) c2 v' C8 h' B5 v4 H
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( o! z: R) O7 |1 ?8 k  r

    ' L, \( A( S) {' _; ^你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    " p5 k4 L* D0 t6 J* `# \/ ^; ?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    , `: \' m" ?6 V* D+ h瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    6 Y* G3 j9 X# t
    + R: s1 @5 ~6 l0 b( w5 @你第二个试验里面的j在循环里面又重新定义 ...
    0 y% J9 s6 s; j: o" L" }0 O
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL0 D4 ?3 [/ {8 O5 E
    + e, j# f& p6 E# x. A
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    2 A* h; o0 q$ v: Q1 r& M  e内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    0 Q2 ^: B4 P( E& v- X! x0 R2 S" u6 r) ^) s7 j. U# p
    不和它 ...

    ( T5 j3 a5 y, G( y) G
    0 ?" t3 z5 t6 w) A/ E不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
      U! x* f/ M  y! ?6 r7 {$ Z后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:544 u9 A9 B4 j  q6 I0 T7 ^/ z6 Y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 F9 ?' y4 ^+ R0 k0 F$ W
    {0 o. U, x. X8 V& p: Y' T5 h: x+ G2 T
            comp temp, xtimesy;

    3 o& p7 f) {. p. }/ u) U$ E这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。: n4 H! w9 m! n# c' ?
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ! }6 U* |+ T: ~4 h% NVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-6 21:16 , Processed in 0.067076 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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