设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    * A5 r+ n4 [0 R" i" l6 h9 T1 _
    * p- a: d( W% ~3 e自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。3 Y1 ?, Q& m; T# v! W

    $ I' p/ j, D0 n' J2 C速度优化问题真的很有意思啊。
    9 Q! h9 }- ^$ }, X* q! ^; z* U% l
    6 O/ ~/ Y. \! m5 B  G. @欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    4 t- c1 @$ o! I把代码贴上来看看?
    8 f7 h* b3 ?( r# t* I. m1 h; I* J
    : Z( r4 v2 K8 V, @" g难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 + K- P- ?. C, I- q0 ]; K  H6 |" S
    数值分析 发表于 2022-9-24 23:04( a) h$ z$ z4 `7 z+ \8 E
    拉下来?拉多少?: ~- k5 Z, m; w# u; A; Z
    把代码贴上来看看?

    . [( K7 c, I" r% W; h1 C+ k/ T0 B; ~9 p
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( ?+ J5 Z4 L) R( w. g; P
    {# g! k" r- \. _6 L. \' M; h
            comp temp, xtimesy;2 J/ J1 a% ]7 V% ?& O
            xtimesy.re = 0;& D: J0 e: u; F. t0 s
            xtimesy.im = 0;
    0 c+ C: g, y( c- \7 D! m        int j0 = lenB - 1;% |* G! ?3 u5 e) w
            int    i, j, i1, reali;/ E, p9 L, g' L9 }
            if (lenA % 2 == 1)' |! b9 [( Q; J4 r0 a, z
                    reali = lenA + 1;4 q; F$ s8 K9 A: @* g' x
            else0 X' ]. o) x! {  X& Q) V$ h/ ~
                    reali = lenA;) n) ^! g3 c. S6 N9 F3 I
            reali /= 2;
    7 j+ F* M. b2 u( [' T" v; U% ?- }/ D) v1 w
            int nconv = reali + lenB;" X/ [4 p0 G1 b4 L- f. g1 L! n
            //#pragma omp parallel for
    ( \5 X+ B6 @9 i' ]- u: O2 u        for (i = reali; i < nconv; i++)$ _% ~: J- X4 Q; S1 l
            {) G2 ^8 M5 t; w: w' ^1 ^& m& }7 P
                    temp.re = 0;* G6 f9 ]7 [+ S# V
                    temp.im = 0;2 F5 m; ?$ k; S6 N
                    i1 = i;
    ) P9 [7 l$ X+ N& m( n3 Z1 ]                for (j = j0; j >= 0; j--)) A! [( s# _, i& h( x2 t- j/ p
                    {
    , y# x, h6 H; l3 x6 S- I$ G                        /* floating date operation */! `6 q% q. Y3 Q: z+ Q
                    }

    : T6 J* e( X  ^, Q( N9 f        }. Q* A: V2 H% b
    }
    : j% v  a+ {) F1 @4 |3 C  |( ^3 T) ]
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样5 N0 t* ~+ b' A' x! v3 ]$ }: a

    ) F; O# s4 L, `" D6 ]( Z5 B红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。  E) u. ?* p+ I* f/ t7 q
    现在call xcorr 100次,耗时78s.' M# T2 a7 ?* x5 g  p- Y7 h0 ]) E; h
    7 t* N( Q) P: x1 d
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. . F+ ]4 V, s" B" p: Y

    ! A5 z' v; n7 e' |4 [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    , \5 j' {& R; d9 y6 {Maybe Debug mode?

    3 s) @: i/ c1 v! l- k6 x( R# ], N! \+ h7 Y2 i. B
    不应该,看我上面的回复。% q' G( q" G5 F; j2 u5 ~

    : L* @+ g& Q) w3 U* {. y& E我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    . K0 \$ Y* m6 Q% n. R
    雷达 发表于 2022-9-24 23:54
    " i! s. J3 p% Cvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    7 b' L% x6 {; ~; K3 C% }{
    4 y% l0 c* c6 B* t        comp temp, xtimesy;

    : t/ B7 B% A1 r* d2 F, c1 @' u% h$ A9 m4 ?4 r1 C. o
    这个不是这么比的吧。。。: r1 B& z" y" u$ Q- r4 N

    ) L* Z: u0 ?( m- O您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。3 E, O5 {7 m( L5 G7 V- H
    ; x0 O8 R2 u+ D  ~
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 9 c9 Y& m3 H' [, S) K/ \' b
    数值分析 发表于 2022-9-25 00:20
    ( c" `, ^8 d  T7 O9 K7 F0 r8 B2 T这个不是这么比的吧。。。
    . p% u) }8 y- J* J1 p1 u' S
    * y. u. t  ]* _- C+ k% d您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 N8 F9 U* u) X' {
    . k# m( v& o5 X% Y: m+ U
    有道理。
    , D: E5 I1 d# r* l, y& [5 I所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。7 m7 V# a" N3 C- |- u

    ( C  X: F- `) Z# C+ d. u我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46/ c. [0 g* r3 o4 `2 s
    有道理。; @, M- e. \0 l# x  U, t( g; B: J
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    6 T7 M+ H* d; `* ?- m
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ) f! V. \8 \1 M: E6 q2 O  ~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
    - ]+ e$ _: R( _  |这个不是这么比的吧。。。& L. j9 r' O4 ^5 K5 N9 }5 F+ o: L

    $ S* Q- c  {6 X! ]3 V7 f' Y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    9 o+ c7 o( L3 f6 F7 e) H% _

    & [( _, _' {) g' L/ `现在的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 编辑 ; L% g$ A3 i; y7 e9 o! E
    沉宝 发表于 2022-9-25 01:48* W% M2 J- ]% U( r1 n! ]( g
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    " j, Q. A* b( b& g& n, O
    5 B' o$ F9 O  P4 Y是的,兄台说的对。
    ! G: @: }. ]7 |3 |' C& }$ ], k2 ]9 T
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    & ?6 X9 {' K6 n, i, O( |$ N. q* K& i/ V. l8 t# d
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    2 W) ?% N) N0 k! L. D0 ~9 t& U
    8 }- A* p2 }" Y6 }# h: m( Q比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。% N. y1 a# _9 _6 \( r

      l' r( H' y5 ?) X* B3 S! W当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    9 ?. y: T  P: `/ t4 R4 E  i) T
    沉宝 发表于 2022-9-25 01:27* [) A; d. N* Y% n" S$ b% m$ C: V
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ! u: ~5 z, n+ |9 E7 m/ L" S
    - K8 q; X2 V0 c4 V; f4 I8 Q- ~/ x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。/ x# J% |: S& f0 M
    7 b& D3 x$ e! v
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    " X1 R7 S; A7 i- W" t又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    . h! s# l/ N* h% l& i7 b+ q时间差一倍的结果可以接受。( T, m- l! v+ ]6 i( A
    9 u! ?: a' Z. ?8 m# B# u
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 " j- \/ ]4 {# X& i
    雷达 发表于 2022-9-25 04:477 G9 f. E# l+ q/ M1 H7 Y1 J
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ! G9 g" y, Y' ?2 B
    ' S% U% @$ R$ ^/ A3 D$ m

    * {- w8 Z5 T/ }0 j% ~7 c- v* ?* o0 F& y5 M$ b7 o
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 + A, I' D- |( k! Y) y
    数值分析 发表于 2022-9-25 14:58
    2 P5 f+ M3 H- j) D0 w能不能把这个也贴上来,看看和上一个有什么不同?
    - G* t, ]; t: p. Y
    理了理思路,重新做了一个测试。6 A& C$ `' v2 E0 ^* m$ F# g
    做了两个 vector 和 两个 float *, 都长 100000: p9 @3 F$ M% T; R; v# b
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.) x! a$ y3 L: M9 V+ D  {8 n
    7 u8 q5 O% K9 j
    内循环试了4种方法,
    ; Z7 K/ t5 Y" o" i$ P0 [1. 直接调用 vector inner_product 247s
    1 T! I) y5 W1 E# d7 y/ @2. vector 循环点乘累加 237s
    - D( `# l1 U  x9 S: }# Y3. float * 循环点乘累加 204s
    . Q# w3 o- {$ i( L  o  q4. 空循环 100000 次 202s
    " Z5 u' e7 M  ^3 V- |3 X
    : I( v: E" }5 R不做内循环 200s
    7 M$ f& x* n% l* G6 q5 [! c! r- M+ Z6 [: f% D) x/ Q/ i
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    $ R, n6 i+ k" W- c% T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! U# q( P- @- ^! g

    % J: P: l" W) T$ Z! W至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 t8 O2 i7 t0 g# n7 `5 K

    " R& E2 }  v$ X) J(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    5 q, Q1 c% t' Z- U7 {# |6 t: G9 [+ Z1 K2 u9 [. E3 n% @
            std::vector < float > vec1(N);
    + B3 r. \$ p& n7 n4 u4 l& d        std::vector < float > vec2(N);
    6 Q2 j1 F/ z: Z8 M& T7 V6 v. C        float* b1 = new float[N];
    $ W5 j! L. d5 P) Y+ r( x! @& F8 t        float* b2 = new float[N];. R& @& ?5 }3 X% a1 L" j+ X

    2 M$ i& F) J  J( @8 W9 D8 A7 Y# V        for (int j = 0; j < 6000; j++)
    ) y9 a1 f: o8 ?        {8 |$ f( ^. r+ k# Q
                    std::generate(vec1.begin(), vec1.end(), []() {
    ) D# \; |* Z, X' M+ T" Y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% q" H( k4 l- h+ ~; o( L) G
                            });) T4 a: @0 i/ ?# m2 o" W& x# @

    % R0 L# M8 V% o. t5 W                std::generate(vec2.begin(), vec2.end(), []() {
    ( w# U" n1 s) h8 g2 O' A# f2 r                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 a; x7 Q& h! h2 y2 _
                            });- n! A  y7 B4 Z  |1 ?
    3 h" s/ g, G; c( d
                    for (size_t jj = 0; jj < vec1.size(); jj++)* |8 L7 ]3 `8 l+ w- V7 z% k% L
                    {
    ( L5 s' t6 x2 n8 u% M& }. P; ]                        b1[jj] = vec1[jj];
    ' W; [4 {# q# W* N, `" Y5 N                }
    ' P( I* |, E3 D, Z0 b9 h" w7 [  z7 n2 u8 t2 X. g: a
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    % L8 _/ {+ c6 H                {
    ( l6 _* D% N) o% _2 }5 ?2 _                        b2[jj] = vec2[jj];
    - t5 z  u% \( [                }
    $ J- q! ~! G9 j+ g8 K1 n) h7 Z2 y. v0 I( t
                    //Method - 1  N=100000 247s  ) x+ A; _3 }7 M: A
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    2 l: B0 |5 t, b                                # d5 v$ j8 i' M* b0 R9 y( M8 o( e
                    //Method - 2  N=100000  237s
    0 B- Y( U% D) t. C3 k2 w                /*
    0 T6 l7 n# V: o0 }% @8 Z! R                for (int jj = 0; jj < N ; jj++)
    . ~  q) q8 e/ |, S                {* Y0 n2 m! f2 j3 \1 y
                            fresult += vec1[jj] * vec2[jj];  }7 |: t/ T, k. @& o% f, G4 w1 W
                    }
    1 m5 \/ E- s; {3 A4 H                */
    8 x. f9 l4 q/ e8 V7 d* S6 l                                
    7 {" B+ M$ Q' \6 Z  M                //Method - 3  N=100000 204s
    * t( B, H7 }- W                /*3 C) ^/ q$ z8 V% d
                    for (int jj = 0; jj < N; jj++)
    % P( L5 G! p* H/ s# E                {
    * u. c/ @5 y% i                        fresult += b1[jj] * b2[jj];
    0 w' w1 W0 S/ _) }4 ?3 p                }- {! l* {# Z# p% j/ e9 O+ w/ ]
                    */
    # W, z8 ~  M0 t& W6 U1 T) E8 ]1 v3 S% ~0 N+ \
                    //Method - 4   202s: S" O* v' ^, i+ l
                    /*/ Y" H0 I- M7 Z; ]5 V0 t  |! v
                    for (int jj = 0; jj < N; jj++)
    " {1 \' F: ~; K0 I. K, d' \                {
    * J) b1 d: o0 `, c                        
    - _- T+ A  A- g, r: Q- s                }
    ( ]" q9 i" k) s& ^- @% l! \                */
    & U6 ~  B& [1 N0 Q7 [" E                //comment out all methods, N=100000  202s                & s6 d" M5 K: O; z4 Z: v  ?
            }
    % S9 M& h/ c: S" w# k' ]6 y, k, I/ M$ C
            delete []b1;
    ( q# p  [* V' T4 T! [* L% i; `: G" W) g        delete []b2;

    5 L; i9 K( f5 I* z0 s3 p1 |
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 L3 a' w$ b0 o" k  s; G3 [& q. m6 O5 f7 R+ u
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?( w# x" A( Q7 A& B; k
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    4 Z6 B9 U$ J9 e/ C: A- s1 {瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , ^$ n. o: u& s  C4 z; g5 i
    . V1 N4 t+ V/ q: Y9 g! i6 l. b: Y你第二个试验里面的j在循环里面又重新定义 ...

    % ^! j% B" v8 f$ b内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL8 a" @5 I. d& \6 c
    ) n# x& x2 e1 f
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% G/ u8 s# u$ x$ E+ K  [
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 }' J* A0 i6 o; n& b8 G! I" k! c
    ' [3 v) h! B8 [. m不和它 ...

    ' ~' j. I8 _* z; }: f, D
    7 O2 ?5 T: V. ?7 n7 Y不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。- \0 k+ f- |8 F. j8 ^- h, F9 b3 d
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:547 B4 Q$ N" L; R( o9 L9 j8 J# `9 W
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 }7 U. a( c! c; x/ ?% o* S. Y; w{, K% y! {3 D( B2 x# U
            comp temp, xtimesy;
    & l: T6 t- @4 z3 L& I: v
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。' \9 A/ {, A& L7 R; n0 z# A
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?4 {7 j) g" `  j, Y8 H
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-13 14:36 , Processed in 0.069066 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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