设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) Z/ ?& D4 {! ?

    5 _& g, N" X7 U6 N0 z' `& ?% Q自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。' T) K# Q" U" k

    1 x( b( K! n2 u9 R速度优化问题真的很有意思啊。
    ) c7 k' |, q9 Q
    & k( a1 }) G6 Q. m. z: W欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    , }+ k# ]# ?" j% }# b把代码贴上来看看?
    , H3 R- Y1 q0 z) [- F! `, r5 Z
    ) Q$ O# o  l6 U2 s' D) H难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    , ~: I6 p" Q2 ]$ q' Z4 `
    数值分析 发表于 2022-9-24 23:04
    8 e" i% P0 d5 D7 G; K/ x  X拉下来?拉多少?1 _. }( [6 e2 M% k6 f8 i7 k+ q
    把代码贴上来看看?
    ! V0 c. w- N- g- i9 C/ k% E2 O, B
    " l) P4 W" ^" t2 ]* A* H
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 E4 t: R1 E) j4 K) p3 i{
    7 Q" M; F) v* Z2 T! X7 ^, r  _3 m        comp temp, xtimesy;. }8 a$ a. X0 a3 H3 c
            xtimesy.re = 0;
    , Q* _% U  L. m        xtimesy.im = 0;
    % P* U6 n% D4 V+ M. _3 {5 n. [        int j0 = lenB - 1;) `. @3 l: b+ \: e) C$ R  E
            int    i, j, i1, reali;
    9 [$ w/ d( l  j, @, ?        if (lenA % 2 == 1)
    + C# z- C5 {: u# Q# S6 t1 t% t                reali = lenA + 1;
    6 b) w4 P7 n4 |' I+ r! Y- j        else: G% [4 C6 ]) i9 g6 J  m" A0 L
                    reali = lenA;1 w- P7 Z: Y7 q2 \, ]3 B
            reali /= 2;" W. `+ y- ~8 `' `, l- b

    ! A+ v  Y1 O3 Y& X7 @& ]& F  y; f. E        int nconv = reali + lenB;
    ' Q8 k, A( N, H. |6 t        //#pragma omp parallel for9 ]* F% m: c5 U$ |
            for (i = reali; i < nconv; i++)0 d$ U) k; |' P& y. k
            {
    ; E9 ^, j. `; [  m. E5 O9 h& w& i                temp.re = 0;
    - x8 K- b# u, M" X6 L# x                temp.im = 0;! k& b$ @3 N# g/ G) f, G3 s
                    i1 = i;
    % T  S1 G, S+ E3 s, R; N8 R1 K9 `7 ?                for (j = j0; j >= 0; j--)# o: ?+ J" k- l- ]7 N
                    {
    9 q, h5 I$ v9 E$ g: N) ^                        /* floating date operation */+ Q  y5 s' G3 \
                    }

    2 w: V, _7 y& ?5 H# }. v        }
    , N* o5 l: R+ }, a, g9 j! ]}/ Y1 M3 d6 B+ T% ~

    $ y' o# W/ Q$ B* Yxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样3 U. G0 T; \$ L8 p) E
    2 y$ f6 [$ G* y! f5 Z, M8 k% V
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。. t( g% Q! o& I1 r& [6 z
    现在call xcorr 100次,耗时78s.
    * R8 M" p5 X& Y1 g
    : t( y& D0 ]* P5 U0 d* f如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    6 f  R* Y( t1 k3 Y; j0 |8 w5 z' B1 e) b2 M, t+ b
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33$ b! B7 l% T! g* b
    Maybe Debug mode?

    1 u# R8 D+ p. a/ j: H- W  N& p. I5 I. f/ \6 r9 M8 ~, g& F( }
    不应该,看我上面的回复。
    5 [. K& S; w0 X6 L- m
    ) S) m' ^4 h' T0 W8 A我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    & ^% L$ T0 q' i! e' G6 F- }
    雷达 发表于 2022-9-24 23:54! W4 `. Z  j* k/ N( ?4 L5 }
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 n3 ]1 }4 D, ^+ p4 R% H3 D
    {
      B8 r4 J/ ~. K9 U        comp temp, xtimesy;

    & R6 K9 D1 ^, y2 c) p2 N' Z% V" W+ a6 U" q% P
    这个不是这么比的吧。。。
    1 A/ Z- }: J3 S) }9 F( w' L. T# I/ n- U
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    9 a* J  E9 A' K2 n
    9 N. l& [" n8 S9 P! ?' s而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 ( p. ~+ r2 @+ p0 C0 f& X
    数值分析 发表于 2022-9-25 00:20
    $ w" y" r6 i- Y这个不是这么比的吧。。。4 _, p5 F2 `9 z% S4 h  v
    6 G# f4 A. |$ K
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    . |0 V" T. z5 j
    , f3 `- ~7 A) v" c3 u( T
    有道理。
    ) V) P4 y( ^; w2 _/ B& e所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
      r4 |% M4 c+ ~2 f, W+ @$ l1 B. s# t2 z3 V0 K! u' F4 n! A/ U, q$ f
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:464 C* f/ t# t& r$ j, e
    有道理。
    ' G2 j; Y9 [8 B& [+ I2 w所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    2 s2 z+ r0 \" a. D. U% B
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    + }2 q. T% W+ G/ E! R5 DWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20% u. l3 K5 {& H2 v7 C6 F
    这个不是这么比的吧。。。3 j  m! e6 ^; c$ N1 o

    ; k8 ^1 k1 X1 I/ n您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    3 r1 ?) u  h( g8 N- C. P& I
    " Z2 j6 N# O0 [& n9 S" C
    现在的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 编辑 ' u% ]7 l8 {, a( \, ?% @. Q- z* f
    沉宝 发表于 2022-9-25 01:48- P% @  H/ e4 v1 k
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    + K! f1 C9 x0 l3 X
    / Z' f# ?- C5 ?是的,兄台说的对。
    . F/ q2 F; M4 R7 E* L
    ' O7 |7 f; a& p7 @, j7 q9 U/ I其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ( g5 G* V& H) S) [$ B
    - e0 A" I% r! n9 B; {8 q# H2 K雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。9 t( p+ ~" ~, a- p. @: T
    * a$ n8 o: s& `. k/ L! y0 O
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。6 S4 B6 S. \$ b3 c) N

    % L; o# J8 ~0 }& W$ ~  L5 ~当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 * \" z2 S" K! `% j8 e1 q  B
    沉宝 发表于 2022-9-25 01:27) \# o. }( ^! q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    9 J) Y* `* T1 h5 a

    * @- [- C# r- U/ J6 t- B' y5 ~又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    & u% h( f0 f4 |0 j& g% b
    $ x3 R. \9 @% L- [% @我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    : h6 \7 i9 s; Y, Y5 |又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ d* x, p4 }* r6 e5 L# `/ O8 S
    时间差一倍的结果可以接受。
    5 Z0 D* w. v% L: E& O  F+ p: e6 a; [. R( \& W( d4 @
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ! @, m; @: I& W+ N0 i/ H3 ?" L! Q/ e+ L
    雷达 发表于 2022-9-25 04:47: R" m% r4 r3 n. p% m
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    4 l' R5 [5 k% c' [

      m) l* ]7 H7 p& n, H0 k& L) `& o7 x7 Q& X0 Z

    . f7 c4 O5 r+ B; w能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    1 R9 }3 b; \( h$ R5 p
    数值分析 发表于 2022-9-25 14:58
    1 n3 v" U- o4 c% \4 C- j: U能不能把这个也贴上来,看看和上一个有什么不同?

    $ u0 A: L1 K5 N: P  B' u% j1 o" u理了理思路,重新做了一个测试。1 ]! ?# _+ c. D0 K& k0 @. j9 O6 U
    做了两个 vector 和 两个 float *, 都长 100000
    2 l, o' U- H$ g外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    2 ?- |, o' J8 q$ Z, I- q, G3 q1 A1 i8 ^5 U8 T# Q5 |
    内循环试了4种方法,$ q8 {0 u4 B" z1 s* a) \
    1. 直接调用 vector inner_product 247s ; \' O: o3 c: O  n" F& g  y+ Y8 Z
    2. vector 循环点乘累加 237s- _" |) y2 U) i- Q  O
    3. float * 循环点乘累加 204s
    " M/ U) u2 @1 Y$ Y  U4. 空循环 100000 次 202s- l7 J, V/ n. r. I/ ]7 r6 {3 p" j
    ! F+ h: w- o: Q
    不做内循环 200s
    * M1 R' Y4 B' v) D& T/ t: N$ ~
    9 Y. ^" p+ m2 V你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    3 z4 [( ]$ R! Y+ s1 C另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 `8 ?) }! z% [, ?6 X

      A6 a/ m% X6 b1 G/ M+ [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 ?$ h: j" M& N5 P
    + u8 C8 C( A/ g5 V% m
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)' b& v' |% N; z
    : U  c  Y. `* K; o
            std::vector < float > vec1(N);$ d6 |! f: L0 s; E: `
            std::vector < float > vec2(N);8 W% t  D$ T5 V6 M: `( I8 w
            float* b1 = new float[N];2 F# M- V1 X: A) s0 H
            float* b2 = new float[N];
    # M9 D. |& f# k# E! O; L  G5 O4 H( z+ X
            for (int j = 0; j < 6000; j++)
    8 W# ?+ a, s: t" e9 T        {
    1 S9 O8 G7 q1 o: h" r* S% j  ?                std::generate(vec1.begin(), vec1.end(), []() {
    7 `. m8 Z4 u* W8 w7 `1 A" U0 W% X                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" j8 U3 g+ ~: O  V2 [
                            });
    * g# M! o, @+ \4 l- {2 Y  |+ B: B. c
    + P& S& ~2 |: c( L                std::generate(vec2.begin(), vec2.end(), []() {' v# n6 o* Z* f
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 j# w! P! {8 N
                            });# K6 M" V; ^/ x/ w- s
    5 A5 s& ?* r8 l- n8 _
                    for (size_t jj = 0; jj < vec1.size(); jj++)5 p$ k) q4 D2 C# x) h- T
                    {) P+ v8 w! v1 h
                            b1[jj] = vec1[jj];
    9 f- Z  z5 _" P4 {& I# G+ n# ~                }- Q4 v  c& t( K+ ]
    1 |' v9 n0 L8 k1 l6 M# r
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ( r3 a, Z+ n; E1 q* Q! u                {
    ) D7 X, S& {: d3 J7 {' a                        b2[jj] = vec2[jj];  E+ I( M& t& n8 Q# _+ F
                    }/ e/ h! A7 s0 @8 |: D% I0 t+ }
    9 Q8 S4 m6 P- w1 D; T; {
                    //Method - 1  N=100000 247s  . r- Z( [" {$ q3 p4 N% |: P4 U* j
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& j* R, [+ l" Y" |8 l- Y& I
                                    
    " N  z# `7 c( g4 s3 S- ?6 V/ |, w7 P                //Method - 2  N=100000  237s# O' Y2 K2 N! V2 f2 ]
                    /*- j8 v7 _. b4 Z9 _) ?
                    for (int jj = 0; jj < N ; jj++)
    4 A( H, M% }: r8 t0 f/ U6 {7 s9 B5 E                {
    3 c: o7 ^$ R8 Y) J) J                        fresult += vec1[jj] * vec2[jj];# ]4 Z1 o. f6 f9 F( S% s2 f
                    }
    9 I# n/ ]  M5 `- Q! r                */* e, V0 O4 z9 t
                                    
    - H1 K) H: V3 M7 P9 G+ `                //Method - 3  N=100000 204s) x3 `+ D8 z. P  S  e/ o! k1 e
                    /*: a7 P9 G& ~7 w
                    for (int jj = 0; jj < N; jj++)9 g4 K5 P+ H! s& t3 D! f0 m2 ^' P$ ~& U
                    {
    , `4 D8 C: @4 ~- A0 d% n- L- I                        fresult += b1[jj] * b2[jj];
    ' m* Q  F/ c( j9 ]                }
    % E3 R, I0 ^, h3 C  [% i                */7 s* G: O4 O% C+ p

    6 v# G& A* i4 A                //Method - 4   202s
    % O4 ^* o) q0 @- b                /*6 o3 X4 w' b8 W5 f7 G0 i$ ]# U+ ?
                    for (int jj = 0; jj < N; jj++)
    & ?* H: D1 w5 u1 H0 S8 n8 }                {& C' y* Q" q+ n) S$ E, W
                            
    ; q; q0 ]: f7 M                }
    - R( Q6 W' w! L3 _                */
    ) f$ T+ L, a2 u5 o  S                //comment out all methods, N=100000  202s                " ^& t: l( f9 h: g
            }
    $ s3 [+ `, P" n0 g  d
    9 o+ W% _4 B( |& [# L        delete []b1;$ R! `0 z3 c2 W5 O, h% K
            delete []b2;
    * k1 R. Z+ R* N3 a9 H$ {
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    8 r9 V6 M/ _( a7 b
    7 V, W; m& a5 Z3 B3 x# X1 T! K你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?# k1 J/ d  K! M8 O5 L$ D5 B6 }) [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:158 |. r+ T0 \. Z+ |& Z6 T
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?; U3 b; e; k# ~

    ' s% o. k+ Y3 Y  I) _0 W% Z1 u你第二个试验里面的j在循环里面又重新定义 ...

    , X4 X8 E2 `" c3 k* m( p内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ' T+ @- _9 }, Z  {1 y
    * A+ q. ^: Q) |5 u不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ( J3 s3 u" M& D; j- r4 O$ m- u7 R8 k内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL9 e! \5 r! D8 P* ]

    8 {1 a; H) N/ h  {. c不和它 ...

    5 \% k! I0 r' O& |7 W* C) i7 ]) E, S$ j; P" {
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ! c6 G& O! K5 O* g后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    % z) V- N2 V3 X- }& D- o+ _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- |' @8 Q+ K" u0 ]/ X! l4 }
    {! x' X6 a! R& k
            comp temp, xtimesy;

    & M& o% P0 C; u4 p+ }/ W2 f( L8 t这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。# ^( L- k  [5 A- u8 B, A
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    8 @; Q( L3 ?1 {* O5 EVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-23 04:07 , Processed in 0.065496 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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