设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?" A/ @7 b, r1 x
    % H' w; `* q+ g7 X& w* m) D$ |
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    8 t2 K" C' p$ a3 I$ @* a  n9 \  f% ^! h; k5 d
    速度优化问题真的很有意思啊。. v: Y/ d3 i( f) B+ i

    / D0 k7 t7 e' }3 T欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ) v/ m/ H: q$ t2 n; H7 R. Z把代码贴上来看看?
    ( k  a! ]/ J# \
    4 R, H+ T5 }1 H  L0 [难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 " m6 }. Q" O! {) {. N3 [
    数值分析 发表于 2022-9-24 23:04
    $ {! P% C. C8 t: _; V. c拉下来?拉多少?! N; C& a) R3 w( @
    把代码贴上来看看?

    . C2 j' h" C+ P1 f* S( z
    2 h' w# j( w" e/ ?' W% x: Svoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB), @: U9 f( Z& D
    {
      W& m7 t2 S# D5 \4 Z7 C        comp temp, xtimesy;1 D( |5 z$ o$ _, f9 I+ o; X1 Z# }
            xtimesy.re = 0;( G1 K5 m# o% j
            xtimesy.im = 0;$ c7 q- I* v7 Q! g9 [  Y# W. o
            int j0 = lenB - 1;: {7 x2 o. r& v" F" S
            int    i, j, i1, reali;) r3 m, L/ ^  |, W8 o) P8 S
            if (lenA % 2 == 1)  J7 _2 _1 J8 J2 b5 P0 U, P
                    reali = lenA + 1;
    6 g3 p) G% E6 }, v6 F        else  ^1 D3 T4 R) V9 t# p% w/ D+ y
                    reali = lenA;
    * ]$ C3 z! M$ [3 l        reali /= 2;0 E( g  e' E8 w, M9 e( q
    8 N, I$ s" c* c9 {6 x' \
            int nconv = reali + lenB;
    . i' v2 Y7 M" O3 ~' u2 L$ f1 |: K        //#pragma omp parallel for
    6 s9 ~3 S& p& K' D6 I8 N+ \        for (i = reali; i < nconv; i++)
    ' P  F0 i0 ~& n$ p3 `0 Z        {
    * U, x! d7 _' L, `                temp.re = 0;
    6 w! Q: x. H! k: v- I                temp.im = 0;
    5 P" Z) e, l5 b                i1 = i;- y2 |& P& Q6 m9 G/ y
                    for (j = j0; j >= 0; j--). E* r) n8 R) j% v4 U' Q/ ^" T
                    {
    / R$ l: A1 W& u7 E0 r! U                        /* floating date operation */
    1 g! H/ q. g( Z# a6 X* R/ o                }
    4 G+ R; j6 Z3 \5 D" @; K( ?2 J
            }# M  s; V1 B; l4 R, e0 P4 N
    }0 q3 I7 p( `5 G

    ) M3 p' r, }: [8 Bxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样% l) r0 [8 k$ ?9 h" ~6 i

      p, X" F) P$ E红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ! v9 o+ O2 h7 R1 {7 h# ^  M现在call xcorr 100次,耗时78s.( l! i2 {9 U/ B% T, z4 F

    1 P  k9 E9 D; u: \. [如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. . ]. @' }0 B* {
      P, R% u" {3 s# W
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:337 h! g8 u5 v4 ~
    Maybe Debug mode?
    . }4 ?( ~/ A$ E* z. d4 r: A, j

    3 Z9 ~8 Q+ g) K4 g不应该,看我上面的回复。0 I" L, ]+ x! {1 E& I! z2 e5 A

    2 B' o' ?( ~3 R7 C我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 1 x$ T: c! g! d0 f
    雷达 发表于 2022-9-24 23:541 Y: M/ l7 j4 q/ Q, R
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , b1 ~  B4 n: I" i6 P{! D' W9 O& j  T2 a8 j
            comp temp, xtimesy;
    4 N; u& e7 W- [' c7 w$ m: t' r

    # }* ^+ ?: S8 v这个不是这么比的吧。。。
    ' g/ l6 q: y  P7 e/ W" y
    ; Y, T! s5 _7 k' I您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ( Z9 i! \0 w0 B. v9 U$ }
    , n+ }7 I8 S" e0 C9 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 编辑 ; s+ E* i3 k5 p# o  F
    数值分析 发表于 2022-9-25 00:20" r0 ]1 W$ b! h: C
    这个不是这么比的吧。。。
    ! _7 `# K9 ]5 c3 E+ D1 F
    % ]2 |, u% x3 n) F2 e; X您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " S2 t  V0 \+ w1 L
    8 G+ u) O3 o" ]& j3 s
    有道理。
    4 ^8 c  m, b) W0 q2 F: [所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。) [* g' |+ B4 j3 d" h% v
    " C, q, u' u! n$ ^, Y* q" M( C
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    4 e) [/ s+ \. P- n* [有道理。
    ) V9 e, H) N2 X2 q1 ~所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 j4 B# C" O' `! e7 `你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ; W' z1 R/ m  ]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
    : \, O/ q% _- k* ~3 [: c. H这个不是这么比的吧。。。$ Q0 `4 ^  P* \! \  x$ S
    2 q; ?: i3 l4 W1 _8 w' `, g7 v4 Z
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ' G3 x  }) @& d/ B
    0 E# S' j1 B  K6 Z/ h1 z3 c$ 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 编辑
    & m6 W+ L7 M" [) K6 u- D
    沉宝 发表于 2022-9-25 01:48
    + S9 [0 v& l6 c- D现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ( {6 h8 L) t9 k; n0 D. W  R

      h! v/ ?/ J6 A" Q% I; @! x是的,兄台说的对。. X9 T/ l1 g9 w7 v/ w
    3 Y: x2 t. q* d
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    / D$ M$ D% S1 t4 ]# J* `3 R" d. H1 |4 k0 @5 f  ^  c% Y
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。* e7 }- P8 H3 s4 C6 ~0 X& e7 ?
    , k% t0 F+ N6 `9 z+ a7 V
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    0 G( F4 K5 ~/ t# Z0 p/ D0 s5 H& Y0 R) k; e9 N, }( D! S
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    - D1 |/ Q7 q! F) n5 W- s
    沉宝 发表于 2022-9-25 01:277 Y5 g- A2 Z* ?8 X( A6 L3 ~9 X
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    + h& ?9 J' @! n7 S/ l+ s3 `6 O. ~4 R3 j8 A6 o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。' Q6 h: N1 `" G1 j4 ~3 ?
    & v" L4 M0 x; t! H
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    6 Y% @1 c  s. x; }又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % ~+ W) z$ F" I# Q6 C时间差一倍的结果可以接受。8 L6 g6 ~* N0 A' Q2 h
    8 H8 w4 v4 I& i1 T! ?9 n
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    4 o7 b! M6 a: B% {3 b9 d3 ?9 ]
    雷达 发表于 2022-9-25 04:47
    * e. W; S3 _/ E" m- _又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) `- U# ~  E3 `

    ) l0 `' J! a" p9 R) r
    7 C8 O! o+ K. w( L% U0 E" f' y. T6 Q$ z8 F
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 " f' u6 y. @% `  _+ f
    数值分析 发表于 2022-9-25 14:582 {$ H/ L1 v& b  u, o1 M
    能不能把这个也贴上来,看看和上一个有什么不同?

    ; K8 q- B1 j% u8 L) V理了理思路,重新做了一个测试。
    5 ^$ Y! N3 ]$ q做了两个 vector 和 两个 float *, 都长 100000
    5 l- }' L% A  a5 H. m外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    2 @7 ^; R$ i, T0 N  `! u
    # I7 s4 S) V0 ^8 k( `3 C内循环试了4种方法,
    * q& d1 Y4 D4 }* H* S* q1. 直接调用 vector inner_product 247s 7 R: J$ ^; B6 V6 f* i, d% i' [4 l
    2. vector 循环点乘累加 237s  s4 q: y* I: o: k# o/ v* w
    3. float * 循环点乘累加 204s3 s! X9 ?/ X7 F+ W$ X1 m# d
    4. 空循环 100000 次 202s' J- W& K% D6 H, @6 h' ~
    + e" k# l$ k0 O- ?, O0 r, l
    不做内循环 200s, U" U+ A4 P* m; V( z2 Q; {

      d+ b3 F/ Z9 _( K! C1 m' g$ q你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    , u7 Y! }& P& u另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: W3 P# f$ Z. T7 w) w
    & H( ?" D$ r7 ?; T& f
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ m$ i8 X* M# [$ s  z  a% s
    & v; B  q' f& ^4 @5 k0 @* ^) r
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL). a; O3 N0 Q3 D
    8 E: B3 A6 ^' j; ]
            std::vector < float > vec1(N);- B- v! |: @. [
            std::vector < float > vec2(N);
    2 a, ?5 P) @# n        float* b1 = new float[N];
    ! \) G% w& c1 P' q/ B        float* b2 = new float[N];
    6 Y) y- S" T% e( c# |# n
    $ ~2 f! q% C9 V+ `        for (int j = 0; j < 6000; j++)) ]) F% N* N. T; F  a( f
            {
    & G: b, ~, S6 M" j                std::generate(vec1.begin(), vec1.end(), []() {
    + [# ]2 e; O- B; l" ]7 g                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. U. T. V. n( x
                            });4 [7 G' f# w/ K+ P( y/ j" [
    % q' k* ^2 r- ^1 t* e2 M. A# U
                    std::generate(vec2.begin(), vec2.end(), []() {
    2 `  }/ O' k4 N. X3 }) h                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    $ ~6 D% s$ w& f7 ]+ e- _5 A" m                        });" @  P# V. @! h  r
    . F2 p3 t/ L6 \) e5 Z* U0 ]
                    for (size_t jj = 0; jj < vec1.size(); jj++), h5 I) }( k: e* H# e9 p3 T* L
                    {
    1 F) _# |: G8 x& T                        b1[jj] = vec1[jj];  j5 R8 |) ]7 C
                    }
    5 V4 I$ S' b: a/ K0 ]2 h0 J3 i: q/ G) k0 ]. J
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ' d# ], I7 @' s0 n& b5 |% S- Y                {2 h) s3 Z# v6 ~/ G9 @2 Q
                            b2[jj] = vec2[jj];: A- j# @+ G/ I9 _
                    }
    + m3 B* q8 i4 M/ W& m
    . @  ^  f7 g/ F                //Method - 1  N=100000 247s  
    2 K( {! I  Y" ]3 ]' ?4 \                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    8 |8 r* v$ q- w1 _- n7 t! e1 q, G                                
    8 n1 ]5 q4 S% `8 t: S                //Method - 2  N=100000  237s
    - R3 d8 o# z% Q5 A# G$ Z                /*: H  b$ F; w/ X) n
                    for (int jj = 0; jj < N ; jj++)
    & [2 H* `* _7 w: X4 L& r+ V9 R                {
    ' p' k1 o- o0 i4 ]+ ?                        fresult += vec1[jj] * vec2[jj];3 ^1 g0 j7 p7 E/ F( P- Q
                    }1 l$ S- F- Q9 w5 h. X. R0 B
                    */
    / P0 ?" |. c3 z( G* t+ [. p' x& T9 _5 m3 x                                
    3 ~& K' j% K1 T                //Method - 3  N=100000 204s' _7 t" T# V' A
                    /*
    ' W% ?1 j( s( l2 v" d% ~                for (int jj = 0; jj < N; jj++)9 @" v. p9 ]( D, ^6 \
                    {
      ^% p' `/ s* G  ]: ]                        fresult += b1[jj] * b2[jj];: j' `& Z' k; o0 s  M) Z* u, o6 r- I6 P0 Z
                    }5 l! _. J' W, i9 s3 l+ Z& K+ W! J
                    */- G& }% w4 c2 T

    ( T& d7 P3 Y+ e* u                //Method - 4   202s
      b2 C! F1 j' [8 \6 b6 H; k4 g                /*
    # C* C$ {3 c7 c3 |                for (int jj = 0; jj < N; jj++)- g& z- \* B9 `/ O2 k! s3 V% i
                    {& d0 y3 Y# ^, H' ?7 M
                            ( F. M5 l% S( X0 O5 ]) f
                    }
    6 c6 C* A8 l2 g6 J5 I) J: R                */4 }2 p( P$ R( u) X
                    //comment out all methods, N=100000  202s               
    7 n! t$ F5 L" \% T6 S& J7 m        }
    7 D0 M% t# n( G3 }
    + L) y+ a) t5 J" d& q3 c        delete []b1;
    0 ]! w) Y$ ]6 z6 R* ]5 S# Y        delete []b2;

    # a- T6 z$ K& a7 b. A9 I6 z2 Y0 A* f" `
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% [1 l8 S0 Z/ q5 c

    . W1 ~& J& s# x2 S- ^4 y* M6 T, Q你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    , U9 Z7 p1 R0 C0 O. l; a* ?3 i* F
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15" u8 X/ p# l/ z- X' L
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 K  J1 O& J" Q' m
    9 U# H. k9 L  z' c( h2 K' j你第二个试验里面的j在循环里面又重新定义 ...

    ! B" f7 x$ M( y& c, L# ~+ p4 w内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 N1 a$ n3 K$ M. F7 a9 ]4 {

    6 h/ R2 J# J- D/ W" {6 _不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    / b( ]# p6 z+ K$ H- q) Y9 J0 ?; }! ]4 x  \内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL: d$ w1 q" O5 u( f/ e5 y0 c9 Z- _

    / U1 ]5 }& t% p9 l& f: v7 M% k0 O" j不和它 ...
    6 e  _; ^3 h' t/ [: @/ q8 H

    5 n& Y$ S! l* U. a2 ]- R; G; y1 X9 s不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ( _: b) q0 r7 m7 p) d后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ; r2 q( m0 I, M$ P! |% V5 Lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" @/ a  n, F8 I; D/ v
    {
    4 O1 Z& u1 u/ N' W4 ]( |0 }8 d8 k& K        comp temp, xtimesy;

      w  ?. F/ G" ~; h这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。& J& F- p  q8 l1 m- @
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?( E8 N, B$ e- Y" P) I
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-26 04:45 , Processed in 0.069116 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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