设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    & @+ c5 s3 `* d$ t# {  X+ e
    2 [' O! D- ?+ }3 W7 ], H+ s自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    6 ~' S# U* d! F2 a+ N/ ?
    0 U" D- V$ ^; X1 x速度优化问题真的很有意思啊。
    ' c1 M* h7 w% q. r  ?( o# j
    4 ]4 J; i, H  p5 `7 P) u欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    21 小时前
  • 签到天数: 1894 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ! v: G$ t8 M; f2 V. x9 }" |把代码贴上来看看?/ |6 H# H% Q, \" T; k- A$ x

    9 K/ r0 }" x' e9 U( P. n" D' o难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    前天 22:36
  • 签到天数: 121 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 % j( j  @  q) @! I* M
    数值分析 发表于 2022-9-24 23:04
    / b, u. X5 u3 X' w拉下来?拉多少?' l; A  }+ H/ p: T3 M& [% V
    把代码贴上来看看?
    7 s9 A: }/ C$ ]1 L
    3 i, d2 q7 l8 u0 q0 F
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)! C( i" M. J8 e' I# ]4 X
    {
    % ?3 [: n! m, T8 J. J# ~        comp temp, xtimesy;5 U" s! H, v+ O% p
            xtimesy.re = 0;
    + W3 g" j# ~" ~, o% R0 a8 _        xtimesy.im = 0;
    : U/ b- N' o! v) k# ~* l! ^% E        int j0 = lenB - 1;
    ) W. F# d% q7 Z& c+ m) b4 q        int    i, j, i1, reali;
    . w: M8 n) X" _        if (lenA % 2 == 1)
    5 ]- Y+ r4 }5 b; A/ M                reali = lenA + 1;6 \& j& c2 r8 q( i+ x# b" l
            else
    ; {: K& p) D# m/ [1 t$ ^                reali = lenA;
    + Q3 b. O1 A( ~2 L) |8 ]3 j        reali /= 2;
    4 v2 Q2 y! @; o0 d+ F
    1 E, H& U# D0 E2 p        int nconv = reali + lenB;
    - B- C% g, P0 D1 v, c* i% s8 p        //#pragma omp parallel for2 J8 \5 R6 U" c, f  g7 s6 M
            for (i = reali; i < nconv; i++)
    7 P/ E% q+ D. o        {
    9 J2 Q( t6 P, @; c4 b1 t                temp.re = 0;5 j5 l  @! G* P
                    temp.im = 0;$ ~" p! ^# @" x/ L% f
                    i1 = i;% q2 w4 K8 k0 |& l
                    for (j = j0; j >= 0; j--)
    ( [9 i8 ~% g$ E% S' m* H                {
    : b+ N. j' A7 G$ e# l, A0 n6 R                        /* floating date operation */
    / v9 \2 O  v7 F5 Y5 U                }
    0 W1 p- Z& c6 F5 p0 \3 U
            }
    . y& }& J/ U: Q! R& F/ @0 k+ m& U}3 X% P$ p3 m6 @* Q2 ]8 ~7 V

    8 ]& |6 M6 g* w( j3 B% Axcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ' ]/ p, m3 o  B$ c; s% h4 R4 [' [/ Z: x7 z
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。2 l6 V' O- l: _" k9 n9 p0 b- S' N8 n
    现在call xcorr 100次,耗时78s.
    ' {- f" H+ g4 J" L1 Z' o
    - S2 @" ]4 B- I' G如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.   t, K8 ?$ _& b- D: u1 E: }# ^

    , O( M7 }: B  V, X4 g6 T0 |+ Q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33( B: Y7 w* a0 T5 u: v: [9 a" |
    Maybe Debug mode?

    0 M! N, U7 q  O2 K: R8 y& J2 Y+ U0 k9 \# u; n0 g1 p
    不应该,看我上面的回复。2 x  }- K! q1 J' K  U/ d8 F
    7 m1 d! n. ^. c9 }0 J5 z# ?  H
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    21 小时前
  • 签到天数: 1894 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 & X' Q6 J, q# t. m
    雷达 发表于 2022-9-24 23:54  V* O( y+ b6 _$ Z$ N
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 f5 @$ o) Z) |, ~: \{
    / @: _; p/ y" F! O' O3 q2 P) k7 ]        comp temp, xtimesy;

    5 k( @! `2 e) H/ a
    . k0 P7 E% _+ k! V9 Z这个不是这么比的吧。。。3 ]! l2 D% l* N

    . w4 c' N' u2 m  F4 n8 n您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。2 S1 l7 T6 i4 |/ Q! }1 n9 D; `) R

    1 f3 V* w. M' U6 A* h而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    7 C% J- Q# \. f; h+ i& Q2 d
    数值分析 发表于 2022-9-25 00:20
    ' E6 E* C% e) R' U9 K5 j% N这个不是这么比的吧。。。
    6 }7 o7 b6 N; K3 Q
    $ s. }% |2 g' P. t5 R您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    , x4 m+ Y4 `4 @% [' l. E  j8 T' y5 e1 N
    有道理。. O* A7 z% x4 [. X( i
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。0 T: r' q8 w& o5 k
    % Z- n/ p, q, Q  n
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46, u+ s2 O# {3 x  o$ k+ n
    有道理。6 x+ O- o1 H* d1 }$ @
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    # M3 Y* r7 n9 R  W$ I/ G
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ) y  {$ E! b" {/ d6 W' H$ ?  s/ \7 rWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:201 y8 W9 V4 x) Q* \4 R
    这个不是这么比的吧。。。
    # k! q  {0 M' i( n% d% V$ h. S# ~# p$ ~. ?: G
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    % e" v9 |) x* i2 J, V. w) P" u
    % m! K' F# r2 Q
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    21 小时前
  • 签到天数: 1894 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 $ u9 \# G/ {( O4 |7 W  ]4 y( I
    沉宝 发表于 2022-9-25 01:48: M# w( t- ?2 A2 }) s
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    $ {% j$ B$ l, k3 H+ y3 k
    / B2 X% B5 l/ C: S; M4 y4 }
    是的,兄台说的对。/ b& q, `+ C! f: D4 M
    ) t' E; V; D" F. j( V9 b
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。" H# N, D, o7 j, ^7 q7 J& ]5 \
    : x5 T' X- M7 i) C% O6 E; N
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。, o! ?% l4 ?% {- \/ C
    ; o& p0 D* H$ u" h1 p+ |' i& F
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    # ~3 [7 D7 q4 H" x" E7 p* Y7 q7 j! Q7 _6 y
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    + `9 E3 C2 d" L: B( O! ?
    沉宝 发表于 2022-9-25 01:27
    3 j' Y( H: J0 |  A$ G( @5 U$ u你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    . F1 |- \( j# J4 V/ _/ v: f. d8 U/ d! k% `$ V. J* i- _8 _
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。( a8 F0 _5 }/ b2 |) q4 r, a

    , B, N4 z! S5 n' T: C我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    , ~9 O1 o2 V- l: d; V& ]" |( T又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    : B$ S, \) y& G. B时间差一倍的结果可以接受。7 l3 e. b. {- [1 H: h# l

    ) K1 N8 [5 U2 v  f你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    21 小时前
  • 签到天数: 1894 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ; c+ B1 L' }" {( W$ d1 |* r, n' t
    雷达 发表于 2022-9-25 04:47
    4 ^/ l1 K9 k# O/ b5 c又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % w( c' @$ _5 [+ a. C, {3 ^- G* q& S" z+ b

    7 e; g# Q& h; [3 [: |" f* q- p' J. Z/ O
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 _4 _* c1 O& c
    数值分析 发表于 2022-9-25 14:58
    / j% O+ V2 ?% }% q; v能不能把这个也贴上来,看看和上一个有什么不同?

    $ i1 z0 w4 @, |理了理思路,重新做了一个测试。" @& q: R, ?" X
    做了两个 vector 和 两个 float *, 都长 100000
    3 g$ r4 G3 z8 x8 D+ E7 A外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ( x1 z+ \/ D8 Q8 L- t9 Y0 s3 p
    : A. l: v# K, T! @内循环试了4种方法,. h& L& D, d- d7 X% c& e) g6 ?
    1. 直接调用 vector inner_product 247s
    * h  R# t: N& J2. vector 循环点乘累加 237s
    & ]! ?, C% N/ H6 y3. float * 循环点乘累加 204s, O" O! \  N2 Q% x% q
    4. 空循环 100000 次 202s3 t4 J6 O1 ]4 v1 m- B5 l5 F! @

    3 {/ u) n% s; w6 I; Z6 S不做内循环 200s
    0 F  T9 ~5 _1 h7 g; S
    6 T4 g% s/ ~+ x3 ?" |你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    8 [+ s0 X9 }! C0 w另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    4 [0 x1 y5 w7 o* a, N3 y
    - ?  H4 z" ^  n9 O/ S+ t5 b4 C3 |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 g/ w( W+ N# A6 c( A0 k& W
    ) f$ Y8 s. U4 u2 L+ C7 }
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL): k4 i/ e: A$ z: p
    7 _$ E9 d! i. b6 W
            std::vector < float > vec1(N);
    8 H& f* {6 y( g9 H" Z" f' l        std::vector < float > vec2(N);
    & U0 @' S& h, q- E3 `& l        float* b1 = new float[N];: B; y0 D4 ^- e+ F
            float* b2 = new float[N];  u+ f8 n  V9 P* T8 n% S$ x

    # `) c- M; {* M) Q8 x) {. Z        for (int j = 0; j < 6000; j++)
    6 R2 W' I- m5 |/ x        {
    2 l  [, _, i5 g) a: J- W                std::generate(vec1.begin(), vec1.end(), []() {
    ' [# i* R1 B1 v" g/ V1 c                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    + w" g8 j# q. Y2 b$ F2 p$ D                        });, d, L$ X) y* n$ q1 J/ _
    % O5 x& U7 S- I' D: L
                    std::generate(vec2.begin(), vec2.end(), []() {
    , Z) [% ?6 _% o  b0 \                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;% ?) T2 {5 U/ f
                            });
    : y, H3 l9 \& g2 p. ^' T/ `9 _# z+ I  B+ V) [! j/ l0 ]
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ) z! }& @8 o9 n- e8 M# q4 w                {; A/ t7 \$ O( ~* `
                            b1[jj] = vec1[jj];
    2 D! V8 X3 p, a                }
    9 p1 ?; Z; ^* F) |# U" I7 m4 W$ G9 K! i) l: W- q9 z0 _9 ]' x
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ; v$ d/ d' [6 c& {/ L/ X                {6 w. i( m8 m' _9 W+ S  m
                            b2[jj] = vec2[jj];
    6 c7 e+ |3 F4 ]9 \. F4 i$ k                }' x3 I$ I5 G( p) E/ B" y
    ! R4 @' a8 G( {1 O' G7 T8 ~9 Z
                    //Method - 1  N=100000 247s  5 J9 ~$ ~0 m. V: ~: V$ \+ K
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 u8 ^5 q: r* }4 V9 G4 G
                                    - j: `3 K- M/ x7 z
                    //Method - 2  N=100000  237s
    7 u) j: C) k( S5 B' z; p! s. w                /*
    . f( w0 k! F4 U* J8 n7 M" Q                for (int jj = 0; jj < N ; jj++)
    ' C+ @2 j$ N, X5 B! Q2 A# V3 ?                {+ r. G* f9 w' o5 n! o/ A7 Q! [
                            fresult += vec1[jj] * vec2[jj];
      v: C) x% e9 K2 u) a7 c7 b                }; v( b; V) ~" |+ _' R  X
                    */
    & A; A+ V$ F% g* E9 f5 i( s                                1 N1 @, ]7 \: }  v
                    //Method - 3  N=100000 204s6 B8 T! ~7 v) ~* c# x9 S
                    /*2 @# Z' m! r5 z& c
                    for (int jj = 0; jj < N; jj++)
    + x" R7 t" S4 I* ]$ _$ [0 O                {- h" A2 ^. M. l% C
                            fresult += b1[jj] * b2[jj];
    ) T. i/ Z/ W8 O" d- y& E! V                }7 x: Q; P/ R; Q
                    */: n6 H8 i9 u$ ^

    1 Y: t! E. j; p. U. g                //Method - 4   202s
    ! T% F5 p# U, D0 O+ A                /*9 N. |! @7 X9 e$ m/ j
                    for (int jj = 0; jj < N; jj++)
    - n5 x3 C* [" T9 h$ r# j                {
    0 q3 Z; W/ w! _% d* _                        1 M+ H! s& O& s5 L
                    }" F4 ^2 H2 z& O  @
                    */
    2 x$ }* M8 Z, [                //comment out all methods, N=100000  202s                1 P, ?9 b7 D5 y& |0 m2 `6 ~
            }
    % Z) c2 n& B& M- O4 z7 B+ h& d' H
    0 w9 R2 z/ t1 p+ c        delete []b1;
    6 o4 w( k6 P. o) `" L) R, F" r        delete []b2;
    7 L$ Y0 |+ P& e  H, D4 p  Q
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?4 V6 V3 n& V9 ~5 M" A

    . [# ?6 `% s4 i$ J! U你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?+ `8 B, A4 X+ G0 ]* w/ U+ ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    0 {0 {" a# J( W4 D( c) G: [瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 x- B3 |  z2 r& }! d3 |; d1 @0 ~/ P
    4 R9 @" [4 r2 f5 z' [$ S8 c0 Q
    你第二个试验里面的j在循环里面又重新定义 ...
    ! {6 J, S3 J: w6 N& m% y6 E. [% w
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL# g$ |7 W# c  s. t0 D

    : ]; o8 ~9 v8 G. e. W. z$ l不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:166 h( b" M' ]4 ~" ]+ E; v6 R
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL4 j, ~" ~7 ?8 d- `3 T

    7 k  B1 @2 S( K; p不和它 ...

    ) I2 [2 a7 X* h' q8 T. m3 B9 R6 W3 Q, a" H" o) D
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
      y& G, E9 N( ]+ \后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ! i9 R& s2 i( q  O9 J- m" Rvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 v6 v- I5 P& ]# s; n% j" ^{
    8 C+ @# ~' ]8 w( I0 \        comp temp, xtimesy;

    0 n' ]$ {8 e0 L1 s% D% g; z) l这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。) h, y, d* r) f
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
      a$ ~  a8 J, f1 T. J  dVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-5-24 21:55 , Processed in 0.043946 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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