设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ! B9 c: C4 v- `( O
    0 R- e5 O; |3 m自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。( w/ K& o3 J- C) ?& M/ d7 F

    # V9 I+ o+ W) T# ~速度优化问题真的很有意思啊。
    ! o' c- w* b) Y/ N' {# a) [9 d4 Q& ^3 Q9 s0 U- ]
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ) I5 Y/ n/ j! X, l把代码贴上来看看?
    , e5 X$ R: X8 c7 u
    ) W& L! p3 P% L' c  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 编辑
    " g1 d" P8 H& y9 i1 v. S
    数值分析 发表于 2022-9-24 23:04
    2 G. i- y8 S" i' ^  _  Z8 E拉下来?拉多少?
    2 b3 s1 f5 k* V" r( X把代码贴上来看看?
    3 P, J/ b8 U& y  t8 @
      F+ l% P% N& g$ k- O  L2 O0 I
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 ~9 @5 X- Z  ]9 s( `( J
    {" C6 \- O: ^. m7 d7 X2 |; D3 s" Y" T( a
            comp temp, xtimesy;% O" V4 U) y8 L# R; o0 w
            xtimesy.re = 0;
    3 y+ k# ^* i0 ?) Y" _        xtimesy.im = 0;
    0 a: `  {# @5 ]1 P- G% i( [        int j0 = lenB - 1;
    8 _  E, e# z8 J# V        int    i, j, i1, reali;
    5 Q0 Q# m8 y$ |6 r" a        if (lenA % 2 == 1)1 O" V) ^. U7 h
                    reali = lenA + 1;
    . v" `8 H# }0 `$ O+ Z# w        else
    " R" W+ I$ K' u0 D                reali = lenA;1 V! U- i" w( @+ Z) Q) Z! E
            reali /= 2;' \5 x" u+ q6 A' E& B" i( F

    ' S: a4 _+ W) L1 {( P7 O        int nconv = reali + lenB;
    . v' l1 X4 j1 c! N        //#pragma omp parallel for6 {3 J; K& t8 _1 v. {5 Q$ `
            for (i = reali; i < nconv; i++)$ x: P; }# R4 u
            {+ O/ }8 q: h7 E! z( ?* l/ [
                    temp.re = 0;
    / ?8 k0 }; F: A3 W                temp.im = 0;
    # }5 R% ]  @5 I4 I$ Z                i1 = i;- J& h$ k" I: ?# y( h5 ]
                    for (j = j0; j >= 0; j--)0 [5 r+ \0 Q/ I; V, v1 ]
                    {
    ; u' H. q6 x$ Q2 u" @                        /* floating date operation */1 L3 A/ z$ ], |& V! q2 a' W& J) C
                    }
      D* d: W" x. O4 Y. q
            }
    7 l; q1 c5 z9 K7 A}
    % P1 I& v4 f5 [1 q' a4 u; X, k3 w4 [% r3 F' b* S9 I- p
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    . ]. n) V4 c  N$ I: G$ }' u% w9 H8 n5 Q/ i
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。: a9 s& [- W9 w: v* V2 z
    现在call xcorr 100次,耗时78s.
    0 X) G9 T& i; O8 U- ?0 s2 q5 b! X0 q* a; ]$ P) a) q, h+ H! q
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. / g8 \! b  {6 N, W' e
    1 l, [9 t8 B1 Q7 ^* s& G* y' \( @" k$ n$ L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:331 s8 p6 V2 r- [2 y' b
    Maybe Debug mode?

    7 }. J/ H5 R7 Z( {" M$ `
    " K/ I& n, F% K: c* D  w1 N不应该,看我上面的回复。
    - q( ~- W8 r$ x$ k4 S& K
    ; w3 o3 f* [7 Q. Y我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    * u- ^' \6 u4 o# \6 @& U0 t( Z
    雷达 发表于 2022-9-24 23:54
    # z9 ~* p2 O( ]6 {/ m) e1 ]void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % L( ]# [6 J; M, a6 L9 @; r{# Z8 Z5 a  C% V/ l
            comp temp, xtimesy;
    , i( ]& N% [9 d  ~# ~; E$ U$ t* @

    ! L. d# ^  Q' S8 k! t) j( i. V6 y这个不是这么比的吧。。。+ e" D$ t0 x7 l0 `( b
    , x% V& H  S6 ^9 a# H
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    2 ]8 |- C0 |0 W' ~4 e( t5 _6 J& c+ E7 i& n/ Y0 X
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 : D- P3 ^( v  C' e& W6 u0 U; u8 y7 V: M
    数值分析 发表于 2022-9-25 00:200 A+ Z8 Z- k$ t
    这个不是这么比的吧。。。' @! B5 I# X8 c1 `8 J) G) `
    ; O8 w* l5 Q4 t8 M; q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! l( t+ c9 z/ i/ D1 |& M
    3 W+ j3 R* Y4 j, v
    有道理。
    1 H8 Q2 |, P. F9 O6 G: O/ ^所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。2 p2 ]" r% B: I6 V* D1 K8 M

    ) E; E: _3 v) K6 ]# {6 g我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    * b5 i1 V0 n# t  G: O有道理。
    7 k& P8 k: H7 v, h所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    6 R/ x( [9 K, _  B; H5 X! L$ e
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    / R7 g% Z3 C0 V. D9 X9 G1 {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
    ) ^# y% T6 n: W这个不是这么比的吧。。。
    6 k0 T- c9 O) m, A9 j& k6 f! c. P: B+ \3 {" e
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    7 h" w: R* ]% O' n6 C% i; f
    8 C- X  J1 k9 s- E, p2 h现在的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 编辑   D2 a! B. r/ r# P- E: x! d/ `# I
    沉宝 发表于 2022-9-25 01:48
    ; f$ t- Z; E3 K$ b, x% |现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ! F7 y0 M2 ^& L0 l+ L& x* J7 a% z( m! M1 G$ J# |
    是的,兄台说的对。. K& l. A3 {7 h2 w; `

    6 N% e2 `* g" c$ q其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。, Q7 s. M4 S. `8 ~* N

    4 ]4 B! j8 E+ e7 N; @) `雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。- ]% B" T7 e4 O, \% F; K* n

    # f* m; o- ^+ W8 r* H8 k  U比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。% x) J$ b5 }/ s/ t( k

    . t4 g; K$ w. k& Z+ ~当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ; D" ]" g! |1 x3 t8 n6 e) P/ a
    沉宝 发表于 2022-9-25 01:27
    ' p1 {3 @4 v! D& Y7 \4 b你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    4 q& k0 g0 g& a6 f+ s4 R' S7 r7 Y
    $ d( `) y  ^. t, e! C又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。" g9 `4 V+ J7 ~. y% c5 \
    8 w4 N( _. e$ t% j
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    4 f! a, |# v* j  i5 D( M又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( @8 h& k& M! W; q) t5 F) [; H( C
    时间差一倍的结果可以接受。3 w9 {2 ^! L+ V% n7 E5 i
    ) X7 q4 D7 p, t) d! T) j
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    , Y% P: u  |% @  _2 l8 M
    雷达 发表于 2022-9-25 04:47) q; p' T6 n' W5 X1 L& ?5 h  _% T
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 j' J5 ~+ _$ p$ v' l$ r

    7 i3 ?3 v5 ]! U* G/ F; b+ ~# n3 t+ `  ~& f8 [+ [1 ^0 L

    / Q1 P0 ^) }. c$ x, r能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    2 k& V- o0 M& [8 _
    数值分析 发表于 2022-9-25 14:58. G- x) _! K" o, b% a( @8 x, Q
    能不能把这个也贴上来,看看和上一个有什么不同?

    ! G. g4 Z7 q  t( A理了理思路,重新做了一个测试。6 |9 j1 g8 P! O2 Y5 \& v3 I7 Y
    做了两个 vector 和 两个 float *, 都长 100000
    ( z+ A2 @8 E- ^- O+ B0 [' {: E外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' ?* x$ }" b+ I
    , z1 P- H; {4 t) g0 r* ~
    内循环试了4种方法,# q; P# R& E: p/ C5 `! T1 z
    1. 直接调用 vector inner_product 247s
    - v" Q; g( A8 g5 L% A' o# e+ J2. vector 循环点乘累加 237s, Z0 a9 r6 y/ }7 s4 p8 p+ c2 s
    3. float * 循环点乘累加 204s
    , O& b3 I" H3 S( x& i$ |5 k4. 空循环 100000 次 202s! P  t/ Y( ?5 L# `6 D

    $ `1 ?2 L- T6 z; b" [不做内循环 200s- y( O0 G) |3 `$ r4 ^# [) D/ y6 p5 N

    / ?8 a$ ]7 V' e8 o" s你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ( e2 v0 a3 \" v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    5 ]- r8 ]  V4 r- m8 w! {2 ^# h  z: e# {6 p
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) t+ I, v# D+ W; v' n. d) b

    & G9 U8 ]7 @  ?  h1 ?(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)& P7 W5 G- C6 p0 a9 Y

    ) ~& Y) x) Z* x* [9 T) g
            std::vector < float > vec1(N);
    9 M1 E# Z2 S& I7 s8 r        std::vector < float > vec2(N);1 R; n0 z( U* D
            float* b1 = new float[N];
    4 X* c9 b6 D2 m; I: T3 d        float* b2 = new float[N];
    9 f" T/ s  g# }6 A+ r; ~
    . z/ d3 B6 j) W' f5 a        for (int j = 0; j < 6000; j++)& n- R1 u) Q( D  w) r, u- a  u
            {
    ' v: r% J" }% N9 b/ w- P9 e) t                std::generate(vec1.begin(), vec1.end(), []() {8 i1 _$ v2 P3 e8 z0 p, H
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! R$ C- }- x: _* w
                            });3 x' H6 V' B1 ~& ?( Y; t! f' X

    # c8 |, r' m0 j; |& ^                std::generate(vec2.begin(), vec2.end(), []() {
    2 a! T4 J4 w- d) {                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 }$ z4 J1 W7 ]1 b& a2 `  @  E
                            });
    " M' x: D* e7 D5 t* b8 N# H5 S& p
    " `4 N3 B( Z, \2 y0 o, w5 s( @                for (size_t jj = 0; jj < vec1.size(); jj++)
    0 n( W. Q; w3 T8 R4 s                {
    & Q, {& \8 Y0 F) d0 p: c! s                        b1[jj] = vec1[jj];& s% v/ G. b, A
                    }
    & p; h; Z8 Z& |' K5 f0 p; U/ k4 }2 D' [' E# F' J
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    * l2 A  p$ D+ p0 |' z& K                {
    / |8 C0 n2 h, i. r* D9 I' g6 Z                        b2[jj] = vec2[jj];6 Z/ o9 F/ j# ]3 j4 C
                    }& K  D" a( L2 h- f3 u

    / B! X0 ?; a4 P, r' [                //Method - 1  N=100000 247s  ) W' `, p5 T; _. D% J
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* N4 M3 W# @  j: j# H
                                    2 N# }# J+ b0 P
                    //Method - 2  N=100000  237s6 t& s3 I) f! @% X3 l9 l5 c
                    /*9 B" n/ m% F3 c* ?, ]7 Y+ m" Y
                    for (int jj = 0; jj < N ; jj++)
    , i- y2 p/ I, f+ Q5 @/ h+ u  ]                {5 u$ A% x6 w$ M9 i$ r
                            fresult += vec1[jj] * vec2[jj];
    # C: b/ u, d- y! }2 D                }+ c6 g' Z3 ~! _0 e8 c5 g7 H
                    */
    $ x1 y/ G/ n; ?4 u2 \, B0 g                                / g7 y2 x3 [7 ^! |
                    //Method - 3  N=100000 204s$ I! e# G$ G# ?; U9 D7 X9 R. j
                    /*, H4 Y- z: T, I+ d) `& Z
                    for (int jj = 0; jj < N; jj++)
    4 _. |. a  K' Q1 n/ N; Y5 s1 \                {) g1 B) Q+ f* a  x3 w8 D, p
                            fresult += b1[jj] * b2[jj];4 H  q/ E, W$ q5 d
                    }: |; N$ m4 {8 u2 t. G! e
                    */
    2 l' T6 W  R5 r5 c: J8 ?
      W% h% I( ^! w: Z, n# R, Q& z/ |                //Method - 4   202s+ Z' J7 N6 G7 x9 p  P; Y
                    /*
    4 ]6 y( ]) l8 ?- _% Z8 _                for (int jj = 0; jj < N; jj++)1 D" T' ?9 Q& S
                    {1 ?6 d* y" |2 P- M
                            ' n7 a& I' v7 Y$ H3 _+ K, O
                    }
    ! F) U! _) ?$ k! \* X0 Z% t                */
    2 G3 }" d7 O/ G9 B1 u! _                //comment out all methods, N=100000  202s                / U/ A$ y) `) E9 ?
            }0 X' Q" ]8 c" k) M# L- S

    9 d8 h( x2 V7 c        delete []b1;' g& `! T/ [/ P2 E% l3 l
            delete []b2;
    8 c6 A) x) e1 @) L, V
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?$ G* }$ f( O! S( m6 I8 u8 y

    + N8 c4 g; ?& M! y1 z' V: T! r* y你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    % i& n# c: ?! i9 i. Q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15% m9 ?9 N# {; |$ t: d
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ; f1 h6 m# P* v- V' B9 D: S, _( F& j9 N4 V
    你第二个试验里面的j在循环里面又重新定义 ...
    8 [+ Q$ k* y. L  w
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL4 x2 h. j0 h* G8 {0 n; l

    & ~% D* J/ F1 V# C不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # S& s& e# |2 l内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
      U( G" l# m9 w( ]& _# N/ E6 B& f  P1 a( L9 i
    不和它 ...
    " v' T& _8 ?. ~6 ?& F- {) ^
    : I. K: N" a6 |; S) q
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    # H5 `: P% X/ s  D3 v4 C: o后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54$ F/ `$ g% F3 Y$ U* A
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) p: B3 t" F5 L; x
    {  x+ h* w) s8 C$ e4 k5 h
            comp temp, xtimesy;
    ; y4 V4 [1 r) }0 R
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。5 k9 n) J! A0 Y
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    $ A* g7 l% H% Z3 ]; t5 Z' G( wVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-6 13:18 , Processed in 0.081544 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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