设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?* V. g: N2 w3 _

    - ^3 X/ {! g" d# S: h  D/ a8 F自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。' o8 D% O9 q( h6 O4 F, v$ u2 o' b
    & Y2 l! {) Y- a: M* d
    速度优化问题真的很有意思啊。
    % [2 S) A( h! L- I! G# E1 k+ v7 b. E3 |9 k& h. V5 j
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    7 e7 x9 t% X- y  h! V把代码贴上来看看?
    2 t9 z9 [$ L2 ~1 I( m/ n& `0 T. C$ q
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 3 d, e4 L. P2 I' R, _; M5 D+ h
    数值分析 发表于 2022-9-24 23:04
    3 T: D% t% Q! g, y7 S: N5 {拉下来?拉多少?
    " b/ d$ T( T) }4 c4 w2 X: g1 b9 F把代码贴上来看看?
    , p- [7 ?9 v, c* I, R5 ^
    ' n0 T& b2 a1 x8 n8 W
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 s- g0 d7 Y7 U( Y% H
    {
    0 J2 Y  Y& K5 i$ `* W2 b5 n        comp temp, xtimesy;
    ! g6 W& j+ v1 U; D4 r: \        xtimesy.re = 0;
    + R. f! o+ @& J0 t        xtimesy.im = 0;, r6 V" W8 q9 l/ H
            int j0 = lenB - 1;& _1 u( A$ q6 g1 K# {8 ]/ A6 S, b
            int    i, j, i1, reali;
    % i* \! a8 @1 W2 h6 Y        if (lenA % 2 == 1)( y( I. B& H4 X/ S+ C
                    reali = lenA + 1;4 m4 y8 T$ B8 F% H. f! H5 i; y
            else
    ! f8 L4 K7 m( e, @: A. e3 R                reali = lenA;
    # Y7 Z  b4 L/ Y! s' b  ]        reali /= 2;3 B5 D0 Y" ?; m8 e0 B  T+ o
    9 |1 @4 ^0 n3 r2 Q1 J
            int nconv = reali + lenB;
    : Q( y/ U/ F% f1 I. x* [        //#pragma omp parallel for) |' q* J* t, |5 P1 B
            for (i = reali; i < nconv; i++)
    5 y6 i5 N* w: N! [. o2 s- S# C# r        {7 g7 h& l% O0 b* p0 e; B
                    temp.re = 0;
    2 M3 f. c0 ~9 `, V; l: K- c) P                temp.im = 0;# L. Q+ B  m6 i) M
                    i1 = i;6 H4 m, f. a- }4 Q# G
                    for (j = j0; j >= 0; j--)
    . y: F. u+ S, `* ?8 y0 ^                {- D/ P" v. g$ [: p, U
                            /* floating date operation */
    ( k) u7 R, T; E' d                }

    1 T9 v" _, {- p/ x" h/ I        }) `0 _  `" A& R# ^. v
    }
    . z, J' g( p. U0 D4 M- U# S; Y4 z3 x
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样. Q' \9 J3 ^5 b, E3 h0 O
    ( I5 Z3 j; {4 X
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。, j2 H9 s7 c% [2 E+ ^" Z! s3 b- R8 O
    现在call xcorr 100次,耗时78s.
    ' g* Q% [$ B  D6 T
    8 e3 `4 W7 F: |# O- _$ C5 @/ T; E如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. & g( O% o( a: \$ _( v

    6 l9 y+ b# t- C' W: Z( f7 |
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ) V1 I5 S: t. X1 fMaybe Debug mode?

    % I: m, J2 G6 j% j' }# B# Z) Q* @. N- N1 m6 h6 ?
    不应该,看我上面的回复。1 ]. F8 C7 y1 e6 B
    9 p+ m; A; W9 j) g& g/ N) B
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    3 E% B# g4 }6 Y* I7 a; G
    雷达 发表于 2022-9-24 23:54
    / ]5 Z  _/ A2 b; fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- e0 [) }3 @, k, Q% ^
    {
    % E! e5 @2 v( w        comp temp, xtimesy;

    : h/ R6 Y" D) N
    1 X! k, G0 z9 R3 p# z+ [6 E这个不是这么比的吧。。。6 V& o) e# q9 r% f

    , L3 Q# a, t0 e6 L3 S( j/ b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    % t9 W/ X3 u- |" \
    6 m! S5 @+ Z. F, X1 r+ S# M# b而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    6 G. H7 w# f+ f/ c* q* [/ U0 [
    数值分析 发表于 2022-9-25 00:205 e4 Y' g! S! u- D1 w/ S* r
    这个不是这么比的吧。。。
    $ j( V; B2 O4 C) ]( }% J% l9 K5 s+ @( b
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 C  Q; |1 K7 q1 @; B; ~2 D* d
    2 A) A9 `# a: Y; D" Z
    有道理。
    7 E8 {% \- A- _1 y: I! ?所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    4 D# e* O9 @. S0 |- ]
    4 D' @+ n9 e8 z! f; T. W我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46- J" J  M+ ~8 Z1 ^/ w$ p( }
    有道理。
    4 w/ ]! `; C  X3 p' d5 g所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    6 `, K  C7 G" O4 c$ H你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多- ~" `0 B( i3 S$ v
    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
    " B/ `9 {& ^9 k这个不是这么比的吧。。。. B2 W* a# `2 [: |
    * A" x6 B3 @* d$ V0 E% F
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    - l! u. ?  _4 n5 m3 ~6 Y' F* v: B  ]( R6 d: E- [0 ^" I- H! T
    现在的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 编辑   E0 l( k" P0 k: y2 G6 G' K
    沉宝 发表于 2022-9-25 01:48. N" l  T( \1 ]. c1 X3 p
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    4 I! z) \; Y% d8 c/ ], x) y; N) P& ]% f1 c4 e
    是的,兄台说的对。
    0 X3 }! R- r. v4 a7 K: C6 z" K
    0 [% Q! U+ W6 v, s其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。% n/ N0 o: Y5 f# J) x2 [

    % u  \& N: N/ }( P7 w+ x雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    8 z9 Y: R; \' |& F7 W8 A5 s1 ~5 Y# ~* o0 u3 |. I- t. @9 G2 X/ ^
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    + x4 O" Z6 M' _3 I
    ; b: @  t6 I  H, _8 _当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 . \) t- _2 _; r, h2 Y4 {: F
    沉宝 发表于 2022-9-25 01:27
    ' L/ e4 x/ [% z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    & g, |; W: f" N
    ! m, [* O( I1 G8 E, R1 j6 ?) {
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。' \  O$ m- @' ^% b! ]3 n$ H/ s" n
    * T) f! |% x6 E, }
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:472 I* k5 s" C. K$ D3 m- P- X
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
      D+ `; ?9 L* F9 Y
    时间差一倍的结果可以接受。
    9 y% U. ?) a: Q* ~# _8 e
    & f: X9 A& z/ d; d9 z) @/ Z4 A0 Y你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    " m3 z( e7 k6 P5 b; B+ x( I. r
    雷达 发表于 2022-9-25 04:47" J4 V, g  n  T7 t! V# W1 H
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    2 ?1 k2 q1 ~' _+ y, Y( C3 w8 Y4 \

    4 p% k# E8 |- B$ Q! t5 A* o# W& k( p% |
    % \; A0 v4 z1 S- F: T, g- C$ Z) p
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 + g. \4 E8 W2 F0 e' x
    数值分析 发表于 2022-9-25 14:58
    5 g& S  n% ?" M7 l3 H9 D* r9 s+ A能不能把这个也贴上来,看看和上一个有什么不同?
    & R, i# x6 M: X2 }% `! G$ z+ @
    理了理思路,重新做了一个测试。
    % T0 ~/ p: H1 l做了两个 vector 和 两个 float *, 都长 100000% v) I; @  W5 ]  s4 G. [0 ?
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.! l0 t' s5 T& i8 m: t1 t, H0 W

    $ }, N+ V8 z  s% l, Y7 |内循环试了4种方法,
    : b3 T  S& A2 z" ~+ Z0 j  n! N1. 直接调用 vector inner_product 247s
    1 f9 _8 Y; i! F/ E2. vector 循环点乘累加 237s
    ( l0 x& K5 i" R3 B, _3. float * 循环点乘累加 204s
    . \! N  M8 a' ?  ~  Q" [* X" Q2 a4. 空循环 100000 次 202s
    ' i9 V8 Z7 I# a6 y: i9 w7 p+ C+ R% Z4 d
    不做内循环 200s+ [' \0 [4 o/ m" k

    1 V8 D/ V5 s3 v8 K. z你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    # q% O, q& V9 e" L+ ~+ P另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。  B  l7 e% e- U, d
    2 C# |6 ^6 M0 U; x
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 f# s- ~- Z; S! H8 j

    9 b  b- @% d& @$ m1 @1 X(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)* n5 `) p7 K  y: J
    9 n4 ]; l! Q/ p1 V# }" l; y3 ~
            std::vector < float > vec1(N);6 e, R9 O' j/ K
            std::vector < float > vec2(N);% C1 U0 X5 G1 [7 f* p% O3 \8 p+ M
            float* b1 = new float[N];, `# P* `# q. L/ \
            float* b2 = new float[N];" F. B/ X/ X0 e% Y) K* S0 q
    % V% x. P7 C5 L) X0 T: e
            for (int j = 0; j < 6000; j++)
    % T# @0 d; t" m/ U& l' B" `! T        {
    $ m8 P% _9 {9 h( [# j                std::generate(vec1.begin(), vec1.end(), []() {
      x7 G$ ^. J" Y3 S! |, K                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    , V  d0 F( D4 J4 {                        });: T0 ]; c- p$ x0 C
    6 [+ h6 ~/ t  V5 x4 E
                    std::generate(vec2.begin(), vec2.end(), []() {5 e) w* r* q3 a, {: @  }) i
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: t3 o* r9 J9 c$ b
                            });+ e/ [( e* z1 Y/ k+ r3 g

      g9 I' V+ Z0 X! Y% q9 z' @                for (size_t jj = 0; jj < vec1.size(); jj++)
    9 W+ ~. ?" n: E* f: `                {
    8 }: ^6 I! Z: D. r                        b1[jj] = vec1[jj];
    : t5 P( p$ J" n0 j% E2 v                }% `  G, g: M# K( W# N: I3 r; l+ F

    # k  j* K" @* J1 O% t# F% s                for (size_t jj = 0; jj < vec2.size(); jj++)) a# v! m8 `$ |
                    {$ V: h6 l1 P& U, j6 O$ T6 ?9 j( d5 a
                            b2[jj] = vec2[jj];/ n: \& X2 h$ n
                    }4 a" P- {0 n, W
    9 @, F% E) c! L7 B' z0 o
                    //Method - 1  N=100000 247s  6 }2 o7 M# H- Y# M1 g
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    - K  P) @9 w7 M5 q+ p: U$ l4 _9 ]                                
    $ w+ C4 `" b* P                //Method - 2  N=100000  237s* N) [6 C; `9 l5 L1 u0 V+ O+ A8 N
                    /*
    " K- l: G, g  X7 D                for (int jj = 0; jj < N ; jj++)1 `* a5 z) G+ Q9 b$ I! q
                    {
    $ y4 F+ `/ |  w9 `* e% z                        fresult += vec1[jj] * vec2[jj];
    ) y0 r' g- p  |9 {& f: Z7 P) ^. C                }
    ! I9 W5 L2 g" ?9 s5 r9 U                */: @( U) q% ^  h
                                    4 F1 ?5 M, E' w0 n
                    //Method - 3  N=100000 204s+ l. u; [( B4 i; x0 `
                    /*7 P8 k7 l2 Y! q
                    for (int jj = 0; jj < N; jj++)
    # K8 B* d  v. B3 u  \                {9 q$ \" E! I  Y( C; p9 W; B3 q" `
                            fresult += b1[jj] * b2[jj];
    / D1 x: d9 f. S# j$ E4 m& l- T                }  [) r# F7 _: A+ p' Z! |  s
                    */
    8 L# l- S# T6 _) g% u7 b% h; _! j6 Z1 }1 H7 |" |0 T/ Y! K6 c
                    //Method - 4   202s8 m! ]2 k/ c( `  W% `4 c$ T
                    /*
    * ~/ k% n& J% r& y* |' I* P' Z8 l                for (int jj = 0; jj < N; jj++)
    & |: a! |, E5 @& p. N                {
    / S- g2 z3 H" T) l; g/ a                        
    ( i1 ^5 }$ Y  C: V$ o                }
      i- l% t7 J8 [                */
    . b3 l9 F9 B' K+ k+ C* H* y                //comment out all methods, N=100000  202s                + x7 }, q) |+ w- h
            }5 e6 _/ P2 v) e6 J+ V" r
    3 M3 ~) k' U* A5 r0 r
            delete []b1;
    1 |) Z$ X+ `: Q        delete []b2;

    * [  X* E) [# I9 R( o7 E
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% ]7 p7 U1 l' [7 K3 r7 v
    " [6 h9 K  S+ ~' s4 }
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    " y. g$ O* z  p  r+ s7 m' U1 x
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ W) S5 X3 i9 T2 ?0 n# F& P- t瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ( N) m! X3 f( k% c* v7 `6 c' x4 Y6 t8 G3 V7 l
    你第二个试验里面的j在循环里面又重新定义 ...

    7 @, _3 E% M2 ~. u. `内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
      ~7 A; h- G; r: {# o+ Q' D7 |
    1 i- w: ]4 v" G4 V- r7 R% @不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:161 O: L8 z* x" E9 r
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & A. v8 Z' u- v1 C; q& i* j7 c) I2 ?- D) S3 {
    不和它 ...

    ; L8 R# g/ w5 \( s" O" M1 y3 O' P+ f9 m6 O
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。4 p6 x7 b) n; I# _* x- X1 \. b
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54" }% S! W* S. s: a! Y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % W. `+ w- M! J( m" ?{
    : Q0 [. z7 k; H4 q8 b) l- {' `        comp temp, xtimesy;

    9 c1 m; ^- `3 G. V这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。  a4 B  ?8 n# T( b2 z
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    4 A& Q( |, y- Q/ f. q8 NVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-7 07:31 , Processed in 0.069233 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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