设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ; v9 e) A: X5 q, G- D
    4 N6 \2 e" `, K- n4 x' x; Q/ d自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    1 ?& ]8 w# v: X8 t; W/ }- k
    8 d! ]+ P; X; U6 c速度优化问题真的很有意思啊。7 @7 ]# X- _8 I% Q' w/ Q

    4 S* L: E2 n  o; H! N0 ~9 x2 @欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    # X6 k1 E& Q5 L( ?& l& R5 M把代码贴上来看看?- B3 M4 A9 b+ ~% ~

    ) B( b# \  H1 v$ T8 F难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 * f! H, l1 j4 F
    数值分析 发表于 2022-9-24 23:04# p9 R8 w+ \0 v# R. ~  N! k3 M
    拉下来?拉多少?
      y6 N( g! i5 R. ^! @! \* b5 v9 ?. P把代码贴上来看看?

    " q) y5 B0 _7 J
    + Z9 n9 R4 q, |& z; H0 Ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 b# D$ Z/ x7 \* e, E$ T{
    ) l( V: ?/ A% P, z+ V+ w        comp temp, xtimesy;; p. a, x7 j! v8 J0 {! N
            xtimesy.re = 0;# Z9 A6 `+ ]9 g9 G( R6 [5 J
            xtimesy.im = 0;$ i+ d& Y8 l1 c! N" m" ~
            int j0 = lenB - 1;
    - i5 _' \: m6 r  H/ c- u! O        int    i, j, i1, reali;3 v: y/ y! ?) Q5 ~1 t! s- f4 j
            if (lenA % 2 == 1)+ ~# }! x1 a6 Y6 T* |2 t
                    reali = lenA + 1;( e1 t  F+ w. ~6 G% S
            else7 Q. f7 Y- e% |1 }# Z( p/ a( ?
                    reali = lenA;
    8 K3 h" h) J0 @+ c- H; ?- D/ o        reali /= 2;+ j! ]. S4 L1 B* P* Y# z0 J
    ! o' n( Z7 _; B1 D
            int nconv = reali + lenB;
    : e' X% K. N/ b" ?/ H' R' E        //#pragma omp parallel for9 o% _$ T2 o4 c7 \
            for (i = reali; i < nconv; i++)% x0 w: Y  B* X2 R1 M2 |( ~
            {- f4 Q4 q* J4 s/ z5 u0 ]& O
                    temp.re = 0;5 y7 L7 U! Y4 V1 _8 a9 `# L
                    temp.im = 0;
    : f3 T9 V/ L* r' ]) S( H+ t                i1 = i;) M7 u/ h. }  U8 M% g& o
                    for (j = j0; j >= 0; j--)- C/ y# X) r* @- A' h" m6 Q; J
                    {
    , c4 J* s6 J; x7 ?                        /* floating date operation */' K. Z& N9 T+ ]+ v( N- F6 o6 C4 `
                    }
    & b. w+ ?$ ]* c* H/ {( ?
            }
    : w: l6 t& n/ Y* z- a0 R* {) C}2 S- n2 i8 m5 L& E
    - q- l. }4 g$ w/ V8 Y
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    $ X5 Y' c$ _: F1 B& n' o, ^5 G, u
    & s4 g% `' {. X- J红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    5 `9 R4 t3 a# N6 Q! o3 S# _1 T现在call xcorr 100次,耗时78s.2 a( I6 y2 h8 V2 `! z1 u9 r

    2 x' K( t6 F6 ?如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    : h' e+ c9 J4 k4 l" h8 V: R* G& p" q. O2 b2 c3 H
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33& M' |. C* L" f
    Maybe Debug mode?

    9 R- @& g, F; T/ i- W: R5 m5 Q0 Q2 i3 S
    / U, |! v2 H% O: D7 E1 H5 \1 H$ \7 D不应该,看我上面的回复。
    ) l) ^. O& P) b- F! Q8 `4 }' x$ @8 N9 u" S3 Y; U' d6 t7 V
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ' m( V/ P; @: A* w: G2 a# x
    雷达 发表于 2022-9-24 23:544 A& \: @+ P  G+ ]
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ( [! H8 z' C3 j0 O) }5 h{
    4 h/ u1 z+ c, B        comp temp, xtimesy;

    6 C5 \2 U# ]8 l9 z) b
    2 X, V2 X0 K1 r- j. E7 ]2 `这个不是这么比的吧。。。
    6 r* P6 Q5 @1 @/ `% M2 F6 X1 L3 T8 O- v1 v) f
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    , h- s8 L8 }2 ?7 j! r* Y* A& D2 A* F1 b) \& o
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    - H+ U% Q& S5 ?2 c
    数值分析 发表于 2022-9-25 00:20
    , L+ I% r* K( q7 O这个不是这么比的吧。。。  z4 w5 _7 f: l+ O: X% _& U7 u

    " j9 u3 ~: Z& ~% J$ k您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    , q; q" {8 m  i

    6 ]8 S- V# j4 t" I, U有道理。$ a2 R0 q2 p# _4 J+ T( b: R
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。, R8 K- D7 ?8 X$ p% K- }. m+ a% F
    . I& B* H3 A5 U7 R) H
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46! x# X, i! m# T
    有道理。2 z* p+ R0 X$ ^2 B$ \0 f, @. G
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 N2 _$ J/ v8 p( d4 T) V你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多$ m  S1 b; Q) _6 m9 Q" X+ s- `
    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
    1 P# Q( B8 m( x) R; p1 }% D. _这个不是这么比的吧。。。3 h' \% f  n  Y7 k9 R
    : \6 A/ M# v+ z  \4 S
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ; C% ?9 }, }8 x* d. l1 Z) _% x- _: S, D& c. Y+ w6 ^% K" I5 Y
    现在的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 编辑
    : i$ ^# o8 I1 p
    沉宝 发表于 2022-9-25 01:48; l% t0 {. r2 I  D
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    . Z3 ?; N8 ^: b- \2 @- [

    8 H( ?" C- E7 k) h是的,兄台说的对。. U4 d! W: F7 `/ \1 }9 ~' Y3 G
    % \+ I1 q' r8 [  Z# c
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
      C, R3 I* b. h( J6 j) n* p7 R: J$ ^1 |+ ?: E  G4 U2 @4 v
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    - l. a9 ?. k* }; Y* q5 @  X0 j* J
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。! i" X2 Q8 o; t! K# A' }5 B6 T
    9 d6 [4 L/ y1 q4 M
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 2 r' e3 o4 k4 h2 C
    沉宝 发表于 2022-9-25 01:27
    3 u; m/ \" h6 A7 V3 w9 Y你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ' C# a; V* R; |. N
    1 H6 N( M1 t9 q, e又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。1 ^% K, H: j( M$ E
    9 J! w& P4 y1 b6 Y
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47) o3 s$ T  }# D  b9 ]: e
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    + X1 d( I/ T& Z3 P% R, P7 z3 D
    时间差一倍的结果可以接受。* K* f1 L4 K2 K

    / y. O# E0 n# |你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    2 n4 L* R: P/ r- Q. ?
    雷达 发表于 2022-9-25 04:47' X5 f! Y) ^0 Z# u$ X7 Q7 i+ a
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

      X5 p) y( ~+ i9 B4 p. o% K1 k: N: }
    ! g- ]  l- k& `; m% A
    ; `" _( y0 q' `# L% M0 _
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 _9 u( [. i' R8 w: i+ m/ b
    数值分析 发表于 2022-9-25 14:58! J2 Z+ w! x* j. w- U1 n
    能不能把这个也贴上来,看看和上一个有什么不同?

    / ~% r; A) B" u理了理思路,重新做了一个测试。
    7 r( @' K; N/ \/ m做了两个 vector 和 两个 float *, 都长 100000
    ( X. T! }9 u7 x7 V* G3 f; j外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.  L' A+ I3 S  n( m2 Y
    ; f# B5 ^! c( [; f
    内循环试了4种方法,
    7 l  [+ M# J& k3 G: [# H# H1. 直接调用 vector inner_product 247s
    / g' r  B" B6 [1 @- g2. vector 循环点乘累加 237s
    , V& V' f1 Q& @" ^6 z1 ~3. float * 循环点乘累加 204s& X) X: c3 ^3 m8 g: R
    4. 空循环 100000 次 202s& Q8 U: D( d' \' B$ g* Q
    % s$ g+ W% e% A  w! p
    不做内循环 200s1 Z: u3 s; D% G8 `4 y

    : N3 Y* [4 W0 A2 C! P你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    8 G3 K/ U8 `) u1 ^; k9 b另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( k5 N, R; k7 N: ~; d
    0 Y0 {! R/ p/ I# E# m
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' o% o) x& G( A) s' t3 k' V- i  ?

      i* C5 j0 L/ k# q: S6 ~# B(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    % t7 D3 ]. b3 P" ]5 S& `& _5 Z2 l9 S
            std::vector < float > vec1(N);" q; B5 S, k$ _6 k6 Q
            std::vector < float > vec2(N);$ p& f) _# v. w. k( i" H
            float* b1 = new float[N];* G; N+ W) X* w+ G
            float* b2 = new float[N];
    # D( p+ z$ k! ]+ g! o1 F
    3 v/ Z( t! V. p/ Q5 x8 l        for (int j = 0; j < 6000; j++)# K1 ]. |" ~" P( l% M
            {
    - P  I& l+ W/ |; L- R! j                std::generate(vec1.begin(), vec1.end(), []() {* k- C, a- L+ X+ I' f. j% q
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 ~2 ?6 R9 N6 Z  C0 \) O" N, I
                            });
    4 S8 f; d6 w% n0 s5 [- b+ i: S5 ]1 W1 B7 A3 i1 ^  Z7 L
                    std::generate(vec2.begin(), vec2.end(), []() {" Q$ _% C+ o8 r8 D8 q
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    , o3 N! r; @& Z; W                        });0 h7 u, o5 \# u: q: G( Y/ E

    2 z( ^0 o6 b: R! U( x$ P                for (size_t jj = 0; jj < vec1.size(); jj++)
    ! T0 t; S* a; n* w! V2 \                {7 L& f- l2 H, {- N0 ?
                            b1[jj] = vec1[jj];% n: h: w' H+ E" P8 @/ _2 I
                    }
    " ~+ V; i5 ]. i7 t0 M1 z$ ^! a7 A* u" `% x
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ' f$ g3 [8 X# A* M6 H4 i$ V/ R                {% H9 j% [( w1 [  v
                            b2[jj] = vec2[jj];
    : J( Q% [  y* U7 Y3 Q                }; ?6 e7 x9 u: e! a) O
    ; m- O/ X  ^7 T" X' A% x' m
                    //Method - 1  N=100000 247s  
    % g# Q; ~$ k0 O1 f+ H3 T& ~                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    . m- R' X5 c+ I0 Q                                , M. i- O, m6 p# b
                    //Method - 2  N=100000  237s
    8 B- I! d2 J1 H                /*
    6 R& `+ w5 d7 M                for (int jj = 0; jj < N ; jj++)2 q, z% t8 D0 S
                    {
    4 J, T% Y% J" K$ L. x1 J# o9 J                        fresult += vec1[jj] * vec2[jj];' z  F: o8 L' ?, _4 d3 ]
                    }2 O3 _5 G# b- Q
                    *// z. |6 ~- K( B7 m0 D/ T
                                    
    " p' q* g: _/ P/ M) @                //Method - 3  N=100000 204s
    7 f  N! K/ x; z9 n                /*7 }7 D+ N, N9 S. l9 c& [- w, ~
                    for (int jj = 0; jj < N; jj++)
    : n9 F; G. X1 a1 Q) j* M& D                {
    3 X% }+ X; n7 Y! r                        fresult += b1[jj] * b2[jj];
    . J, v. k0 G: X6 z- N5 _$ ~                }
    + T5 c9 Q& J9 g0 i6 A                */
    " R5 z3 Q( p4 X* h- Y2 l3 y9 i0 f5 ?( y" ]+ G) @2 n
                    //Method - 4   202s, N( v6 m* v2 v# Y
                    /*$ e# }$ B: P; p8 `( |$ M4 G
                    for (int jj = 0; jj < N; jj++)
    , p. }$ r! q% ^" @0 ]                {2 u: S0 f) ]% w' ^' t) j
                            
    9 C* `( g4 ]# k9 G* X                }
    . q! i! Q0 i( v/ ~0 Q; q) L' z                */4 h- `, x; P" A( G! d. O4 H
                    //comment out all methods, N=100000  202s                ! Y+ v& `7 E3 \/ H1 g3 t
            }  z6 U+ f0 t) w6 g. }3 h! O3 h- \0 f

    / ?- F+ q8 ~4 w# g& o3 }+ v* P. j3 r        delete []b1;' [7 b! D& ~8 u' Y  S% v. g
            delete []b2;
    + N+ _: D5 N' y9 X% g5 W
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    5 M  b! t- J9 S, V% i: r6 g1 ], ?& k$ B1 G
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    + p4 M; F: v$ [0 x& e1 y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15* G9 d+ k$ \) i3 p% o5 I# {& h
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% [, p' O" r; ?

    $ f% C+ i  g7 _4 L你第二个试验里面的j在循环里面又重新定义 ...

    4 S. {7 l: j+ o8 `8 b内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL1 B, d( l- ~  u. _, ?9 D# D
    / G5 ~; [2 E( [( t  L- ]$ i+ Q
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    5 R7 y, k. ~, ?' N: F8 J内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 O% {7 A. ^3 p+ l1 g3 Y& E

    - y4 b( f$ i7 `0 i5 |7 c" R不和它 ...
    $ k6 ?/ y1 o9 R% y4 ^# T& J
    # n6 p4 S2 Z  ~5 L( S; v& m
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。! n3 N& @2 i8 s
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 e; Z' Y: e, Z& I* \5 Cvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " q: n7 d$ I8 j6 i% l{) M) @4 E1 r* w9 ^& n7 c
            comp temp, xtimesy;

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

    使用道具 举报

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

    GMT+8, 2026-8-26 10:51 , Processed in 0.085039 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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