设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    4 y, g5 b% q; ~2 a+ _% R' ^; b  G" T7 H
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    / N- C' n  i! }  S3 o; N
    $ B9 Q( T* @2 q+ ~5 _9 Q速度优化问题真的很有意思啊。
    , t+ d) P! S/ S; b2 j2 G6 x& p3 Z- K6 c$ Z' J# |% h7 P
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    & [$ T7 V# G0 u6 X4 i: b1 O把代码贴上来看看?1 ^  ~: _( ]" Y" T) l" a% c
    : J$ d7 M. {7 h. I5 K; 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的每日心情
    奋斗
    5 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑   D2 x2 k. x8 c  B# I
    数值分析 发表于 2022-9-24 23:04
    - d1 E$ G) Y( P: @! q拉下来?拉多少?; R7 ~/ W& \! \" P
    把代码贴上来看看?

    * ^% Y' k5 w+ q: F. Z" S) N
    8 _) T9 q. @! E: Y: y/ ?3 U/ |void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) \1 c$ u: f+ U# A2 Z{+ N1 X/ {$ e7 f7 G
            comp temp, xtimesy;
    % H1 v0 q2 ~$ M2 p- i3 \$ L        xtimesy.re = 0;5 h$ c) g  p+ h- Y: F
            xtimesy.im = 0;
    - H0 Z4 \- }& U9 U  v  |- }7 R5 ^        int j0 = lenB - 1;) P- W0 G+ F% i. R8 W
            int    i, j, i1, reali;: ~5 ^/ r0 w) C  t
            if (lenA % 2 == 1)* e4 u$ {" _: e, C
                    reali = lenA + 1;
    0 @& M7 n5 h2 ?- ^        else
    7 A! V" g$ L/ d2 l                reali = lenA;
    / {, ]' E7 Y. |' N. ?        reali /= 2;7 m' p5 R9 q  g6 Y, t( C
    % |' G( u6 ?9 N8 Y  {
            int nconv = reali + lenB;
    1 e' x1 t3 K1 P. {        //#pragma omp parallel for
    1 W4 U/ _. Y8 t$ t# c        for (i = reali; i < nconv; i++); U3 ^' f, Y9 Z& [& [# c/ u5 V+ J
            {
    : f5 I$ D3 ]" F* [2 n2 v                temp.re = 0;
    0 v$ i) H# G. [. H8 {$ C) f                temp.im = 0;( M* I4 g, M" {9 g+ G
                    i1 = i;
    & ~/ w5 y' ^+ t7 K! k                for (j = j0; j >= 0; j--)
    : o- `7 K; M* T4 e                {) \: o" k, o& b. O- P- \# e& {& P
                            /* floating date operation */3 l$ S/ c8 F9 E
                    }

    ! o& k4 o$ y1 g        }
    ; f5 z" X6 D: A, e}4 B3 X: t9 R- _, K4 A7 ~& f

    2 V0 }6 Z. |9 Z- C/ w3 F' Y, o4 k$ lxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样* `8 |" p( ?) J) U3 p

      o7 p: C. }! J; [红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。$ X3 Y  h/ C& B( u8 K
    现在call xcorr 100次,耗时78s.# ~& M4 c" F5 n% z5 M7 p/ i# D

    & a- V9 e5 K/ W& N3 U4 l& O" s如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. & s+ X6 X1 U8 u( M
    8 u* B  O$ i: J( {4 F) j
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:333 w6 ^2 [4 s! O4 W1 I4 ]3 n& z7 O
    Maybe Debug mode?

    , ^' W1 h, F# ~( Z) t2 w8 @) @
    不应该,看我上面的回复。( Q1 X* R9 m: o. w6 V* M$ L
    " I. }1 A7 |8 {
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ; d8 j) P8 O2 [7 L" K
    雷达 发表于 2022-9-24 23:54
    5 B* J( |5 R& a: z( Kvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % U7 U% U/ i/ [) |! F4 k; m3 _3 y  i{
    5 F4 a4 K& r( N' X        comp temp, xtimesy;

    ( \' W5 V! n/ s( T9 J9 q$ e. g# ]# _7 ^
    这个不是这么比的吧。。。
    / I" S, t- W: p3 Y$ [' R- {" C
    0 O2 ^: l% l$ n# [0 X) V; S) D( a您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。* a+ I0 d! b/ {# F

    # f. s8 G  Z% P0 D5 F9 P而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    8 r+ L) {8 k6 O3 w7 r% Y# Z* l
    数值分析 发表于 2022-9-25 00:208 T9 R7 X9 [, Y) {4 U1 w5 j2 K
    这个不是这么比的吧。。。
    $ y! \; C1 y% L' B0 _4 Q3 J& _. m. I- m7 r3 @
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    2 Y4 r5 A/ T& R' J' I& u7 |0 Y
    0 V- D$ @" n2 ^& Y3 \( Y" N, I; W1 r
    有道理。
    . h& N8 e" c. K6 \% N4 \, L4 L  j8 N所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    / a% C: m- j; k8 W; D9 ~8 g( p6 h3 w8 f8 b$ v6 ]9 U
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ; E3 w) Z; ~/ F- y4 U$ @有道理。( e; O5 i6 l" T3 ^2 W  I3 s9 n
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    # ]4 b  r' u4 E% ?你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    " k; C5 o, b, O( `/ P. F5 MWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    3 u! S- u  }, e+ ~: }# K; `9 l这个不是这么比的吧。。。
    ; v3 O; f. R/ Q: s7 c) @! ~
    , I: C7 t) V4 H; |* j( ]3 O您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    " P: N0 q6 d2 _. }; q; `! z

    : Z3 H# r6 `3 W# {现在的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 编辑 + _) Z* Z4 @3 _) F& R, u* N& m
    沉宝 发表于 2022-9-25 01:48
    % ]. K/ T9 B+ v现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    - x$ c9 ?8 c. k% f' f: f+ {- j

    # t* ~5 W# i8 y是的,兄台说的对。
    7 a6 ?% E$ I6 H6 R* Z# t" K) I" N% b* v3 H2 _$ R
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。- i) J" A8 z% P1 l+ p

    8 _9 f- X1 H3 d8 J雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
      V" n. V) J9 `* m7 x* l
    0 W( F8 `2 l( l4 Z7 ]4 C" K比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ' J% [# s- Q1 \1 D
    1 C6 B3 R3 z" [. a4 s- k. @4 ~当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    7 j2 j% S( Y/ o
    沉宝 发表于 2022-9-25 01:27
    ; f2 e7 K  G& j& m8 w3 ^9 v6 p你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    . }( |. ~6 t* ^# f- ?5 @! Q( j
    - f, N4 B9 U" t9 U4 \又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。/ y, F: I  v' |( T# F5 U. B

    ) y% S- k  G8 j  n我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    8 t+ T. T& B! D7 o+ _& F, s& H, o又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    6 o- B: e. V& T3 x; U& E时间差一倍的结果可以接受。
    ; A9 ~" i. C% I0 m: F% P7 E" ]0 J1 A4 l3 ]7 D* p* K* G
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    : w8 K0 u8 O6 ]. f# D# Z
    雷达 发表于 2022-9-25 04:47/ n6 S, n! ^1 a+ P1 t0 N; X+ f$ V
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    1 u. S; u+ `; {6 u; M( a; Q7 ^% v
    & ~) G" P# [9 R6 ]. z1 a

    ! F# I0 y; L5 U6 z8 H2 {* s
    9 b" k& A! h: O* l  G1 s# P! w; _5 g+ m能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 / Q; ]% C$ L; k4 g1 X
    数值分析 发表于 2022-9-25 14:58
    ' ~& K' F% _. F! ~* B能不能把这个也贴上来,看看和上一个有什么不同?

    ! }/ v. o- \* T4 V3 J; q) r, {理了理思路,重新做了一个测试。
    # _/ Y. K' {3 g0 }3 W做了两个 vector 和 两个 float *, 都长 100000/ a0 K/ a' {( f+ Y8 R: j
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    0 E7 B+ ~+ g4 q( x# J7 M. h; h/ Q. d% t% S4 d. D
    内循环试了4种方法,
    / T6 w5 G: U" P9 d* o/ h. b1. 直接调用 vector inner_product 247s 2 s+ R3 a# k& w5 n! w
    2. vector 循环点乘累加 237s
    6 h+ w: Y- G$ {- y# e' v+ y4 T3. float * 循环点乘累加 204s
    ! K( J+ `% X8 P2 W4. 空循环 100000 次 202s
    & |! l: F  |4 h; F. W- T6 _; {0 ~! M3 j
    9 A4 R( D: }& d$ O6 i不做内循环 200s# U! k8 `/ w0 T

    0 t  P/ [* j7 m6 c  M" {你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 j4 X8 c* @9 U8 m3 e, M) P! v. k0 q+ V
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 t/ k1 T+ v! W) k- U" o
    - C* @3 c0 i1 `8 C6 \/ ]* Q8 q
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) M) a& U& Q; e) B

    & M: b7 j$ p* G6 k# q$ C- l(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)9 }: D0 Z0 f: J1 |6 S3 m

    * o; {+ r: w( f6 _" Q7 l# {* `% o
            std::vector < float > vec1(N);" L% o! @* [5 }4 B( o
            std::vector < float > vec2(N);. z6 F+ @/ A; m4 l' u3 J
            float* b1 = new float[N];1 \8 j! W, D' d
            float* b2 = new float[N];
    $ L$ K& o2 j+ \7 v) a
    % F5 H- h# Q' F+ R1 h        for (int j = 0; j < 6000; j++)
    ' o; T# F6 G) U3 M        {3 Y: _& a/ E' \0 b: C
                    std::generate(vec1.begin(), vec1.end(), []() {
    # P9 u/ t  ?6 H/ p5 b                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    6 }' [1 ~) _, s9 `2 G6 \# s                        });0 h! N+ b2 F9 V, o9 I
    9 f( z. j# u& O
                    std::generate(vec2.begin(), vec2.end(), []() {
    # P' d  a. [3 L& Z9 `8 Z                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;  s- s" e' h. m
                            });" c+ o% i1 ^+ ]6 [1 d% ?1 n
    ! X0 n5 [8 ?4 |; K* e
                    for (size_t jj = 0; jj < vec1.size(); jj++): o  E: U/ S2 R3 r6 E7 E
                    {
    $ e2 ^# l4 o' v& w  I: P                        b1[jj] = vec1[jj];
    / _3 g7 M$ V& m  J' t& O6 d, i& B                }' P6 [/ r3 C# F; {) ~: k2 P
    5 X3 d9 I5 S6 K% Z5 f
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    % B3 ]: K* j/ B5 s& O& a, Z/ U                {
    ; A1 i1 T: i3 O0 H8 |( \8 o6 ~: E$ o                        b2[jj] = vec2[jj];
    * R; G. a1 Z! F6 [# g. o                }. D/ b/ v& H+ ^8 A) W* ~

    ' B) m0 V. A: b. D+ e                //Method - 1  N=100000 247s  
    4 q8 H0 U. R* c) ?& `% r! I4 o8 B                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    : q5 K! e* S* S' Q) Q9 U                                
    + d/ q$ L2 c0 V" X+ ]                //Method - 2  N=100000  237s. G4 e! Q3 p  o+ Y8 w
                    /*
    ) J# |3 f' R+ l2 [+ n6 }% H# X! ]                for (int jj = 0; jj < N ; jj++)
    7 W: [% C  u, n! B. A                {& A/ ^* d! j. T
                            fresult += vec1[jj] * vec2[jj];4 P3 U& L0 ]. P
                    }% Y" V1 E& R! I. S4 L9 v3 [  B
                    */- d- `$ q( [- e
                                    % l, c6 q3 M6 m4 \
                    //Method - 3  N=100000 204s9 w" P4 B# k7 e
                    /*3 J2 l' `; q4 W" O" y) w6 s
                    for (int jj = 0; jj < N; jj++)8 |/ \* A5 {- S' b
                    {
    ! a! }1 m4 K) s9 M                        fresult += b1[jj] * b2[jj];
    * c) ]+ E# J# s* r9 b                }
    + {5 ]. l5 C  R+ G% m3 K1 @                */. c. |6 _9 y( _# l+ R6 k

    : m7 r! y( u9 ?1 F. B* I0 _                //Method - 4   202s
    ) x' f  E; R# s                /*
    - {: v& Q1 l) h% s( M                for (int jj = 0; jj < N; jj++)
    # X9 ]( w  D+ o, l- F2 E. Z7 q" F% {: |                {: I9 K: j* {, ^1 n4 V; v# d; v
                            
    ) c* u8 p; x  }3 D. b                }: [7 D1 ^/ }" a! N9 c" F8 Y4 [% S1 H
                    */! {% e' x$ J+ m- k1 Y1 T
                    //comment out all methods, N=100000  202s               
    : G4 ^% H+ s9 p        }
    7 s# O/ @  T! V5 i
    4 r( O5 D0 j) j        delete []b1;/ e4 G/ ?% E6 ^" N: ]
            delete []b2;
    ' b* v4 u5 f3 ~/ b4 W) N
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?* c5 v% T: L, C% g6 W
    ! _+ G3 R6 ]+ M  p) Y
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?9 w6 C1 u0 K9 N- s8 s1 B
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    0 B$ w$ D# [& f& R& f瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 n& w, n6 i1 h! o6 p
    6 @& z. s( I& m) w
    你第二个试验里面的j在循环里面又重新定义 ...
    # i5 W0 |4 I3 c4 h# _
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( {" |. I  U+ P2 G# t) x. \
    9 t; Q4 `5 d5 t4 o1 q0 k# h+ T
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:169 d* K4 S' n& O" W, z
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    * |( g/ H2 N7 G6 T' b2 W6 K! w8 R: Z- o2 \
    不和它 ...

    . `) Y, w$ j1 X5 Y) o6 t; o" i% P0 L5 ~' m: l  C
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    . `0 ]5 Z) [$ O( m后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54- x+ S  b+ l1 s2 B! w% M" _
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 d, _8 d& ^4 X) _0 m4 f
    {( ^! i* n2 C5 H, _" |. z2 N
            comp temp, xtimesy;

    " u9 }6 E0 f- V3 z7 @7 |这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    . \( t4 A: n5 R" z2 Y6 T内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    - z  j: W  `3 Z1 EVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-22 02:10 , Processed in 0.071910 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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