设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    / I: n0 E! O' \9 \( H5 ^$ j, C  @$ g, ^5 G+ R8 r+ q( ~
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。; x/ @* V" ^. B4 S- [! J, j
    , S+ q( r  j9 f
    速度优化问题真的很有意思啊。6 c% _. @0 s, Y* ~* k

    , l8 i- z: q( T/ d- k, A  ]欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    : K! O3 B+ S) d  B% D4 J$ Y$ \% g# }把代码贴上来看看?' H, G7 I3 j/ i$ _" C2 D, @! A; A
    + r& x6 g1 L5 j/ X6 U: O# l9 P
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [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 编辑 / v' R' F) B1 s2 g3 a3 H
    数值分析 发表于 2022-9-24 23:045 r' m' O( t* }* ^3 m
    拉下来?拉多少?
    " {) C+ G/ W- m2 C" J% H把代码贴上来看看?

    + w, Q+ @, l% C; D2 x9 a
    0 S# }, A3 U7 H: p/ V# N% {void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 ~7 _0 y  }4 f) K. }4 l/ v
    {$ U' @) C' b% ~1 e+ N7 Z, d
            comp temp, xtimesy;
    0 b  W+ u9 r5 N6 X  W% b9 o        xtimesy.re = 0;
    ' J, w" G1 o; n$ \        xtimesy.im = 0;
    5 t1 R  B: H7 q" R2 d        int j0 = lenB - 1;, _; r' |4 ]# q7 d
            int    i, j, i1, reali;
    + ^$ S& e$ d6 s! s: G  z& Y0 S5 C        if (lenA % 2 == 1), ~1 H- [' R4 i& N* e1 @' i% e
                    reali = lenA + 1;! W$ E: q3 I7 l4 Y% J( v
            else. k3 c4 e, y/ Q6 {5 L) p1 ^  n
                    reali = lenA;3 s$ {* ^3 X% J& r; L# L
            reali /= 2;' R& [4 X* S# N8 @) ]
    * k+ z  e. p) L+ `
            int nconv = reali + lenB;# i; G% ~; B0 X, |' a  y; P
            //#pragma omp parallel for
    ) ?) u. g  c7 {; O        for (i = reali; i < nconv; i++)7 A  U# a9 B* v6 n. ]8 B7 ?
            {
    3 a+ E' M/ A) t& R( Y                temp.re = 0;& G* N' Z7 P8 B
                    temp.im = 0;
    : ?* C0 w9 n5 a9 C* m                i1 = i;* h4 d2 ~; E! y% ]8 {; T
                    for (j = j0; j >= 0; j--)" ?# p5 i7 Y+ _7 x& m
                    {
    9 N, }5 l+ G. X5 c9 n" H                        /* floating date operation */
    9 L5 b" B9 v8 ^! _( B( }; r  Z                }
    8 L! A3 U8 K4 }7 q' l
            }; C: ?, t, d1 e7 Z: a- m
    }/ |. P6 E0 @* V, M

    ) z3 N% M) I" C) y0 ?4 |2 kxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    % O! k; M: s  Y+ z4 m4 m
    & j3 {" k: A( G+ }* k红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    , |" Z4 z1 }3 ^9 N9 q1 s现在call xcorr 100次,耗时78s.7 m$ L9 m2 a0 s3 }, c- x2 X! V6 Z
    0 k% |2 |, V* L7 d" E- q
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    / y9 x5 x! Y. X% a/ f+ u  Y& x
    - _4 z5 r* u4 F9 ]% x& ^% j. ~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    $ E& y# O5 R6 z1 ~$ b2 l3 l: C8 ]Maybe Debug mode?

    ! o5 Y0 m/ h, _) @2 U/ ?& }5 ]
    5 x3 b2 `. b6 d+ i2 X8 K& R; S% K& O不应该,看我上面的回复。
    1 z" B. Z5 \$ Z6 O9 e# G7 ?  d' G9 \
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 + _" e% v) s+ x) z, W
    雷达 发表于 2022-9-24 23:54
    8 @# M9 W6 n7 Z6 Q# mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; J- l% s/ V% W1 y{: J6 c) f% h( a" i) t; @
            comp temp, xtimesy;

    6 T  ^% o7 i9 |0 H$ _* g8 f; ~2 o8 S; a
    这个不是这么比的吧。。。
    # _! {! x, }7 ]1 K8 B# d" H+ t  Z  q# _
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。7 @' Y( i' k9 ?* g6 \6 z

    9 o" t6 P% w( m而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 / |7 u' B0 R. h+ L
    数值分析 发表于 2022-9-25 00:20
    / @# s! e7 E9 I6 j6 Z, v这个不是这么比的吧。。。$ m" \  e1 Z- B# `7 G: @, m1 l' n

    , S1 s- }5 i5 `) b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ; X2 @# c  U4 g9 F

    ' N# q; Y/ n: e' W有道理。9 z- e; \9 E7 m' i4 R
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    2 @5 q8 V) f8 `2 Q" a0 v* n. H" L3 D5 i! o, y; X$ ^3 `
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    - |' Z$ Q  j' Y% c9 V9 a+ C# V有道理。
    8 Q" |" D  q# l- i  {" [所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ' @  u5 C/ b3 n6 n5 e8 H& J
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多& T6 Q& a7 _1 w3 c1 C
    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
    - V* U( P: R$ F: ?3 T) E6 j* i" \5 D$ A( K这个不是这么比的吧。。。; o6 \' u: ]9 @
    1 b7 ^1 t. H: z) \  d8 {
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    . x' {$ y) W& |: y) E7 K6 ?* Z  X# ?

    - M1 v6 q+ H; c0 t4 d( o& ?现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    . a2 L' Y, H' r/ H- I
    沉宝 发表于 2022-9-25 01:48
    / K! a7 M  p# Z" ^2 }现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    7 B! m4 t1 j: t
    % g) m1 c" L% T4 L2 O! X
    是的,兄台说的对。) V' q5 h" q; X2 C
    5 l, f) S" `# J; H5 w
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。# a& L( l# K8 U2 a1 T# Y6 c3 n6 K

    ) S( B5 U1 e9 z5 \雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ' ~: s# J9 @  W4 N, I: \) w
    - Z/ ^4 q  S6 I比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    4 Y: ]0 ^$ s& w5 ]" _8 j* z3 u5 U
    * g! a% V4 q7 O2 ~当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 6 s0 t( Y# z& M, p: Z& E
    沉宝 发表于 2022-9-25 01:273 {. }" c6 a- M9 O/ M
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

      H7 p) F' m6 C+ i2 [: E) U8 ?0 t; U" ^2 ]+ `+ x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。; z; w; R7 L4 Q7 O4 U
    * x1 ?6 I2 |  R) ]) {( l8 C
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    # [8 T7 R9 D- o9 I; \; M又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    : R4 ^% K/ ^3 g, }9 r& H7 _时间差一倍的结果可以接受。
    0 c) |, M. V8 w3 t1 U
    0 W3 u7 E+ C& Q- x1 l+ e2 @0 U, _你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ; I+ w/ G6 D1 d, {0 g+ h
    雷达 发表于 2022-9-25 04:47$ O- i- @* u& H3 V& x% W5 [6 F
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 I  d1 a! E5 I* k4 ~/ d8 p" A; N: T+ T+ G

    + ]% z9 S' c. {3 T
    0 B' Y5 t; W  G; S* Y: ]能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    $ x4 e% K" E; t6 {2 F
    数值分析 发表于 2022-9-25 14:58  ^4 R+ U* ^1 r& o% d
    能不能把这个也贴上来,看看和上一个有什么不同?
    % V3 Q( j. J  X7 X4 T& Z
    理了理思路,重新做了一个测试。
    % W# d' x& V+ Y7 N" @做了两个 vector 和 两个 float *, 都长 100000- v6 A  g* u4 T# @7 }5 G8 V
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache./ K6 }! p  g: u0 c  E& o& ?0 m
    9 c3 N+ V3 r$ r# \& e; D4 F
    内循环试了4种方法,8 e. Z; B/ V- x9 w! Q
    1. 直接调用 vector inner_product 247s , |5 m) X# E: Q
    2. vector 循环点乘累加 237s
    & L) p6 ^) z, s3. float * 循环点乘累加 204s
    9 K8 N4 k$ P& [+ }: n4. 空循环 100000 次 202s
    1 O. [3 i( \1 f) N" k0 j: w( @2 {- n# P
    不做内循环 200s
    ) J+ U7 t$ v: T$ g- X* R; k( \' X* d% y4 D1 O3 y
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。' X/ D  m5 v# f1 L7 k: S
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    . h) J* @( U% m: m% ^3 g8 f8 u4 r( i( x! i+ d; n6 t
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): S) M4 a4 K/ K( W2 ?1 L. I% Z

    5 W1 {( X) j3 x2 [" ](为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    0 l: \- t2 h3 }/ p5 T1 g9 {# N- `/ @$ m# `
            std::vector < float > vec1(N);
    0 N7 q0 Q# S3 Z8 n5 O3 ~# G        std::vector < float > vec2(N);: e# z) ?7 A# ]( g/ I2 N
            float* b1 = new float[N];' p/ x$ a) T5 w  f
            float* b2 = new float[N];! W, r" J! |, R: L

    $ Q. t2 {2 H* I7 v        for (int j = 0; j < 6000; j++)7 L: \" p9 q: `8 c- z6 i2 H7 f' m
            {7 z2 @3 `) M% U
                    std::generate(vec1.begin(), vec1.end(), []() {+ C$ K! a8 ?) {# n1 ?7 {. A
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    - ]* b7 N. X- }9 t                        });3 o; o/ z* ^  }% F  X& q! U
    & G$ C+ n+ J% e* v: d$ C# X
                    std::generate(vec2.begin(), vec2.end(), []() {$ u- x! C% ?8 I, ]
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    , @6 l: ]% N* g$ ]' O9 d/ y                        });& ^9 e) H. a1 {3 ^7 o
    8 G' y; p2 M# |' ~) t& m2 Q
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    2 X% w# {& |: g                {2 s1 `% h7 s+ x) @* a' A
                            b1[jj] = vec1[jj];
    . p. P' u. c2 U4 d$ c- V) x. f2 {                }
    2 c& ]2 G, t2 q. t7 Y1 D4 z6 |# J7 U6 O- v9 `/ V. z
                    for (size_t jj = 0; jj < vec2.size(); jj++)3 q" E: d/ y" u& D# S
                    {, Q4 Q; l# A. e. g% M, A( S2 p1 a* n
                            b2[jj] = vec2[jj];
    3 W, a+ v3 Q# P% U                }+ j4 p& A- h  f  U- }
    " X9 k' ?/ L$ I; y  L
                    //Method - 1  N=100000 247s  & d: t( I1 l$ V5 r
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    $ p, _- Y* k$ V" ]                                ! ^  y+ H! o: V% L
                    //Method - 2  N=100000  237s
    1 O# r" P; U& b$ [. B9 j                /*
    " ?3 q' \2 }5 e% J3 |; J  V                for (int jj = 0; jj < N ; jj++)
    - [& v2 w5 W% W" e; S' }' Z+ O                {( x( e, t. P# {  E/ ~: e
                            fresult += vec1[jj] * vec2[jj];
      F2 M+ Z0 b0 }; w, `9 ~5 D6 P                }3 K* n! l$ K& V8 ^
                    */
    : \! S- K  p) y: w1 T" b                                
    4 d' @5 J  |% i% `& y                //Method - 3  N=100000 204s
    ; @3 o1 l5 ^6 Q, I. ~9 W                /*
    4 U7 Y# q1 D: Z; Y, c                for (int jj = 0; jj < N; jj++)
    & |: Y% }' D7 }6 V3 `" h3 H/ P9 e                {
      }" C; \, M! M& O* e4 O                        fresult += b1[jj] * b2[jj];
    $ i5 }1 e( W1 h/ K3 `: b/ }1 l! {                }5 G' g2 ]0 ~+ ~. @
                    */
    & a/ X( I, I( ?1 K8 _/ M1 ~6 v; d. ]8 O1 ?2 q
                    //Method - 4   202s
    8 P4 g- s3 m7 _/ N* M                /*
    . R& f$ b  w! e' R& s7 x- D                for (int jj = 0; jj < N; jj++)- Q, I4 \" H! [+ f8 f
                    {
    9 u- L# p2 {! p9 I                        % H: S7 R% E; J! ~  r5 @* r8 ]
                    }" W. f* E: j" s; E! Z
                    */, @6 K4 x$ x# Y- H9 X. Q
                    //comment out all methods, N=100000  202s                4 h& u( }. F3 I4 [+ I4 O! b5 G
            }
    - v; I$ w2 U8 Z1 l$ Y, `( `
    + [; C1 X9 z. u  B' }        delete []b1;& I- i3 Q3 S5 l6 o& M8 k  d
            delete []b2;
    ) Z) ?, d; H- x7 [, P# {
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?: ?0 s3 G2 [( m- ?. e

    , v) y% d: r) a: V0 Z6 W5 L- e6 b$ M你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?" U- V& S* E* D
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ H& S. O4 e( B/ k瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 h% d% p5 d3 u6 Z$ ~7 T% ~' ~9 Q
    ( h6 v2 _5 N. V1 z你第二个试验里面的j在循环里面又重新定义 ...

    # N. I$ \9 ~. ]' J内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 H; T* l7 ?$ S' `. r7 B+ |. b- ^7 M( V$ K1 b* i; c
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ; D+ ?. q% j+ t& }4 {) ]- M内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL  T) Q  a4 U) W' s4 P5 h

    ! i' ^; J1 q: M9 T. w! m" p不和它 ...
    $ ^" [1 ~* e" C
    . R' B! L- F( ]; `& Z
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。5 V2 a; Q4 T9 D8 w
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    5 ^$ L: S5 J1 @1 }0 z- a0 pvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 `. @+ W6 ]  C6 T6 d9 W9 U{7 c5 C7 n  |5 i7 k, a6 y* ]. s
            comp temp, xtimesy;
    2 M" o) j( f9 x- `! j
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    : K5 B6 _5 \. G8 C1 @内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?) T7 T3 A0 ?% L$ ?2 Q
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-14 21:41 , Processed in 0.043069 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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