设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?" C, x' d7 u! V

    1 w" i9 `! L  k& Q; B( p# d2 V2 T自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。% Q0 `, p. w; X1 ?; k
    1 U9 l0 C5 h$ [# a, r- n. D9 W- ]
    速度优化问题真的很有意思啊。
    - w2 h6 t# U- |( R% C# k" k( F8 U+ i/ \1 t
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 00:11
  • 签到天数: 1645 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?1 `0 T% J' W( v
    把代码贴上来看看?
    . {* i2 }0 q' ~' d' U% \$ X) E! g8 X- E7 |; w# z
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    * O; {, v  {  s8 ^0 G5 }  A
    数值分析 发表于 2022-9-24 23:04
      F+ I6 a, e8 B3 t' m) U拉下来?拉多少?, h( w% o( b3 x3 ^
    把代码贴上来看看?

    & E1 ?. R& X9 k1 [! p
    4 a7 F; G$ v% w' wvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 ^8 ^# ^! Z6 K' N! C% K$ o; v. Q: J
    {( v7 p0 J* r; _0 J+ z
            comp temp, xtimesy;# f$ z2 W; K1 f* ]
            xtimesy.re = 0;
    7 p- ^( U/ o7 j6 j        xtimesy.im = 0;
    . @9 T4 [% g7 K$ I9 U        int j0 = lenB - 1;) ?% w* `* N* z  h  ~% O
            int    i, j, i1, reali;
    , }( U4 j7 @  [% c/ e        if (lenA % 2 == 1)4 d8 r$ G* Q1 w& b* i" j
                    reali = lenA + 1;% D$ f% @9 b8 @
            else
    2 w7 p3 l# ^) S% N% I' S                reali = lenA;
    % ^* ^* A) H  u4 H/ y        reali /= 2;8 X9 E4 z! @, n9 a" m
    - s+ }/ U1 W; E5 m0 ]0 P" X
            int nconv = reali + lenB;" R1 f% W( c' o, M6 b/ f
            //#pragma omp parallel for/ V% ]9 }/ _; `8 T5 [8 d" F0 U) D
            for (i = reali; i < nconv; i++)$ j/ ?1 ?' ]) @9 D1 J' `
            {/ D3 ]+ P6 F+ s# T/ u- b, W
                    temp.re = 0;
    * N6 b& B+ N8 m' Y- l* b' o7 X$ S                temp.im = 0;2 r/ _1 u# x3 s4 |# X
                    i1 = i;9 B) W  g0 H& z5 R  R& e5 H) `
                    for (j = j0; j >= 0; j--)
    7 K' a$ n$ C" h                {/ h7 a& }' v8 O& |3 u
                            /* floating date operation */- a; Q8 e7 M( R/ B+ B  O
                    }
    9 V% A$ `+ |8 n9 U9 s! l% ]
            }& V; \! u2 c; R
    }* F% P/ d0 |  z6 G( G

    & D- A% D0 ^4 E; x! A* ^$ ixcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    - F8 [$ d& w  ]
    " ?" g! ^  H0 K' F1 v7 P; Z, f' G红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    5 F7 A2 b" ]6 F, M9 t" |现在call xcorr 100次,耗时78s.
    , J, d4 ?3 ~7 V0 V, U9 z# z2 n9 m; ~6 E9 z
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ' n5 \: @& l" W; \) i5 P) X  ?' S0 t+ L# ^
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ' n2 h8 y! x5 d  TMaybe Debug mode?
    6 e- u; S0 q% A) D! B& z4 V" I
    ! P& w& |7 c$ b
    不应该,看我上面的回复。0 t2 S1 l- M% e& i! T& d. e
    ' @2 l& m5 P2 @2 a( L( ]
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:11
  • 签到天数: 1645 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 5 q  }; t* d+ M1 [1 I
    雷达 发表于 2022-9-24 23:54* p# b8 L1 K8 Q; w2 e7 x
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB): @; r- F0 o3 z# t
    {% @: C7 S) p! j
            comp temp, xtimesy;
    ! s" h1 B7 f5 }  s2 q
    $ x. h  D8 K, M. m8 K
    这个不是这么比的吧。。。8 b; x' R3 p5 M& S
    7 d( d9 `/ X8 h( X9 |( I
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 Q8 t" Y$ o3 {5 z  l6 r+ ?* s0 P. `7 P$ [4 W
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    , @, l, J" N6 c. z) F
    数值分析 发表于 2022-9-25 00:20" D% m) ~' i& n. o: @- J6 n% k: x
    这个不是这么比的吧。。。) ~. @. O; @' h( S. C

    ' y/ G6 r  e/ E8 N+ k' i您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    % {$ P2 W" o# c! }6 X& r+ Q4 ~( W% w% H. `! y
    有道理。
    . ]; q/ u  M2 w- g" N所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ; Y6 m; c: a- a+ P  B! n9 W/ ]" h/ ~: h, Q* y
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46% @& @8 X7 v. p  `' L  U" ^
    有道理。( j/ ~, z5 J: }# B- R4 K
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    & L) M. x+ g, y# B! g9 Q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多7 S, u) {2 M5 A
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:205 }+ {) @7 K" w/ R' q  ]
    这个不是这么比的吧。。。
    . a0 o% ^3 Q$ w3 e* K# b7 R- `+ H6 O8 B& z) o
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ) d7 w* E9 f' G' D4 U

    7 O3 r; Z4 m5 r0 G* f' S8 r7 b现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:11
  • 签到天数: 1645 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    2 z7 h7 E6 M2 M/ b7 M: B
    沉宝 发表于 2022-9-25 01:48: q: S& o' O2 X
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    . {. s; Z2 I% \$ A  j( @
    - A+ t) b2 u# `" b$ i
    是的,兄台说的对。4 l( {% s' w4 }8 h& _4 @. V1 v/ t  Q
    2 ?. b! i1 L6 e0 m$ g! v  ~7 ~4 A
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。5 j7 `- Z3 r! i/ j7 ?

    - G& c5 |# C6 [( L& I雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。8 u" V. v, q8 ]7 E  M

      ]4 U, e9 a: k) U比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。2 l' o; X* ~2 C7 `
    $ D- @0 ]  A2 k9 l9 [
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 : m, s$ G8 L4 s/ d" ~$ {: ?. M* D3 m1 n
    沉宝 发表于 2022-9-25 01:27
    / t0 H$ a- F1 B% b" g. a- F! x你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    3 ^- H- Y6 \! a$ Z8 \
    4 K. b; C: d8 k1 V9 h( a* R# _
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。: t  ~. c5 g' `+ G) b" }

    0 X. I% h- H0 }3 g$ ]5 Z$ x2 \我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:478 c& P3 p! [: ^" u
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ! @# [) a  M" y, X' X* v9 H  E4 Z
    时间差一倍的结果可以接受。
    $ {! v* Q7 c4 |( Q- k
    ! T$ ~3 k9 Y3 T/ `9 ^3 i你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:11
  • 签到天数: 1645 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 : K" s, g' `! }! i& D5 p
    雷达 发表于 2022-9-25 04:47
    9 b/ {% O$ f! l& o' l" ~( @* t3 y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    . x& W% [, `7 a3 F
    0 v& f8 Q+ o) V& H) f

    + G8 k4 v' `9 v6 j5 J" l* e
    1 b( p8 E+ d  [9 |' q能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! S- R: S  Y4 L7 e  ^
    数值分析 发表于 2022-9-25 14:58
    0 |  N5 G! b2 C6 d" ~4 d能不能把这个也贴上来,看看和上一个有什么不同?

    6 Y5 B3 c0 v- j; m6 u理了理思路,重新做了一个测试。
    9 b6 Q& Q6 a6 [8 \/ |做了两个 vector 和 两个 float *, 都长 1000005 W+ Y& I. v2 P, k3 [! x
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    $ G# B3 z* B5 ]# s) V4 o1 X: M. b: T- v
    & Y* y7 g0 `' h- D5 j2 i内循环试了4种方法,
    ) i1 P6 F* J6 W' a1. 直接调用 vector inner_product 247s
    ; y1 Q, h9 G" C# Y2. vector 循环点乘累加 237s* ^$ ^1 b! R  @
    3. float * 循环点乘累加 204s
    4 D! r: Z. m# q( Q2 P5 V4. 空循环 100000 次 202s0 [4 z* P4 ~) B5 N8 B8 P
    . `" j9 O1 b, j, W' z# m
    不做内循环 200s" h4 d. x# D! C  }: m

    6 x" [) T$ L: ^你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    7 R- g2 f( w! C3 a另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    : `3 n  f: g! [0 E4 `9 x5 D, Q4 \$ ~  E! l9 r0 N
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    * @5 ~* A" `: b3 ]# W0 v% E$ W6 r; u9 V' g+ l
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    8 d$ s: t0 \# L7 g- O9 n7 D
    % ?6 r7 G- Z* }
            std::vector < float > vec1(N);
    6 [' a( I% n; D8 S4 E# k9 b& O" E        std::vector < float > vec2(N);" z* p8 i& z. J3 K# ?$ `- w9 D
            float* b1 = new float[N];# z5 J# `+ j" V; q* Y4 r
            float* b2 = new float[N];4 t5 {1 m& L. E
    2 L7 D# u4 |0 D/ }
            for (int j = 0; j < 6000; j++)
    ; O# q# r( {) W        {! B6 O" k( W4 v4 U
                    std::generate(vec1.begin(), vec1.end(), []() {" q, N$ d% i" m# }+ @+ D9 [
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    8 w) Q4 b2 I  k, N& W& f7 [: Y                        });; J+ F1 M. I4 K6 w
    . N4 e) t" m/ I: A# L& q
                    std::generate(vec2.begin(), vec2.end(), []() {* y7 t; O, F/ e, C! C' i
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ' w! ~- }% \& @$ [  l" c1 B8 C1 ^6 m                        });" ^+ g2 o0 T8 o- t8 i  \8 J

    1 h2 M9 `' w' n4 F5 P                for (size_t jj = 0; jj < vec1.size(); jj++)! F+ S6 q+ H# u$ U& I
                    {
    1 I0 a- v( A- o, q9 U/ S, U9 B$ V                        b1[jj] = vec1[jj];1 t8 i( F7 ?  \* n
                    }
    # Q' r! a6 }' o# {1 p' h
    ( \  m- ?3 Y" J6 H# R6 J' G) k                for (size_t jj = 0; jj < vec2.size(); jj++)
    # H/ B/ E: M! f                {
    : a* F3 I# e, E& |$ b/ a5 T                        b2[jj] = vec2[jj];
    $ {. g1 K1 ^3 Z, Q* o                }0 s7 X0 [$ E/ l
    ) x9 s+ A5 [# c: Z2 C' R
                    //Method - 1  N=100000 247s  6 `+ M) s$ k+ A. _2 X$ i
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    6 \' N3 M9 y( p& Q2 n) }                                2 }8 q$ h: f1 E! S, g- n5 F
                    //Method - 2  N=100000  237s
    ; ?3 c! S& X# m9 |9 V- _# v& o                /*& Q6 t: D1 s, F' |, p8 P
                    for (int jj = 0; jj < N ; jj++)  A* A2 U- `& b8 {
                    {7 q- g6 N! V7 t- ^0 u" X' _/ v
                            fresult += vec1[jj] * vec2[jj];' ^+ x1 G! M: W7 L: n2 u: ^
                    }/ X& x3 G( |* a7 t7 O4 Y
                    */
    / {, ^* X6 l, V3 A# V1 p                                
    ( b' {+ R9 N1 }) I                //Method - 3  N=100000 204s
    & Y% O5 [5 H5 [' ^2 p* y; e+ k                /** J* ?" e# i! F9 n. ]4 ?1 A0 Z
                    for (int jj = 0; jj < N; jj++), w0 n- g5 q6 n+ S5 n& Q
                    {
      ?" r& S& @! _' j( k                        fresult += b1[jj] * b2[jj];  V. g6 f9 J7 J1 R! c4 W3 v
                    }
    : o1 \/ t' x! S                */( |% W9 `, M8 N$ S( _
    4 K3 L! c" I, A2 z  E7 t: M
                    //Method - 4   202s
    7 @6 m$ u  a2 R                /*
    7 n9 x; ^8 d4 D; `2 A6 D  A                for (int jj = 0; jj < N; jj++)
    3 p; D: k; B1 j, o3 K2 L$ g                {
    - ]4 X0 i" j" N( r) Z8 `                        
    " h9 [# ^1 F. X+ G                }
    ; Z' y+ s$ C6 y                */
    9 h- C) H5 h0 i  K5 V2 D4 O' C                //comment out all methods, N=100000  202s               
    # `6 a" ^- X1 `        }
    ) y2 {, C9 M. a1 t/ I4 i/ N7 ^! ^
            delete []b1;
    $ N. B+ @0 r4 p5 H9 j- S$ }* w. Z        delete []b2;
    0 F- t1 u+ D4 P
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 i$ v' W6 t7 w5 Z( f
    " q" t8 A; A3 m6 U4 F, ]
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?& z* `8 }7 @* @# Z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    5 {" z+ v2 R" h瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 y9 s2 Q1 H& ^/ Y7 K
    . \* `$ y4 E8 E; s, ^你第二个试验里面的j在循环里面又重新定义 ...
    " M1 o$ F: \6 c$ G/ B
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL" S0 s5 M' ]; e

    5 q" _- k0 a1 |不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    3 \( Q7 L  w9 w' R$ C2 T4 G内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    - V" b0 a) z& s3 u8 d$ {) O, E, [0 x
    * k- G0 H1 y7 L1 c+ ^9 r8 w* T不和它 ...

    " ?$ Z2 t# b* ?$ {( a. k
    7 {" [. M# K4 X' e8 v, t不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。- w% `  v7 Q. y# c9 m# e
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    9 _( f/ ~) |$ L# mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      W/ Z( P0 D+ K- K- g" g; o2 X{/ s( V/ u9 \0 B, c
            comp temp, xtimesy;

    2 h/ ?" J8 L2 X7 ^这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。; i$ m7 }3 Q6 w* c4 [6 |$ ]2 W5 ]
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?& N# E- A$ b9 C
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-5-4 03:22 , Processed in 0.056326 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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