设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    8 l. A2 u# a: q1 u+ p0 D/ h
    # c8 [, E* ^9 T/ C自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。+ I4 z/ G. P/ `9 j
    6 s! [9 \. C/ D& z; b
    速度优化问题真的很有意思啊。
    ! I. ~6 S0 |" g7 H+ `
    - z- J3 G3 F6 N! e欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    % P- S" }3 b+ Y% n# ]; g把代码贴上来看看?( a& w+ z2 O( u7 ^6 d8 |$ B, T
    1 D; {4 M3 q! e9 [5 L  K, W
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    . j! P) u7 e% Q% \0 b5 T, N$ x% ]) F
    数值分析 发表于 2022-9-24 23:04
    * k. ^$ v' v4 L( A; c2 M拉下来?拉多少?# ?* ~6 F: V. Q3 ?7 Z/ q
    把代码贴上来看看?

    3 z1 j# R! u' ?4 y. m% N2 b( ^" w7 n8 q& Z, v
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 J; Y) S; n5 g+ G7 ?
    {2 N4 d5 z- L, U! E5 l3 V" J
            comp temp, xtimesy;
    1 N: S; u3 }, U: j        xtimesy.re = 0;
    2 i5 J/ e! |2 u, ]        xtimesy.im = 0;
    . N3 A5 L2 ^9 r; T, X        int j0 = lenB - 1;+ y0 L# ]9 d) r0 j1 m
            int    i, j, i1, reali;
    " z; i" Z8 c0 ~. p: W# ^        if (lenA % 2 == 1)
    1 ~- w% B2 _- V6 U3 \' V                reali = lenA + 1;
    / j: t5 j; P7 V, q- G2 J        else* v1 ^0 ^- `# }: j7 h
                    reali = lenA;
    0 Q2 k% h. e. q% d! W        reali /= 2;0 ^1 t% Z5 w( q/ c. E
    ) J' V* S6 y+ O3 d- Y
            int nconv = reali + lenB;" Z# W! l1 ~) i3 C1 g1 t/ M
            //#pragma omp parallel for6 q$ }' a) q) t" K+ I4 q
            for (i = reali; i < nconv; i++)
    5 |/ D1 x) h( Z; Q' N+ U) n        {% o. H4 E9 F# ?& @+ @
                    temp.re = 0;3 f7 S3 W+ X: J2 F/ W& [& n7 J
                    temp.im = 0;4 `* A% K# K6 T
                    i1 = i;/ ]) a& ^7 K% _* e$ {7 z: n
                    for (j = j0; j >= 0; j--)
    . D+ P& t& o+ B/ G+ l3 n" k                {
    8 O8 Q! t, E( Z' R                        /* floating date operation */% h9 w1 y1 B1 A, O2 ^, _
                    }

    5 w- h2 f6 S+ \  O        }
    # a! t# Q7 Q7 m/ `9 g% c}4 u& O. Y1 Z  }" |
    $ D9 b1 L2 |, c% b' o1 w6 M
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ' \+ d# J6 i4 G' p
    * z- A2 e" R* t& t红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。$ E) u. X8 b  N/ x; k2 o
    现在call xcorr 100次,耗时78s., k' U  P) i# \* v: q# y5 ]/ ]. [5 f
    $ J) |+ r  k& \, |
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    9 l7 N+ z4 D; o# N3 \, S
    ) s5 X/ x* R8 a- U9 O5 h
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33. N: d1 w2 l! g/ ~9 t
    Maybe Debug mode?
    ! x/ b" E( h6 w6 v! F& N. A

    7 W5 @# ]% m* i1 \# e% Z不应该,看我上面的回复。
    : A5 I1 h/ @* j3 ^; N# L+ P2 F
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
      L9 ]' n- c/ m# H# R
    雷达 发表于 2022-9-24 23:54+ F2 D# ^+ z/ w4 O# J
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 }" U& S8 P: u* `. c
    {( s% A  |& U0 M. V- |
            comp temp, xtimesy;
    2 S1 P$ g: m! \. T6 i
    + ~5 ]' Z/ Z; m$ V* I& _  x3 R) Y
    这个不是这么比的吧。。。& |8 }  s1 ?4 |8 _. O0 |# l6 _

    ! Y/ e3 w, ~- E8 y# z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。0 C  b% l+ o6 e$ C: W( E7 y
    $ u% a2 N  B& W7 j) T" K9 u
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    1 l, o* u/ N3 S
    数值分析 发表于 2022-9-25 00:20, K/ Y4 ~3 q  j& `
    这个不是这么比的吧。。。) |# _; x, J, C& I
    ( M2 b5 p- X, z# A- t) ~# `
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) H# q; r6 d* O9 B: F9 ^* Q8 o

    1 H* ?) E/ }7 `有道理。
    4 l8 V+ b" g' X7 I% X所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    . Y2 h7 |/ A8 g  o+ T6 n8 [+ D% u. z  F/ j
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46& O1 P! R2 }% _  ~: E
    有道理。$ K2 A; q6 U1 k& b4 i( B) N% C- y# J
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 n# i  q7 T; Z% G* }6 {# c9 s+ g* T你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多1 U& s  U( N! ~5 A4 V/ Y' [: i2 x
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:203 g4 F+ N0 d2 x3 ?& M  ?
    这个不是这么比的吧。。。' }- c6 \) z2 a0 O9 ]
    3 q: h! A# ?7 J! @, ]
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    0 b" n# ?3 }. k& h! ?. p9 D" Z( Q
    , W( F, d9 j3 c$ z5 ^% G3 m5 r现在的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 编辑
    2 }3 O% {" X/ x: ^% C, q
    沉宝 发表于 2022-9-25 01:48
    ' E. M! ]0 s9 E% H; Y现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    " w. T0 r8 I( C+ T. l# n5 t- k

    7 Y2 n0 Z% }. M9 [( y! k是的,兄台说的对。* w1 U4 _9 M$ L4 j
    # Y, E/ T, D3 E9 |3 ^- g& @
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    & E; ?% V6 N' u& z; ~3 b, U' g2 a4 |  H
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    4 \' D: C  F# u4 R; u* ^( e
    - c: J" @/ W+ [6 I+ ?1 n4 j9 ~比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。0 m& d7 y& p. g  z
    % @' x" N$ h) [+ q/ ]" r
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 0 P# n( q# X! O4 p" U
    沉宝 发表于 2022-9-25 01:27
    * E* S. ^2 h" p- H4 A你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    4 L. B3 ^( M& p0 g* Z* k* k  j* b7 a' W) X
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。" n* R* i) h6 M$ w

    ; ?: D$ A6 N3 a# ~3 w) h( D/ m我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47! r2 [0 i5 ^) T# R0 h
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ( K2 V6 w+ q3 v0 r时间差一倍的结果可以接受。$ s. a" |2 }1 v, ~9 X

    . Y5 B  k% C; `; c2 \1 j) W你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 & J8 f8 v. H* a" I  r
    雷达 发表于 2022-9-25 04:47
    : w- l) C: G/ v+ b; C又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    " i( y, W  w4 e6 V& k0 t
    ' M0 G- {( B5 S/ g. Z$ g7 c3 y
    : M+ K, J2 R. y% d' R/ N
    4 ~* U& Z$ t4 Q0 h$ o" s能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 % j3 J0 j. k+ S+ H" _
    数值分析 发表于 2022-9-25 14:58
    4 C- y) v" U7 t, [+ z能不能把这个也贴上来,看看和上一个有什么不同?
    & F' _" s3 Z; z. V. B; E( D; J$ g
    理了理思路,重新做了一个测试。8 H+ r0 c  j* I0 h2 L6 W: t
    做了两个 vector 和 两个 float *, 都长 100000# C1 [4 S9 ~6 Z; Z0 @
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    % m; n/ v5 R$ Z% D$ u
    ) i) }0 I% I1 B  y2 u7 i1 [内循环试了4种方法,. h9 S! w" A% L2 j$ X
    1. 直接调用 vector inner_product 247s
    * G- ?; D; H7 R5 P- H/ o+ I" F5 y3 P: `2. vector 循环点乘累加 237s  g2 n/ h( _0 Y8 u" `% K* i. |
    3. float * 循环点乘累加 204s
    3 t" F. Q' o) c. W  b# W4. 空循环 100000 次 202s3 I5 s+ C) D2 h5 J' ~+ h
    6 Z2 M% h% K; Y  x# X" b( K; N
    不做内循环 200s
    1 [, D6 I* ~6 _1 G4 r( ?) }6 N) a0 V& x4 E2 |3 c! v5 N
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。  H0 S& m# }- w! o4 E7 X' W
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# s9 N/ g/ }$ L

    + [5 O9 i7 Z- g4 @  P0 f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ k  }* J/ V& W# a7 f2 F
    : b: f) c, H) c, c/ e: }
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    5 k2 }" ?) @4 C5 t# Q7 Q% H
    " U. p" ~0 E: M$ N* m8 F5 i, u
            std::vector < float > vec1(N);+ M4 P, ]" c) Y3 s6 k% Q
            std::vector < float > vec2(N);
    0 y) x7 V  w# Y' z        float* b1 = new float[N];
    ( ~3 [$ I) Q/ u8 J        float* b2 = new float[N];/ o  ?! o; L2 e+ _* o+ |( L) v

    ; k- E! l9 B( R' @        for (int j = 0; j < 6000; j++)
    9 j) [8 h2 u  r5 Y* d+ w4 J, `* U        {; d9 t. b4 S/ c! z' h
                    std::generate(vec1.begin(), vec1.end(), []() {: ~+ g# H% E- c0 u( L2 C! h  n' z
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    " G0 f* l: `# O  H  l/ G) g$ v                        });: U9 s: K, R1 ^4 X- z; I2 F( W
    0 }; R4 Q, f9 \2 q0 n" b* ?7 l
                    std::generate(vec2.begin(), vec2.end(), []() {& E9 N% |# n) ?1 X9 y9 ~
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 p+ T) {  m0 i" t! n% X4 T! O
                            });
    ( i% Q( s8 {/ y. y+ Y
    . T4 |' n& k' O* Z5 ~- d- E                for (size_t jj = 0; jj < vec1.size(); jj++)
    # Y1 j0 }, H  ?: M5 @$ G' _; e# W                {) R& o8 l8 Z0 \, ?" T
                            b1[jj] = vec1[jj];
    : d( f) {/ r/ k: X! Z" Z7 Y                }4 y7 S+ {' Y5 X% r! ?* \/ Z4 M9 J

    + ~" o" b, r6 x                for (size_t jj = 0; jj < vec2.size(); jj++), X# h8 n: ~' |8 S8 y, Y% s) G$ E
                    {, h2 A1 v* W( u/ ~
                            b2[jj] = vec2[jj];! C3 @9 D( }, Q% ?
                    }
    " W; u/ H) a, \2 f: M0 T% S  J
    2 S" O! i) P3 I/ d8 ]                //Method - 1  N=100000 247s  
    . @: F/ q  ?9 _  y! i                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ; H' W$ D( S% L. f8 q                                " g" {0 I! ^( O1 R- E1 a2 b
                    //Method - 2  N=100000  237s  L2 B+ q, q$ d# _) K/ V% x
                    /*
    ( E' m; Z4 B, C7 L/ {* t                for (int jj = 0; jj < N ; jj++)
    0 C, ]5 C1 m  w1 P) o% o                {* k3 R- _: p5 s' U* H
                            fresult += vec1[jj] * vec2[jj];
    . a7 s; |  @- ~$ P. o0 o/ N$ `& C! j. y                }+ ~9 u# k% F' L* ?  E
                    */
      `) V1 b, K5 a9 q/ d                                
    3 D* [/ S/ V) v                //Method - 3  N=100000 204s: X* n' ^: O9 w/ K) j- {3 m
                    /*
    + K6 U% G$ U+ R. ^3 A0 f0 V                for (int jj = 0; jj < N; jj++)- g9 X4 r2 |9 V4 T- j5 B
                    {
    3 d+ U8 f8 K& p                        fresult += b1[jj] * b2[jj];, n# j0 s4 U! f: R; u
                    }
    ( \) \* F6 A! U3 K                */
    ( y) a* s8 }* e! \7 O. O. C% L
    ) x: n  J6 i( l: Y                //Method - 4   202s
    . h- _+ Z; W* G                /*
    $ L% O  I# l2 ~: I  w( w                for (int jj = 0; jj < N; jj++); E4 K6 k- E% s: D8 a; S4 R
                    {* w+ F, s5 ]. B
                            # C: [1 i5 f6 I: [6 e6 b. h0 i. l
                    }, i3 r; h" P9 b' `& ~; C
                    */
    / ]. l' o9 u! Q* j$ t4 T, U                //comment out all methods, N=100000  202s                # Q4 x! w4 K. p- x3 w
            }
    5 b& X" {1 o2 F# J
    ; s0 \# P) O2 h' s        delete []b1;
    9 D: S( L& F: {+ L: |2 Z! j        delete []b2;

    5 O2 w1 e8 T0 k( n0 A
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    / z+ J/ Q  v  s6 A8 g
    0 G7 ?% |2 Q4 n1 k你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    0 G* J  G5 U9 d/ F
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    5 ~. a8 X  r' T瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    & O) e# n; W% w. x  D  c7 A0 L- g/ p% d/ _$ b
    你第二个试验里面的j在循环里面又重新定义 ...

    ( {2 K  T' Q' m: h" R, q( T9 ~内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 ?. O; O/ Q1 h. }1 M
    , [1 U; a1 i; `  N: q: t, i不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16# v6 F# Q& d' N
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    * z% y  Q+ Y. ]. X: A  W0 F8 [
    8 Q5 M: }7 G. K/ F" J2 m& q不和它 ...

    / }: [$ o& l) C" {% d+ ]% Y. |: H. K6 S  T* _% k
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    " w' Q* S. r. \) Q- u$ |后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    8 d' |: G, T/ g" Y- W8 M& uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& C& M( o' F# x! l- I
    {
    % N5 u( r, x7 Z/ t, X        comp temp, xtimesy;

    + p+ \3 j) H1 y: j& f5 |这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    6 _, u% b9 @# e6 S5 ]内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?& o' ^6 q: P6 ]* I
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-19 21:39 , Processed in 0.079786 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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